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