Changeset: f228f1284751 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f228f1284751
Modified Files:
clients/mapiclient/ReadlineTools.c
clients/mapiclient/dotmonetdb.c
gdk/gdk_bbp.c
gdk/gdk_logger.c
monetdb5/extras/rapi/rapi.c
monetdb5/mal/mal_linker.c
monetdb5/mal/mal_profiler.c
monetdb5/modules/mal/bbp.c
monetdb5/modules/mal/tokenizer.c
monetdb5/modules/mal/wlc.c
sql/backends/monet5/wlr.c
tools/mserver/mserver5.c
tools/mserver/shutdowntest.c
Branch: Apr2019
Log Message:
Merge with Aug2018 branch.
diffs (truncated from 655 to 300 lines):
diff --git a/clients/mapiclient/ReadlineTools.c
b/clients/mapiclient/ReadlineTools.c
--- a/clients/mapiclient/ReadlineTools.c
+++ b/clients/mapiclient/ReadlineTools.c
@@ -321,18 +321,25 @@ init_readline(Mapi mid, char *lang, int
}
if (save_history) {
+ int len;
#ifndef NATIVE_WIN32
if (getenv("HOME") != NULL) {
- snprintf(_history_file, FILENAME_MAX,
+ len = snprintf(_history_file, FILENAME_MAX,
"%s/.mapiclient_history_%s",
getenv("HOME"), language);
- _save_history = 1;
+ if (len == -1 || len >= FILENAME_MAX)
+ fprintf(stderr, "Warning: history filename path
is too large\n");
+ else
+ _save_history = 1;
}
#else
- snprintf(_history_file, FILENAME_MAX,
+ len = snprintf(_history_file, FILENAME_MAX,
"%s%c_mapiclient_history_%s",
mo_find_option(NULL, 0, "prefix"), DIR_SEP, language);
- _save_history = 1;
+ if (len == -1 || len >= FILENAME_MAX)
+ fprintf(stderr, "Warning: history filename path is too
large\n");
+ else
+ _save_history = 1;
#endif
if (_save_history) {
FILE *f;
diff --git a/clients/mapiclient/dotmonetdb.c b/clients/mapiclient/dotmonetdb.c
--- a/clients/mapiclient/dotmonetdb.c
+++ b/clients/mapiclient/dotmonetdb.c
@@ -15,18 +15,22 @@ parse_dotmonetdb(char **user, char **pas
{
char *cfile;
FILE *config = NULL;
- char buf[1024];
+ char buf[FILENAME_MAX];
if ((cfile = getenv("DOTMONETDBFILE")) == NULL) {
/* no environment variable: use a default */
if ((config = fopen(".monetdb", "r")) == NULL) {
if ((cfile = getenv("HOME")) != NULL) {
- snprintf(buf, sizeof(buf), "%s%c.monetdb",
cfile, DIR_SEP);
- config = fopen(buf, "r");
- if (config)
- cfile = strdup(buf);
- else
+ int len = snprintf(buf, sizeof(buf),
"%s%c.monetdb", cfile, DIR_SEP);
+ if (len == -1 || len >= FILENAME_MAX) {
cfile = NULL;
+ } else {
+ config = fopen(buf, "r");
+ if (config)
+ cfile = strdup(buf);
+ else
+ cfile = NULL;
+ }
}
} else {
cfile = strdup(".monetdb");
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -521,6 +521,7 @@ fixfloatbats(void)
char filename[FILENAME_MAX];
FILE *fp;
size_t len;
+ int written;
for (bid = 1; bid < (bat) ATOMIC_GET(BBPsize, BBPsizeLock); bid++) {
if ((b = BBP_desc(bid)) == NULL) {
@@ -535,10 +536,13 @@ fixfloatbats(void)
* logger that it also needs to do a
* conversion. That is done by creating a
* file here based on the name of this BAT. */
- snprintf(filename, sizeof(filename),
+ written = snprintf(filename, sizeof(filename),
"%s/%.*s_nil-nan-convert",
BBPfarms[0].dirname,
(int) (len - 12), BBP_logical(bid));
+ if (written == -1 || written >= FILENAME_MAX)
+ GDKfatal("fixfloatbats: cannot create file %s
has a very large pathname\n",
+ filename);
fp = fopen(filename, "w");
if (fp == NULL)
GDKfatal("fixfloatbats: cannot create file
%s\n",
@@ -1658,7 +1662,7 @@ BBPinsert(BAT *bn)
bool lock = locked_by == 0 || locked_by != pid;
char dirname[24];
bat i;
- int idx = threadmask(pid);
+ int idx = threadmask(pid), len = 0;
/* critical section: get a new BBP entry */
if (lock) {
@@ -1724,7 +1728,9 @@ BBPinsert(BAT *bn)
#endif
if (*BBP_bak(i) == 0)
- snprintf(BBP_bak(i), sizeof(BBP_bak(i)), "tmp_%o", (unsigned)
i);
+ len = snprintf(BBP_bak(i), sizeof(BBP_bak(i)), "tmp_%o",
(unsigned) i);
+ if (len == -1 || len >= FILENAME_MAX)
+ return 0;
BBP_logical(i) = BBP_bak(i);
/* Keep the physical location around forever */
@@ -1732,11 +1738,13 @@ BBPinsert(BAT *bn)
BBPgetsubdir(dirname, i);
if (*dirname) /* i.e., i >= 0100 */
- snprintf(BBP_physical(i), sizeof(BBP_physical(i)),
+ len = snprintf(BBP_physical(i), sizeof(BBP_physical(i)),
"%s%c%o", dirname, DIR_SEP, (unsigned) i);
else
- snprintf(BBP_physical(i), sizeof(BBP_physical(i)),
+ len = snprintf(BBP_physical(i), sizeof(BBP_physical(i)),
"%o", (unsigned) i);
+ if (len == -1 || len >= FILENAME_MAX)
+ return 0;
BATDEBUG fprintf(stderr, "#%d = new %s(%s)\n", (int) i,
BBPname(i), ATOMname(bn->ttype));
}
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -434,12 +434,24 @@ log_read_updates(logger *lg, trans *tr,
tt = TYPE_void;
}
break;
+ } else if (tr->changes[i].type == LOG_USE &&
strcmp(tr->changes[i].name, name) == 0) {
+ log_bid bid = (log_bid) tr->changes[i].nr;
+ BAT *b = BATdescriptor(bid);
+
+ if (b) {
+ ht = TYPE_void;
+ tt = b->ttype;
+ }
+ break;
}
}
assert(i < tr->nr); /* found one */
}
assert((ht == TYPE_void && l->flag == LOG_INSERT) ||
((ht == TYPE_oid || !ht) && l->flag == LOG_UPDATE));
+ if ((ht != TYPE_void && l->flag == LOG_INSERT) ||
+ ((ht != TYPE_void && ht != TYPE_oid) && l->flag == LOG_UPDATE))
+ return LOG_ERR;
if (ht >= 0 && tt >= 0) {
BAT *uid = NULL;
BAT *r;
@@ -1207,6 +1219,7 @@ logger_readlogs(logger *lg, FILE *fp, ch
{
gdk_return res = GDK_SUCCEED;
char id[BUFSIZ];
+ int len;
if (lg->debug & 1) {
fprintf(stderr, "#logger_readlogs logger id is " LLFMT "\n",
lg->id);
@@ -1225,7 +1238,9 @@ logger_readlogs(logger *lg, FILE *fp, ch
lg->id = lid;
while (res == GDK_SUCCEED && !filemissing) {
- snprintf(log_filename, sizeof(log_filename),
"%s." LLFMT, filename, lg->id);
+ len = snprintf(log_filename,
sizeof(log_filename), "%s." LLFMT, filename, lg->id);
+ if (len == -1 || len >= FILENAME_MAX)
+ GDKerror("Logger filename path is too
large\n");
res = logger_readlog(lg, log_filename,
&filemissing);
if (!filemissing)
lg->id++;
@@ -1233,7 +1248,9 @@ logger_readlogs(logger *lg, FILE *fp, ch
} else {
bool filemissing = false;
while (lid >= lg->id && res == GDK_SUCCEED) {
- snprintf(log_filename, sizeof(log_filename),
"%s." LLFMT, filename, lg->id);
+ len = snprintf(log_filename,
sizeof(log_filename), "%s." LLFMT, filename, lg->id);
+ if (len == -1 || len >= FILENAME_MAX)
+ GDKerror("Logger filename path is too
large\n");
res = logger_readlog(lg, log_filename,
&filemissing);
/* Increment the id only at the end,
* since we want to re-read the last
@@ -1530,6 +1547,7 @@ bm_subcommit(logger *lg, BAT *list_bid,
static gdk_return
logger_load(int debug, const char *fn, char filename[FILENAME_MAX], logger *lg)
{
+ int len;
FILE *fp = NULL;
char bak[FILENAME_MAX];
str filenamestr = NULL;
@@ -1542,8 +1560,12 @@ logger_load(int debug, const char *fn, c
if(!(filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL)))
goto error;
snprintf(filename, FILENAME_MAX, "%s", filenamestr);
- snprintf(bak, sizeof(bak), "%s.bak", filename);
+ len = snprintf(bak, sizeof(bak), "%s.bak", filename);
GDKfree(filenamestr);
+ if (len == -1 || len >= FILENAME_MAX) {
+ GDKerror("Logger filename path is too large\n");
+ goto error;
+ }
lg->catalog_bid = NULL;
lg->catalog_nme = NULL;
@@ -1992,11 +2014,19 @@ logger_load(int debug, const char *fn, c
{
FILE *fp1;
- int curid;
-
- snprintf(cvfile, sizeof(cvfile), "%sconvert-nil-nan",
+ int len, curid;
+
+ len = snprintf(cvfile, sizeof(cvfile),
"%sconvert-nil-nan",
lg->dir);
- snprintf(bak, sizeof(bak), "%s_nil-nan-convert", fn);
+ if (len == -1 || len >= FILENAME_MAX) {
+ GDKerror("Convert-nil-nan filename path is too
large\n");
+ goto error;
+ }
+ len = snprintf(bak, sizeof(bak), "%s_nil-nan-convert",
fn);
+ if (len == -1 || len >= FILENAME_MAX) {
+ GDKerror("Convert-nil-nan filename path is too
large\n");
+ goto error;
+ }
/* read the current log id without disturbing
* the file pointer */
#ifdef _MSC_VER
@@ -2281,7 +2311,7 @@ logger_exit(logger *lg)
{
FILE *fp;
char filename[FILENAME_MAX];
- int farmid = BBPselectfarm(PERSISTENT, 0, offheap);
+ int len, farmid = BBPselectfarm(PERSISTENT, 0, offheap);
logger_close(lg);
if (GDKmove(farmid, lg->dir, LOGFILE, NULL, lg->dir, LOGFILE, "bak") !=
GDK_SUCCEED) {
@@ -2290,7 +2320,11 @@ logger_exit(logger *lg)
return GDK_FAIL;
}
- snprintf(filename, sizeof(filename), "%s%s", lg->dir, LOGFILE);
+ len = snprintf(filename, sizeof(filename), "%s%s", lg->dir, LOGFILE);
+ if (len == -1 || len >= FILENAME_MAX) {
+ fprintf(stderr, "!ERROR: logger_exit: logger filename path is
too large\n");
+ return GDK_FAIL;
+ }
if ((fp = GDKfileopen(farmid, NULL, filename, NULL, "w")) != NULL) {
char ext[FILENAME_MAX];
@@ -2435,9 +2469,13 @@ logger_read_last_transaction_id(logger *
FILE *fp;
char id[BUFSIZ];
lng lid = GDK_FAIL;
- int farmid = BBPselectfarm(role, 0, offheap);
-
- snprintf(filename, sizeof(filename), "%s%s", dir, logger_file);
+ int len, farmid = BBPselectfarm(role, 0, offheap);
+
+ len = snprintf(filename, sizeof(filename), "%s%s", dir, logger_file);
+ if (len == -1 || len >= FILENAME_MAX) {
+ fprintf(stderr, "!ERROR: logger_read_last_transaction_id:
logger filename path is too large\n");
+ return -1;
+ }
if ((fp = GDKfileopen(farmid, NULL, filename, NULL, "r")) == NULL) {
fprintf(stderr, "!ERROR: logger_read_last_transaction_id:
unable to open file %s\n", filename);
return -1;
diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -172,13 +172,15 @@ static char *RAPIinitialize(void) {
static char *RAPIinstalladdons(void) {
int evalErr;
ParseStatus status;
- char rlibs[BUFSIZ];
+ char rlibs[FILENAME_MAX];
char rapiinclude[BUFSIZ];
SEXP librisexp;
+ int len;
// r library folder, create if not exists
- snprintf(rlibs, sizeof(rlibs), "%s%c%s", GDKgetenv("gdk_dbpath"),
DIR_SEP,
- "rapi_packages");
+ len = snprintf(rlibs, sizeof(rlibs), "%s%c%s", GDKgetenv("gdk_dbpath"),
DIR_SEP, "rapi_packages");
+ if (len == -1 || len >= FILENAME_MAX)
+ return "cannot create rapi_packages directory because the path
is too large";
if (mkdir(rlibs, S_IRWXU) != 0 && errno != EEXIST) {
return "cannot create rapi_packages directory";
diff --git a/monetdb5/mal/mal_linker.c b/monetdb5/mal/mal_linker.c
--- a/monetdb5/mal/mal_linker.c
+++ b/monetdb5/mal/mal_linker.c
@@ -179,6 +179,7 @@ loadLibrary(str filename, int flag)
}
while (*mod_path) {
+ int len;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list