Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0abb60c1 authored by Jes Sorensen's avatar Jes Sorensen Committed by Greg Kroah-Hartman
Browse files

staging: unisys: visorchannel_write(): Handle partial channel_header writes

parent 36203e71
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -213,13 +213,16 @@ int
visorchannel_write(struct visorchannel *channel, ulong offset,
visorchannel_write(struct visorchannel *channel, ulong offset,
		   void *local, ulong nbytes)
		   void *local, ulong nbytes)
{
{
	size_t size = sizeof(struct channel_header);
	size_t chdr_size = sizeof(struct channel_header);
	size_t copy_size;


	if (offset + nbytes > channel->memregion.nbytes)
	if (offset + nbytes > channel->memregion.nbytes)
		return -EIO;
		return -EIO;


	if (!offset && nbytes >= size)
	if (offset < chdr_size) {
		memcpy(&channel->chan_hdr, local, size);
		copy_size = min(chdr_size, nbytes) - offset;
		memcpy(&channel->chan_hdr + offset, local, copy_size);
	}


	memcpy_toio(channel->memregion.mapped + offset, local, nbytes);
	memcpy_toio(channel->memregion.mapped + offset, local, nbytes);