Package: nbd-client
Version: 1:3.2-2
Severity: normal
Tags: patch
Dear Maintainer,
When trying to connect to a new-style nbd server without
specfying an export name (which is required), the client issues
a cryptic message, and quits:
nasc0:root ~ 134 # nbd-client nass0 10809 /dev/nbd0
Negotiation: .Error: Not enough cliserv_magic
Exiting.
The problem is, that, given an export name, nbd-client assumes
it is connecting to a new-style server. Without an export name,
it assumes it has an old-style server. In both cases, the magic
number does not match if the assumption was incorrect, resulting
in a cryptic error message.
I am attaching a patch relative to
902c07e75f12459c55d79f450a0fb9c1e7da02e5 that fixes the problem.
The patch reverses the checks: first the magic is checked to
determine the kind of server, then either the availability of
an export name is checked for new-style servers (and the client
complains if there is none), or nothing special is done for
old-style servers.
For old-style servers, this patch assumes a 'compatibility mode',
accepting the export name, but not using it. An alternative would
be for nbd-client to fail, complaining that an old-style server
does not support named exports. E.g.:
+ if (name) {
+ fprintf(stderr, "\nE: Export names not supported by
server\n");
+ exit(EXIT_FAILURE);
+ }
Kind regards,
Rogier
----------------------------------------
diff --git a/nbd-client.c b/nbd-client.c
index 1445621..0ac0587 100644
--- a/nbd-client.c
+++ b/nbd-client.c
@@ -235,12 +235,15 @@ void negotiate(int sock, u64 *rsize64, u32 *flags, char*
name, uint32_t needed_f
if (read(sock, &magic, sizeof(magic)) < 0)
err("Failed/2: %m");
magic = ntohll(magic);
- if(name) {
+ if(magic == opts_magic) {
uint32_t opt;
uint32_t namesize;
- if (magic != opts_magic)
- err("Not enough opts_magic");
+ if (!name) {
+ fprintf(stderr, "\nE: Server uses named exports -
export name is required\n");
+ exit(EXIT_FAILURE);
+ }
+
printf(".");
if(read(sock, &tmp, sizeof(uint16_t)) < 0) {
err("Failed reading flags: %m");
@@ -277,10 +280,10 @@ void negotiate(int sock, u64 *rsize64, u32 *flags, char*
name, uint32_t needed_f
err("Failed/2.4: %m");
if (write(sock, name, strlen(name)) < 0)
err("Failed/2.4: %m");
- } else {
- if (magic != cliserv_magic)
- err("Not enough cliserv_magic");
+ } else if (magic == cliserv_magic) {
printf(".");
+ } else {
+ err("No opts_magic or cliserv_magic");
}
if (read(sock, &size64, sizeof(size64)) <= 0) {
----------------------------------------
-- 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-client depends on:
ii debconf [debconf-2.0] 1.5.46
ii initscripts 2.88dsf-34
ii libc6 2.13-37
nbd-client recommends no packages.
nbd-client suggests no packages.
-- debconf information excluded
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]