[Libguestfs] [libnbd PATCH 1/7] states: Log structured error messages, if any

Eric Blake eblake at redhat.com
Fri Jun 14 21:53:57 UTC 2019


This increases the size of struct nbd_handle from about 700 bytes to
instead being just under 5k; that's not too bad of a cost, and future
patches will reuse same storage for logging any error messages during
handshake.
---
 generator/states-reply-structured.c | 10 +++++++---
 lib/internal.h                      |  1 +
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/generator/states-reply-structured.c b/generator/states-reply-structured.c
index 399f5e2..694c282 100644
--- a/generator/states-reply-structured.c
+++ b/generator/states-reply-structured.c
@@ -156,14 +156,14 @@
   case 0:
     length = be32toh (h->sbuf.sr.structured_reply.length);
     msglen = be16toh (h->sbuf.sr.payload.error.len);
-    if (msglen > length - sizeof h->sbuf.sr.payload.error) {
+    if (msglen > length - sizeof h->sbuf.sr.payload.error ||
+        msglen > sizeof h->sbuf.sr.err_msg) {
       SET_NEXT_STATE (%.DEAD);
       set_error (0, "error message length too large");
       return -1;
     }

-    /* We skip the human readable error for now. XXX */
-    h->rbuf = NULL;
+    h->rbuf = h->sbuf.sr.err_msg;
     h->rlen = msglen;
     SET_NEXT_STATE (%RECV_ERROR_MESSAGE);
   }
@@ -182,6 +182,10 @@

     length -= sizeof h->sbuf.sr.payload.error - msglen;

+    if (msglen)
+      debug (h, "structured error server message: %.*s", (int) msglen,
+             h->sbuf.sr.err_msg);
+
     /* Special case two specific errors; ignore the tail for all others */
     h->rbuf = NULL;
     h->rlen = length;
diff --git a/lib/internal.h b/lib/internal.h
index f5b1f95..6750938 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -138,6 +138,7 @@ struct nbd_handle {
         struct nbd_structured_reply_offset_hole offset_hole;
         struct nbd_structured_reply_error error;
       } payload;
+      char err_msg[NBD_MAX_STRING];
     }  __attribute__((packed)) sr;
     uint32_t cflags;
     uint32_t len;
-- 
2.20.1




More information about the Libguestfs mailing list