Changeset: d1f487ba8d56 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d1f487ba8d56
Modified Files:
        monetdb5/modules/mal/remote.c
Branch: Jul2015
Log Message:

Dynamically allocate memory.
Do not use BUFSIZ.  It is evil!


diffs (79 lines):

diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -871,9 +871,9 @@ str RMTregister(Client cntxt, MalBlkPtr 
  */
 str RMTexec(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
        str conn, mod, func, tmp;
-       int i, len;
+       int i, len, buflen;
        connection c= NULL;
-       char qbuf[BUFSIZ+1];    /* FIXME: make this dynamic */
+       char *qbuf;
        MapiHdl mhdl;
 
        (void)cntxt;
@@ -901,38 +901,56 @@ str RMTexec(Client cntxt, MalBlkPtr mb, 
        /* this call should be a single transaction over the channel*/
        MT_lock_set(&c->lock, "remote.exec");
 
+       assert(pci->argc - pci->retc >= 3); /* conn, mod, func, ... */
+
+       len = 0;
+       /* count how big a buffer we need */
+       len += 2 * (pci->retc > 1);
+       for (i = 0; i < pci->retc; i++) {
+               len += 2 * (i > 0);
+               len += strlen(*getArgReference_str(stk, pci, i));
+       }
+       len += strlen(mod) + strlen(func) + 6;
+       for (i = 3; i < pci->argc - pci->retc; i++) {
+               len += 2 * (i > 3);
+               len += strlen(*getArgReference_str(stk, pci, pci->retc + i));
+       }
+       len += 2;
+       buflen = len + 1;
+       if ((qbuf = GDKmalloc(buflen)) == NULL)
+               throw(MAL, "remote.exec", MAL_MALLOC_FAIL);
+
        len = 0;
 
-       /* use previous defined remote objects to keep result */
        if (pci->retc > 1)
                qbuf[len++] = '(';
        for (i = 0; i < pci->retc; i++)
-               len += snprintf(&qbuf[len], BUFSIZ - len, "%s%s",
+               len += snprintf(&qbuf[len], buflen - len, "%s%s",
                                (i > 0 ? ", " : ""), *getArgReference_str(stk, 
pci, i));
 
-       if (pci->retc > 1 && len < BUFSIZ)
+       if (pci->retc > 1)
                qbuf[len++] = ')';
 
        /* build the function invocation string in qbuf */
-       len += snprintf(&qbuf[len], BUFSIZ - len, " := %s.%s(", mod, func);
+       len += snprintf(&qbuf[len], buflen - len, " := %s.%s(", mod, func);
 
        /* handle the arguments to the function */
-       assert(pci->argc - pci->retc >= 3); /* conn, mod, func, ... */
 
        /* put the arguments one by one, and dynamically build the
         * invocation string */
        for (i = 3; i < pci->argc - pci->retc; i++) {
-               len += snprintf(&qbuf[len], BUFSIZ - len, "%s%s",
+               len += snprintf(&qbuf[len], buflen - len, "%s%s",
                                (i > 3 ? ", " : ""),
                                *(getArgReference_str(stk, pci, pci->retc + 
i)));
        }
 
        /* finish end execute the invocation string */
-       len += snprintf(&qbuf[len], BUFSIZ - len, ");");
+       len += snprintf(&qbuf[len], buflen - len, ");");
 #ifdef _DEBUG_REMOTE
        mnstr_printf(cntxt->fdout,"#remote.exec:%s:%s\n",c->name,qbuf);
 #endif
        tmp = RMTquery(&mhdl, "remote.exec", c->mconn, qbuf);
+       GDKfree(qbuf);
        if (mhdl)
                mapi_close_handle(mhdl);
        MT_lock_unset(&c->lock, "remote.exec");
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to