From: Jes Sorensen Date: Tue, 5 May 2015 22:36:55 +0000 (-0400) Subject: staging: unisys: visorchannel_read(): Use memcpy_fromio() directly X-Git-Tag: firefly_0821_release~176^2~1545^2~783 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=36203e71a0604baa547a6706b5e70ee2830a2407;p=firefly-linux-kernel-4.4.55.git staging: unisys: visorchannel_read(): Use memcpy_fromio() directly Note, this changes the behavior of visorchannel_read(). The old code would return the channel header, if the offset argument was 0, and the caller tried to read beyond the size of the visorchannel. Note this only worked for offset == 0, but not for (offset > 0) && (offset < header_size), which was inconsistent. The new implementation returns an error if someone tries to read beyond the visorchannel size. Signed-off-by: Jes Sorensen Signed-off-by: Benjamin Romer Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c index bf75aa075b74..cae62fedab79 100644 --- a/drivers/staging/unisys/visorbus/visorchannel.c +++ b/drivers/staging/unisys/visorbus/visorchannel.c @@ -200,13 +200,12 @@ int visorchannel_read(struct visorchannel *channel, ulong offset, void *local, ulong nbytes) { - int rc; - size_t size = sizeof(struct channel_header); + if (offset + nbytes > channel->memregion.nbytes) + return -EIO; - rc = visor_memregion_read(&channel->memregion, offset, local, nbytes); - if (rc && !offset && (nbytes >= size)) - memcpy(&channel->chan_hdr, local, size); - return rc; + memcpy_fromio(local, channel->memregion.mapped + offset, nbytes); + + return 0; } EXPORT_SYMBOL_GPL(visorchannel_read);