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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list