Hi, Le jeudi 29 janvier 2015 à 12:18 -0700, Jason Gunthorpe a écrit : > On Thu, Jan 29, 2015 at 07:43:29PM +0100, Yann Droneaud wrote: > > > The write() syscall must return the size buffer passed to it, or > > less, but in such case it would ask for trouble as userspace would > > be allowed to write() the remaining bytes. Returning a size bigger > > than the one passed to write() is not acceptable and would break any > > expectation. > > By that logic the 0 return is still wrong, and it should be ucore->in_len > This is handled by ib_uverbs_write() in drivers/infiniband/core/uverbs_main.c: 709 if (err) 710 return err; 711 712 return written_count; > But I think we can return less without risking anything breaking, it > already violates the invariant associated with write() - it mutates > the buffer passed in! > I don't think so, as only the response buffer is written to and the response buffer pointer is provided in the buffer given to write(). AFAIK, no uverbs ever change the content of the input buffer (eg. the request): I've managed to declare the various input buffers "const" so it would surprising to find it use for writing to userspace. Anyway, I recognize that uverb way of abusing write() syscall is borderline (at best) regarding other Linux subsystems and Unix paradigm in general. But it's not enough to screw it more. Regards. -- Yann Droneaud OPTEYA -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html