Package: nbd-server
Version: 1:3.2-2
Severity: important
Tags: patch

Dear Maintainer,

When a client requests an export list from the server,
the latter issues the message 'Error: negotiation failed'.
This is rather confusing, as the only 'problem' is (AFAICT)
that the negotiation phase did everything.

On a subsequent attempt to connect a block device, the server
fails altogether:
Client output:
        --------------------
        nasc0:root ~ 216 # /tmp/nbd-client.master -l nass0
        Negotiation: ..
        nasc0-nbd0
        nasc0:root ~ 217 # /tmp/nbd-client.master nass0 -N nasc0-nbd0 /dev/nbd0
        Negotiation: ..size = 856941734MBError: Exported device is too big for 
me. Get 64-bit machine :-(

        Exiting.
        --------------------
Server output:
        --------------------
        nass0:root ~ 135 # /tmp/nbd-server.master -d -C /etc/nbd-server/config
        Error: negotiation failed
        Exiting.
        Error: Read failed: Connection reset by peer
        Exiting.
        --------------------
From a tcpdump, it can be observed that the syslog messages end up
on the client socket, which makes the client choke, naturally. 

I tested this for the latest git version, and the same problem
occurs. I have traced the problem to the fact that negotiate(),
in two locations, closes the socket, and returns NULL , after which
serveloop also closes it, actually closing the syslog socket instead.
The next accept() returns that same filedescriptor, which syslog()
still thinks it owns.

I'm attaching a patch against git revision
902c07e75f12459c55d79f450a0fb9c1e7da02e5, which improves the error
reporting, and fixes the failure for the connect after the LIST.

Note: I added the message 'Session terminated by client', because
the 'ABORT' might also be intended to be used as an irregular
end-of-session (in the future?), besides indicating a regular
end-of-session after a LIST.

Kind regards,

Rogier.

--------------------------------------------
diff --git a/nbd-server.c b/nbd-server.c
index 69ee2a4..e905281 100644
--- a/nbd-server.c
+++ b/nbd-server.c
@@ -1532,13 +1532,18 @@ static CLIENT* handle_export_name(uint32_t opt, int 
net, GArray* servers, uint32
        char* name;
        int i;
 
-       if (read(net, &namelen, sizeof(namelen)) < 0)
+       if (read(net, &namelen, sizeof(namelen)) < 0) {
                err("Negotiation failed/7: %m");
+               return NULL;
+       }
        namelen = ntohl(namelen);
        name = malloc(namelen+1);
        name[namelen]=0;
-       if (read(net, name, namelen) < 0)
+       if (read(net, name, namelen) < 0) {
                err("Negotiation failed/8: %m");
+               free(name);
+               return NULL;
+       }
        for(i=0; i<servers->len; i++) {
                SERVER* serve = &(g_array_index(servers, SERVER, i));
                if(!strcmp(serve->servename, name)) {
@@ -1553,6 +1558,7 @@ static CLIENT* handle_export_name(uint32_t opt, int net, 
GArray* servers, uint32
                        return client;
                }
        }
+       err("Negotiation failed/8a: Requested export not found");
        free(name);
        return NULL;
 }
@@ -1639,7 +1645,7 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* 
servers, int phase) {
                                err_nonfatal("Negotiation failed/5: %m");
                        magic = ntohll(magic);
                        if(magic != opts_magic) {
-                               close(net);
+                               err_nonfatal("Negotiation failed/5a: magic 
mismatch");
                                return NULL;
                        }
                        if (read(net, &opt, sizeof(opt)) < 0)
@@ -1664,7 +1670,7 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* 
servers, int phase) {
                        }
                } while((opt != NBD_OPT_EXPORT_NAME) && (opt != NBD_OPT_ABORT));
                if(opt == NBD_OPT_ABORT) {
-                       close(net);
+                       err_nonfatal("Session terminated by client");
                        return NULL;
                }
        }
@@ -2305,7 +2311,6 @@ void serveloop(GArray* servers) {
                                }
                                client = negotiate(net, NULL, servers, NEG_INIT 
| NEG_MODERN);
                                if(!client) {
-                                       err_nonfatal("negotiation failed");
                                        close(net);
                                        continue;
                                }
--------------------------------------------

-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages nbd-server depends on:
ii  adduser                3.113+nmu3
ii  debconf [debconf-2.0]  1.5.46
ii  libc6                  2.13-37
ii  libglib2.0-0           2.33.12+really2.32.4-3
ii  ucf                    3.0025+nmu3

nbd-server recommends no packages.

nbd-server suggests no packages.

-- debconf information excluded


--
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to