Changeset: 23ad124df741 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=23ad124df741
Modified Files:
        tools/merovingian/utils/control.c
Branch: Jul2012
Log Message:

control_send: fix socket/stream resource leaks (Coverity)


diffs (222 lines):

diff --git a/tools/merovingian/utils/control.c 
b/tools/merovingian/utils/control.c
--- a/tools/merovingian/utils/control.c
+++ b/tools/merovingian/utils/control.c
@@ -75,6 +75,7 @@ char* control_send(
                strncpy(server.sun_path, host, sizeof(server.sun_path) - 1);
                if (connect(sock, (SOCKPTR) &server, sizeof(struct 
sockaddr_un))) {
                        snprintf(sbuf, sizeof(sbuf), "cannot connect: %s", 
strerror(errno));
+                       close(sock);
                        return(strdup(sbuf));
                }
        } else {
@@ -93,6 +94,7 @@ char* control_send(
                if (hp == NULL) {
                        snprintf(sbuf, sizeof(sbuf), "cannot lookup hostname: 
%s",
                                        hstrerror(h_errno));
+                       close(sock);
                        return(strdup(sbuf));
                }
                memset(&server, 0, sizeof(struct sockaddr_in));
@@ -101,6 +103,7 @@ char* control_send(
                server.sin_port = htons((unsigned short) (port & 0xFFFF));
                if (connect(sock, (SOCKPTR) &server, sizeof(struct 
sockaddr_in)) < 0) {
                        snprintf(sbuf, sizeof(sbuf), "cannot connect: %s", 
strerror(errno));
+                       close(sock);
                        return(strdup(sbuf));
                }
 
@@ -111,6 +114,7 @@ char* control_send(
                /* perform login ritual */
                if (len <= 0) {
                        snprintf(sbuf, sizeof(sbuf), "no response from 
monetdbd");
+                       close(sock);
                        return(strdup(sbuf));
                }
                /* we only understand merovingian:1 and :2 (backwards compat
@@ -140,6 +144,7 @@ char* control_send(
                                snprintf(sbuf, sizeof(sbuf), "cannot connect: "
                                                "unsupported monetdbd server");
                        }
+                       close(sock);
                        return(strdup(sbuf));
                }
 
@@ -177,6 +182,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p++ = '\0'; /* servertype */
@@ -184,6 +191,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p++ = '\0'; /* protover */
@@ -191,6 +200,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p++ = '\0'; /* algos */
@@ -199,6 +210,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p++ = '\0'; /* endian */
@@ -206,6 +219,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p++ = '\0'; /* hash */
@@ -214,6 +229,8 @@ char* control_send(
                                if (p == NULL) {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "invalid challenge from 
monetdbd server");
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                                *p = '\0';
@@ -237,6 +254,8 @@ char* control_send(
                                } else {
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "monetdbd server 
requires unknown hash: %s", shash);
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
 
@@ -261,6 +280,8 @@ char* control_send(
                                        /* the server doesn't support what we 
can */
                                        snprintf(sbuf, sizeof(sbuf), "cannot 
connect: "
                                                        "unsupported hash 
algoritms: %s", algos);
+                                       close_stream(fdout);
+                                       close_stream(fdin);
                                        return(strdup(sbuf));
                                }
                        }
@@ -276,8 +297,10 @@ char* control_send(
                        }
                        sbuf[strlen(sbuf) - 1] = '\0';
                } else {
-                       if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0)
+                       if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0) {
+                               close(sock);
                                return(strdup("no response from monetdbd after 
login"));
+                       }
                        sbuf[len - 1] = '\0';
                }
 
@@ -285,6 +308,12 @@ char* control_send(
                        buf = sbuf;
                        if (*buf == '!')
                                buf++;
+                       if (fdin != NULL) {
+                               close_stream(fdout);
+                               close_stream(fdin);
+                       } else {
+                               close(sock);
+                       }
                        return(strdup(buf));
                }
        }
@@ -301,8 +330,15 @@ char* control_send(
                size_t bufpos = 0;
                char *bufp;
                bufp = buf = malloc(sizeof(char) * buflen);
-               if (buf == NULL)
+               if (buf == NULL) {
+                       if (fdin != NULL) {
+                               close_stream(fdin);
+                               close_stream(fdout);
+                       } else {
+                               close(sock);
+                       }
                        return(strdup("failed to allocate memory"));
+               }
                while (1) {
                        if (fdin != NULL) {
                                /* stream.h is sooo broken :( */
@@ -320,14 +356,27 @@ char* control_send(
                                bufp = realloc(buf, sizeof(char) * buflen);
                                if (bufp == NULL) {
                                        free(buf);
+                                       if (fdin != NULL) {
+                                               close_stream(fdin);
+                                               close_stream(fdout);
+                                       } else {
+                                               close(sock);
+                                       }
                                        return(strdup("failed to allocate more 
memory"));
                                }
                                buf = bufp;
                        }
                        bufpos += (size_t)len;
                }
-               if (bufpos == 0)
+               if (bufpos == 0) {
+                       if (fdin != NULL) {
+                               close_stream(fdin);
+                               close_stream(fdout);
+                       } else {
+                               close(sock);
+                       }
                        return(strdup("incomplete response from monetdbd"));
+               }
                buf[bufpos - 1] = '\0';
 
                if (fdin) {
@@ -339,23 +388,29 @@ char* control_send(
                *ret = buf;
        } else {
                if (fdin != NULL) {
-                       if (mnstr_read_block(fdin, sbuf, sizeof(sbuf) - 1, 1) < 
0)
+                       if (mnstr_read_block(fdin, sbuf, sizeof(sbuf) - 1, 1) < 
0) {
+                               close_stream(fdin);
+                               close_stream(fdout);
                                return(strdup("incomplete response from 
monetdbd"));
+                       }
                        sbuf[strlen(sbuf) - 1] = '\0';
                        *ret = strdup(sbuf + 1);
                } else {
-                       if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0)
+                       if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0) {
+                               close(sock);
                                return(strdup("incomplete response from 
monetdbd"));
+                       }
                        sbuf[len - 1] = '\0';
                        *ret = strdup(sbuf);
                }
        }
 
-       if (fdout != NULL)
+       if (fdin != NULL) {
+               close_stream(fdin);
                close_stream(fdout);
-       if (fdin != NULL)
-               close_stream(fdin);
-       close(sock);
+       } else {
+               close(sock);
+       }
 
        return(NULL);
 }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to