On 8/29/19 10:08 PM, Eric Blake wrote: > Similar to the previous patch in caching size, we want to avoid > calling into the plugin more than once per connection on any of the > flag determination callbacks. >
> +++ b/server/protocol-handshake.c > @@ -51,87 +51,72 @@ protocol_compute_eflags (struct connection *conn, > uint16_t *flags) > { > uint16_t eflags = NBD_FLAG_HAS_FLAGS; > int fl; > + bool can_write = true; > > fl = backend_can_write (backend, conn); > if (fl == -1) > return -1; > if (readonly || !fl) { > eflags |= NBD_FLAG_READ_ONLY; > - conn->readonly = true; > + can_write = false; The old code set conn->readonly=false if either the command line -r was present or if the backend failed .can_write... > +++ b/server/protocol.c > @@ -64,14 +64,19 @@ validate_request (struct connection *conn, > uint16_t cmd, uint16_t flags, uint64_t offset, uint32_t > count, > uint32_t *error) > { > + int r; > + > /* Readonly connection? */ > - if (conn->readonly && > - (cmd == NBD_CMD_WRITE || cmd == NBD_CMD_TRIM || > - cmd == NBD_CMD_WRITE_ZEROES)) { > - nbdkit_error ("invalid request: %s: write request on readonly > connection", > - name_of_nbd_cmd (cmd)); > - *error = EROFS; > - return false; > + if (cmd == NBD_CMD_WRITE || cmd == NBD_CMD_TRIM || > + cmd == NBD_CMD_WRITE_ZEROES) { > + r = backend_can_write (backend, conn); ...but the new code is only checking if the backend supports .can_write (if the backend says yes, then this permits a broken client to write in spite of the -r command line flag). I'll fix that. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs