Changeset: 54f8971c15da for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54f8971c15da
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_group.c
        gdk/gdk_join.c
        gdk/gdk_logger.c
        gdk/gdk_unique.c
        gdk/gdk_utils.c
        monetdb5/mal/mal_import.c
        monetdb5/modules/mal/wlc.c
        monetdb5/modules/mal/wlc.h
        sql/backends/monet5/wlr.c
        sql/jdbc/tests/JdbcClient_create_tables.sql
        sql/jdbc/tests/JdbcClient_inserts_selects.sql
        sql/jdbc/tests/Tests/Test_JdbcClient.stable.out
        sql/test/BugDay_2005-10-06_2.9.3/Tests/not_null.SF-933194.stable.out
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/type_dump_test.SF-989257.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.sql
        
sql/test/BugTracker-2019/Tests/remote-table-non-existent-column.Bug-6750.py
Branch: default
Log Message:

Merge with Apr2019 branch


diffs (truncated from 879 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2358,6 +2358,7 @@ BATassertProps(BAT *b)
                        const char *nme = BBP_physical(b->batCacheid);
                        Hash *hs = NULL;
                        BUN mask;
+                       int len;
 
                        if ((hs = GDKzalloc(sizeof(Hash))) == NULL) {
                                fprintf(stderr,
@@ -2365,8 +2366,14 @@ BATassertProps(BAT *b)
                                        "hash table\n");
                                goto abort_check;
                        }
-                       snprintf(hs->heap.filename, sizeof(hs->heap.filename),
-                                "%s.hash%d", nme, THRgettid());
+                       len = snprintf(hs->heap.filename, 
sizeof(hs->heap.filename), "%s.hash%d", nme, THRgettid());
+                       if (len == -1 || len > (int) sizeof(hs->heap.filename)) 
{
+                               GDKfree(hs);
+                               fprintf(stderr,
+                                       "#BATassertProps: heap filename "
+                                       "is too large\n");
+                               goto abort_check;
+                       }
                        if (ATOMsize(b->ttype) == 1)
                                mask = (BUN) 1 << 8;
                        else if (ATOMsize(b->ttype) == 2)
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1148,6 +1148,7 @@ BATkeyed(BAT *b)
                        const char *nme;
                        BUN prb;
                        BUN mask;
+                       int len;
 
                        GDKclrerr(); /* not interested in BAThash errors */
                        nme = BBP_physical(b->batCacheid);
@@ -1162,9 +1163,10 @@ BATkeyed(BAT *b)
                                if (mask < ((BUN) 1 << 16))
                                        mask = (BUN) 1 << 16;
                        }
-                       if ((hs = GDKzalloc(sizeof(Hash))) == NULL ||
-                           snprintf(hs->heap.filename, 
sizeof(hs->heap.filename),
-                                    "%s.hash%d", nme, THRgettid()) < 0 ||
+                       if ((hs = GDKzalloc(sizeof(Hash))) == NULL)
+                               goto doreturn;
+                       len = snprintf(hs->heap.filename, 
sizeof(hs->heap.filename), "%s.hash%d", nme, THRgettid());
+                       if (len == -1 || len >= (int) sizeof(hs->heap.filename) 
||
                            HASHnew(hs, b->ttype, BUNlast(b), mask, BUN_NONE) 
!= GDK_SUCCEED) {
                                GDKfree(hs);
                                /* err on the side of caution: not keyed */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1152,7 +1152,9 @@ BBPreadEntries(FILE *fp, unsigned bbpver
                        options = buf + nread + 1;
 
                if ((s = strchr(headname, '~')) != NULL && s == headname) {
-                       snprintf(logical, sizeof(logical), "tmp_%o", (unsigned) 
bid);
+                       int len = snprintf(logical, sizeof(logical), "tmp_%o", 
(unsigned) bid);
+                       if (len == -1 || len >= (int) sizeof(logical))
+                               GDKfatal("BBPinit: BBP logical filename 
directory is too large\n");
                } else {
                        if (s)
                                *s = 0;
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -1035,7 +1035,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                bool gc = g != NULL && (BATordered(g) || BATordered_rev(g));
                const char *nme;
                BUN prb;
-               int bits;
+               int bits, len;
                BUN mask;
                oid grp;
 
@@ -1063,11 +1063,15 @@ BATgroup_internal(BAT **groups, BAT **ex
                 * which power of two */
                bits = 8 * SIZEOF_OID - pop(mask - 1);
                if ((hs = GDKzalloc(sizeof(Hash))) == NULL ||
-                   (hs->heap.farmid = BBPselectfarm(TRANSIENT, b->ttype, 
hashheap)) < 0 ||
-                   snprintf(hs->heap.filename, sizeof(hs->heap.filename),
-                            "%s.hash%d", nme, THRgettid()) < 0 ||
-                   HASHnew(hs, b->ttype, BUNlast(b),
-                           mask, BUN_NONE) != GDK_SUCCEED) {
+                   (hs->heap.farmid = BBPselectfarm(TRANSIENT, b->ttype, 
hashheap)) < 0) {
+                       GDKfree(hs);
+                       hs = NULL;
+                       GDKerror("BATgroup: cannot allocate hash table\n");
+                       goto error;
+               }
+               len = snprintf(hs->heap.filename, sizeof(hs->heap.filename), 
"%s.hash%d", nme, THRgettid());
+               if (len < 0 || len >= (int) sizeof(hs->heap.filename) ||
+                   HASHnew(hs, b->ttype, BUNlast(b), mask, BUN_NONE) != 
GDK_SUCCEED) {
                        GDKfree(hs);
                        hs = NULL;
                        GDKerror("BATgroup: cannot allocate hash table\n");
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2545,12 +2545,15 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                        hsh = r->thash;
                        sr = NULL;
                } else {
+                       int len;
                        char ext[32];
                        assert(!phash);
                        ALGODEBUG fprintf(stderr, "#hashjoin(%s): creating "
                                          "hash for candidate list\n",
                                          BATgetId(r));
-                       snprintf(ext, sizeof(ext), "thash%x", sr->batCacheid);
+                       len = snprintf(ext, sizeof(ext), "thash%x", 
sr->batCacheid);
+                       if (len == -1 || len >= (int) sizeof(ext))
+                               goto bailout;
                        if ((hsh = BAThash_impl(r, sr, ext)) == NULL) {
                                goto bailout;
                        }
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1043,6 +1043,7 @@ tr_commit(logger *lg, trans *tr)
 static gdk_return
 logger_open(logger *lg)
 {
+       int len;
        char id[BUFSIZ];
        char *filename;
 
@@ -1050,8 +1051,15 @@ logger_open(logger *lg)
                lg->end = 0;
                return GDK_SUCCEED;
        }
-       snprintf(id, sizeof(id), LLFMT, lg->id);
-       filename = GDKfilepath(BBPselectfarm(PERSISTENT, 0, offheap), lg->dir, 
LOGFILE, id);
+       len = snprintf(id, sizeof(id), LLFMT, lg->id);
+       if (len == -1 || len >= BUFSIZ) {
+               fprintf(stderr, "!ERROR: logger_open: filename is too large\n");
+               return GDK_FAIL;
+       }
+       if (!(filename = GDKfilepath(BBPselectfarm(PERSISTENT, 0, offheap), 
lg->dir, LOGFILE, id))) {
+               fprintf(stderr, "!ERROR: logger_open: allocation failure\n");
+               return GDK_FAIL;
+       }
 
        lg->log = open_wstream(filename);
        if (lg->log) {
@@ -1435,13 +1443,18 @@ bm_tids(BAT *b, BAT *d)
 static gdk_return
 logger_switch_bat(BAT *old, BAT *new, const char *fn, const char *name)
 {
+       int len;
        char bak[BUFSIZ];
 
        if (BATmode(old, true) != GDK_SUCCEED) {
                GDKerror("Logger_new: cannot convert old %s to transient", 
name);
                return GDK_FAIL;
        }
-       snprintf(bak, sizeof(bak), "tmp_%o", (unsigned) old->batCacheid);
+       len = snprintf(bak, sizeof(bak), "tmp_%o", (unsigned) old->batCacheid);
+       if (len == -1 || len >= BUFSIZ) {
+               GDKerror("Logger_new: filename is too large");
+               return GDK_FAIL;
+       }
        if (BBPrename(old->batCacheid, bak) != 0) {
                return GDK_FAIL;
        }
@@ -1656,7 +1669,12 @@ logger_load(int debug, const char *fn, c
        if (!lg->inmemory) {
                if ((filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL)) 
== NULL)
                        goto error;
-               snprintf(filename, FILENAME_MAX, "%s", filenamestr);
+               len = snprintf(filename, FILENAME_MAX, "%s", filenamestr);
+               if (len == -1 || len >= FILENAME_MAX) {
+                       GDKfree(filenamestr);
+                       GDKerror("Logger filename path is too large\n");
+                       goto error;
+               }
                len = snprintf(bak, sizeof(bak), "%s.bak", filename);
                GDKfree(filenamestr);
                if (len == -1 || len >= FILENAME_MAX) {
@@ -2386,6 +2404,7 @@ logger_load(int debug, const char *fn, c
 static logger *
 logger_new(int debug, const char *fn, const char *logdir, int version, 
preversionfix_fptr prefuncp, postversionfix_fptr postfuncp)
 {
+       int len;
        logger *lg;
        char filename[FILENAME_MAX];
 
@@ -2416,8 +2435,12 @@ logger_new(int debug, const char *fn, co
        lg->convert_date = false;
 #endif
 
-       snprintf(filename, sizeof(filename), "%s%c%s%c",
-                logdir, DIR_SEP, fn, DIR_SEP);
+       len = snprintf(filename, sizeof(filename), "%s%c%s%c", logdir, DIR_SEP, 
fn, DIR_SEP);
+       if (len == -1 || len >= FILENAME_MAX) {
+               fprintf(stderr, "!ERROR: logger_new: filename is too large\n");
+               GDKfree(lg);
+               return NULL;
+       }
        lg->fn = GDKstrdup(fn);
        lg->dir = GDKstrdup(filename);
        lg->bufsize = 64*1024;
@@ -2600,7 +2623,11 @@ logger_exit(logger *lg)
 
                /* atomic action, switch to new log, keep old for
                 * later cleanup actions */
-               snprintf(ext, sizeof(ext), "bak-" LLFMT, lg->id);
+               len = snprintf(ext, sizeof(ext), "bak-" LLFMT, lg->id);
+               if (len == -1 || len >= FILENAME_MAX) {
+                       fprintf(stderr, "!ERROR: logger_exit: new logger 
filename path is too large\n");
+                       return GDK_FAIL;
+               }
 
                if (GDKmove(farmid, lg->dir, LOGFILE, "bak", lg->dir, LOGFILE, 
ext) != GDK_SUCCEED) {
                        fprintf(stderr, "!ERROR: logger_exit: rename %s.bak to 
%s.%s failed\n",
@@ -2633,15 +2660,19 @@ logger_restart(logger *lg)
 gdk_return
 logger_cleanup(logger *lg)
 {
+       int farmid, len;
        char buf[BUFSIZ];
        FILE *fp = NULL;
-       int farmid;
 
        if (lg->inmemory)
                return GDK_SUCCEED;
 
        farmid = BBPselectfarm(PERSISTENT, 0, offheap);
-       snprintf(buf, sizeof(buf), "%s%s.bak-" LLFMT, lg->dir, LOGFILE, lg->id);
+       len = snprintf(buf, sizeof(buf), "%s%s.bak-" LLFMT, lg->dir, LOGFILE, 
lg->id);
+       if (len == -1 || len >= BUFSIZ) {
+               fprintf(stderr, "#logger_cleanup: filename is too large\n");
+               return GDK_FAIL;
+       }
 
        if (lg->debug & 1) {
                fprintf(stderr, "#logger_cleanup %s\n", buf);
@@ -2658,7 +2689,11 @@ logger_cleanup(logger *lg)
        while (lid-- > 0) {
                char log_id[FILENAME_MAX];
 
-               snprintf(log_id, sizeof(log_id), LLFMT, lid);
+               len = snprintf(log_id, sizeof(log_id), LLFMT, lid);
+               if (len == -1 || len >= FILENAME_MAX) {
+                       fprintf(stderr, "#logger_cleanup: log_id filename is 
too large\n");
+                       return GDK_FAIL;
+               }
                if (GDKunlink(farmid, lg->dir, LOGFILE, log_id) != GDK_SUCCEED) 
{
                        /* not a disaster (yet?) if unlink fails */
                        fprintf(stderr, "#logger_cleanup: failed to remove old 
WAL %s.%s\n", LOGFILE, buf);
@@ -2667,7 +2702,11 @@ logger_cleanup(logger *lg)
        }
        fclose(fp);
 
-       snprintf(buf, sizeof(buf), "bak-" LLFMT, lg->id);
+       len = snprintf(buf, sizeof(buf), "bak-" LLFMT, lg->id);
+       if (len == -1 || len >= BUFSIZ) {
+               fprintf(stderr, "#logger_cleanup: filename is too large\n");
+               GDKclrerr();
+       }
 
        if (GDKunlink(farmid, lg->dir, LOGFILE, buf) != GDK_SUCCEED) {
                /* not a disaster (yet?) if unlink fails */
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -291,6 +291,7 @@ BATunique(BAT *b, BAT *s)
                BUN prb;
                BUN p;
                BUN mask;
+               int len;
 
                GDKclrerr();    /* not interested in BAThash errors */
                ALGODEBUG fprintf(stderr, "#BATunique(b=" ALGOBATFMT ",s="
@@ -311,10 +312,13 @@ BATunique(BAT *b, BAT *s)
                        if (mask < ((BUN) 1 << 16))
                                mask = (BUN) 1 << 16;
                }
-               if ((hs = GDKzalloc(sizeof(Hash))) == NULL ||
-                   snprintf(hs->heap.filename, sizeof(hs->heap.filename),
-                            "%s.hash%d", nme, THRgettid()) < 0 ||
-                   HASHnew(hs, b->ttype, BUNlast(b), mask, BUN_NONE) != 
GDK_SUCCEED) {
+               if ((hs = GDKzalloc(sizeof(Hash))) == NULL) {
+                       GDKerror("BATunique: cannot allocate hash table\n");
+                       goto bunins_failed;
+               }
+               len = snprintf(hs->heap.filename, sizeof(hs->heap.filename), 
"%s.hash%d", nme, THRgettid());
+               if (len == -1 || len >= (int) sizeof(hs->heap.filename) ||
+                       HASHnew(hs, b->ttype, BUNlast(b), mask, BUN_NONE) != 
GDK_SUCCEED) {
                        GDKfree(hs);
                        hs = NULL;
                        GDKerror("BATunique: cannot allocate hash table\n");
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1393,6 +1393,7 @@ THRcreate(void (*f) (void *), void *arg,
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to