Be more careful on command exit.
authorAndre Noll <maan@systemlinux.org>
Mon, 21 Jan 2008 08:24:16 +0000 (09:24 +0100)
committerAndre Noll <maan@systemlinux.org>
Mon, 21 Jan 2008 08:24:16 +0000 (09:24 +0100)
If the callback returned zero, there's nothing to do.
If it returned positive, we have to send out the result
buffer and must free it afterwards. Sending the buffer may
well lead to an error condition, so always check the return
value of the corresponding call to send_buffer(). Finally,
it the command handler returned a negative value, we have
to send an error message to the client which might give rise
to another error (if sending the errror message failed). In this
case, ignore the send errror and return the previous error value.

aft.c
attribute.c
blob.c

diff --git a/aft.c b/aft.c
index d843692934df671684d383ba4ec59996659ef75e..001026db4e956caa8b46256797d29cddced6ddf5 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -2004,11 +2004,14 @@ int com_touch(int fd, int argc, char * const * const argv)
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, argc - i,
                argv + i, com_touch_callback, &result);
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, argc - i,
                argv + i, com_touch_callback, &result);
-       if (ret > 0) {
-               send_buffer(fd, (char *)result.data);
-               free(result.data);
-       } else if (ret < 0)
+       if (!ret)
+               return 0;
+       if (ret < 0) {
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
+               return ret;
+       }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }
 
@@ -2116,11 +2119,14 @@ int com_rm(int fd, int argc,  char * const * const argv)
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, argc - i, argv + i,
                com_rm_callback, &result);
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, argc - i, argv + i,
                com_rm_callback, &result);
-       if (ret > 0) {
-               send_buffer(fd, (char *)result.data);
-               free(result.data);
-       } else if (ret < 0)
+       if (!ret)
+               return 0;
+       if (ret < 0) {
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
+               return ret;
+       }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }
 
@@ -2277,11 +2283,14 @@ int com_cpsi(int fd, int argc,  char * const * const argv)
                flags = ~(unsigned)CPSI_FLAG_VERBOSE | flags;
        ret = send_option_arg_callback_request(&options, argc - i, argv + i,
                com_cpsi_callback, &result);
                flags = ~(unsigned)CPSI_FLAG_VERBOSE | flags;
        ret = send_option_arg_callback_request(&options, argc - i, argv + i,
                com_cpsi_callback, &result);
-       if (ret > 0) {
-               send_buffer(fd, (char *)result.data);
-               free(result.data);
-       } else
+       if (!ret)
+               return 0;
+       if (ret < 0) {
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
+               return ret;
+       }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }
 
index 03a832fbd5b7f0905192676b69ce918de49849a4..c4bc0bcaa167d1fca0e302bbdd9331d8add5337c 100644 (file)
@@ -202,13 +202,17 @@ int com_lsatt(int fd, int argc, char * const * const argv)
        }
        ret = send_option_arg_callback_request(&options, argc - i, argv + i,
                com_lsatt_callback, &result);
        }
        ret = send_option_arg_callback_request(&options, argc - i, argv + i,
                com_lsatt_callback, &result);
-       if (ret > 0) {
-               ret = send_buffer(fd, (char *)result.data);
-               free(result.data);
-       } else if (ret < 0)
+       if (!ret) {
+               if (argc > 1)
+                       ret = send_va_buffer(fd, "no matches\n");
+               return ret;
+       }
+       if (ret < 0) {
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
-       else if (argc > 1)
-               send_va_buffer(fd, "no matches\n");
+               return ret;
+       }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }
 
@@ -482,11 +486,14 @@ int com_rmatt(int fd, int argc, char * const * const argv)
                return -E_ATTR_SYNTAX;
        ret = send_standard_callback_request(argc - 1, argv + 1, com_rmatt_callback,
                &result);
                return -E_ATTR_SYNTAX;
        ret = send_standard_callback_request(argc - 1, argv + 1, com_rmatt_callback,
                &result);
-       if (ret > 0) {
-               send_buffer(fd, (char *)result.data);
-               free(result.data);
-       } else
+       if (!ret)
+               return 0;
+       if (ret < 0) {
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
                send_va_buffer(fd, "%s\n", para_strerror(-ret));
+               return ret;
+       }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }
 
diff --git a/blob.c b/blob.c
index 33f75dcf7e2a078a10e803e0d05d8ada32ba72bd..c42a5f7ad6d91bc8889aa7b3d570a356a90560e3 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -146,10 +146,14 @@ static int com_lsblob(callback_function *f, int fd, int argc, char * const * con
 //             return -E_BLOB_SYNTAX;
        ret = send_option_arg_callback_request(&options, argc - i,
                argv + i, f, &result);
 //             return -E_BLOB_SYNTAX;
        ret = send_option_arg_callback_request(&options, argc - i,
                argv + i, f, &result);
-       if (ret > 0) {
-               send_buffer(fd, (char *)result.data);
-               free(result.data);
+       if (!ret)
+               return 0;
+       if (ret < 0) {
+               send_va_buffer(fd, "%s\n", para_strerror(-ret));
+               return ret;
        }
        }
+       ret = send_buffer(fd, (char *)result.data);
+       free(result.data);
        return ret;
 }
 
        return ret;
 }