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

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to