Changeset: e58514df3b82 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e58514df3b82
Modified Files:
        common/stream/stream.c
Branch: Aug2011
Log Message:

Fix compilation error.
Some more sophistated compilers complained about
error: not protecting local variables: variable length buffer
Fix this by not using alloca here.


diffs (63 lines):

diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -1854,12 +1854,17 @@
        struct icstream *ic = (struct icstream *) s->stream_data.p;
        ICONV_CONST char *inbuf = (ICONV_CONST char *) buf;
        size_t inbytesleft = elmsize * cnt;
+       char *bf = NULL;
 
        /* if unconverted data from a previous call remains, add it to
           the start of the new data, using temporary space */
        if (ic->buflen > 0) {
-               char *bf = alloca(ic->buflen + inbytesleft);
-
+               bf = malloc(ic->buflen + inbytesleft);
+               if (bf == NULL) {
+                       /* cannot allocate memory */
+                       s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               }
                memcpy(bf, ic->buffer, ic->buflen);
                memcpy(bf + ic->buflen, buf, inbytesleft);
                buf = bf;
@@ -1875,6 +1880,8 @@
                        case EILSEQ:
                                /* invalid multibyte sequence encountered */
                                s->errnr = MNSTR_WRITE_ERROR;
+                               if (bf)
+                                       free(bf);
                                return -1;
                        case EINVAL:
                                /* incomplete multibyte sequence encountered */
@@ -1885,10 +1892,14 @@
                                if (inbytesleft > sizeof(ic->buffer)) {
                                        /* ridiculously long multibyte 
sequence, so return error */
                                        s->errnr = MNSTR_WRITE_ERROR;
+                                       if (bf)
+                                               free(bf);
                                        return -1;
                                }
                                memcpy(ic->buffer, inbuf, inbytesleft);
                                ic->buflen = inbytesleft;
+                               if (bf)
+                                       free(bf);
                                return (ssize_t) cnt;
                        case E2BIG:
                                /* not enough space in output buffer */
@@ -1896,11 +1907,15 @@
                        default:
                                /* cannot happen (according to manual) */
                                s->errnr = MNSTR_WRITE_ERROR;
+                               if (bf)
+                                       free(bf);
                                return -1;
                        }
                }
                mnstr_write(ic->s, ic->buffer, 1, sizeof(ic->buffer) - 
outbytesleft);
        }
+       if (bf)
+               free(bf);
        return (ssize_t) cnt;
 }
 
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to