Invalid error code when using multipathd CLI
authorHannes Reinecke <hare@suse.de>
Tue, 28 Feb 2017 16:23:01 +0000 (17:23 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Thu, 16 Mar 2017 06:58:40 +0000 (07:58 +0100)
When calling the multipathd CLI we're getting the message

error -1 receiving packet

instead of the actual error number.
Problem is a confusion about the return values between
libmpathcmd and uxsock.c.
uxsock.c is assuming a negative return value to be the errno,
but libmpathcmd is returning -1 on error and setting errno.

Signed-off-by: Hannes Reinecke <hare@suse.com>
libmpathcmd/mpath_cmd.c
libmultipath/uxsock.c

index 856e6b4..1496b68 100644 (file)
@@ -141,7 +141,11 @@ int mpath_recv_reply(int fd, char **reply, unsigned int timeout)
        *reply = NULL;
        len = mpath_recv_reply_len(fd, timeout);
        if (len <= 0)
+               return len;
+       if (len > MAX_REPLY_LEN) {
+               errno = EINVAL;
                return -1;
+       }
        *reply = malloc(len);
        if (!*reply)
                return -1;
index 492f4b9..7e5a144 100644 (file)
@@ -88,7 +88,9 @@ int ux_socket_listen(const char *name)
  */
 int send_packet(int fd, const char *buf)
 {
-       return mpath_send_cmd(fd, buf);
+       if (mpath_send_cmd(fd, buf) < 0)
+               return -errno;
+       return 0;
 }
 
 static int _recv_packet(int fd, char **buf, unsigned int timeout, ssize_t limit)
@@ -98,8 +100,10 @@ static int _recv_packet(int fd, char **buf, unsigned int timeout, ssize_t limit)
 
        *buf = NULL;
        len = mpath_recv_reply_len(fd, timeout);
-       if (len <= 0)
+       if (len == 0)
                return len;
+       if (len < 0)
+               return -errno;
        if ((limit > 0) && (len > limit))
                return -EINVAL;
        (*buf) = MALLOC(len);
@@ -109,6 +113,7 @@ static int _recv_packet(int fd, char **buf, unsigned int timeout, ssize_t limit)
        if (err != 0) {
                FREE(*buf);
                (*buf) = NULL;
+               return -errno;
        }
        return err;
 }