Changeset: c96a047855e1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c96a047855e1
Modified Files:
        tools/merovingian/daemon/proxy.c
Branch: Aug2011
Log Message:

startProxy: don't use alloca


diffs (83 lines):

diff --git a/tools/merovingian/daemon/proxy.c b/tools/merovingian/daemon/proxy.c
--- a/tools/merovingian/daemon/proxy.c
+++ b/tools/merovingian/daemon/proxy.c
@@ -116,9 +116,7 @@ startProxy(int psock, stream *cfdin, str
 
        /* quick 'n' dirty parsing */
        if (strncmp(url, "mapi:monetdb://", sizeof("mapi:monetdb://") - 1) == 
0) {
-               conn = alloca(sizeof(char) * (strlen(url) + 1));
-               memcpy(conn, url, strlen(url) + 1);
-               conn += sizeof("mapi:monetdb://") - 1;
+               conn = strdup(url + sizeof("mapi:monetdb://") - 1);
                /* drop anything off after the hostname */
                if ((port = strchr(conn, ':')) != NULL) {
                        *port = '\0';
@@ -128,6 +126,7 @@ startProxy(int psock, stream *cfdin, str
                } else if (stat(conn, &statbuf) != -1) {
                        ssock = 0;
                } else {
+                       free(conn);
                        return(newErr("can't find a port in redirect, "
                                                "or is not a UNIX socket file: 
%s", url));
                }
@@ -150,8 +149,10 @@ startProxy(int psock, stream *cfdin, str
                memset(&server, 0, sizeof(struct sockaddr_un));
                server.sun_family = AF_UNIX;
                strncpy(server.sun_path, conn, sizeof(server.sun_path) - 1);
-               if (connect(ssock, (SOCKPTR) &server, sizeof(struct 
sockaddr_un)))
+               if (connect(ssock, (SOCKPTR) &server, sizeof(struct 
sockaddr_un))) {
+                       free(conn);
                        return(newErr("cannot connect: %s", strerror(errno)));
+               }
 
                /* send first byte, nothing special to happen */
                msg.msg_name = NULL;
@@ -189,12 +190,16 @@ startProxy(int psock, stream *cfdin, str
                close(psock);
                close_stream(cfdin);
                close_stream(cfout);
+               free(conn);
                return(NO_ERR);
        } else {
                hp = gethostbyname(conn);
-               if (hp == NULL)
-                       return(newErr("cannot get address for hostname '%s': 
%s",
-                                               conn, strerror(errno)));
+               if (hp == NULL) {
+                       err x = newErr("cannot get address for hostname '%s': 
%s",
+                                               conn, strerror(errno));
+                       free(conn);
+                       return(x);
+               }
 
                memset(&server, 0, sizeof(server));
                memcpy(&server.sin_addr, hp->h_addr_list[0], hp->h_length);
@@ -204,12 +209,17 @@ startProxy(int psock, stream *cfdin, str
                servsize = sizeof(server);
 
                ssock = socket(serv->sa_family, SOCK_STREAM, IPPROTO_TCP);
-               if (ssock == INVALID_SOCKET)
+               if (ssock == INVALID_SOCKET) {
+                       free(conn);
                        return(newErr("cannot open socket: %s", 
strerror(errno)));
+               }
 
-               if (connect(ssock, serv, servsize) < 0)
+               if (connect(ssock, serv, servsize) < 0) {
+                       free(conn);
                        return(newErr("cannot connect: %s", strerror(errno)));
+               }
        }
+       free(conn);
 
        sfdin = block_stream(socket_rastream(ssock, "merovingian<-server (proxy 
read)"));
        sfout = block_stream(socket_wastream(ssock, "merovingian->server (proxy 
write)"));
@@ -276,7 +286,7 @@ static err
 handleMySQLClient(int sock)
 {
        stream *fdin, *fout;
-       str buf = alloca(sizeof(char) * 8096);
+       str buf[8096];
        str p;
        int len;
 
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to