Changeset: 7cb07ae9f344 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7cb07ae9f344
Modified Files:
sql/backends/monet5/sql_rank.c
Branch: default
Log Message:
Copy value from the heap to avoid race condition
diffs (62 lines):
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -1096,10 +1096,10 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
{
int tp1, tp2, tp3, base = 2;
BUN l_value = 1;
- const void *restrict default_value;
+ void *restrict default_value;
gdk_return (*gdk_call)(BAT *, BAT *, BAT *, BUN, const void* restrict,
int) = func;
BAT *b = NULL, *l = NULL, *d = NULL, *p = NULL, *r = NULL;
- bool tp2_is_a_bat;
+ bool tp2_is_a_bat, free_default_value = false;
str msg = MAL_SUCCEED;
bat *res = NULL;
@@ -1143,6 +1143,8 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
tp3 = getArgType(mb, pci, 3);
if (isaBatType(tp3)) {
BATiter bpi;
+ size_t default_size;
+ const void *p;
tp3 = getBatType(tp3);
if (!(d = BATdescriptor(*getArgReference_bat(stk, pci,
3)))) {
@@ -1150,8 +1152,17 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
goto bailout;
}
bpi = bat_iterator(d);
- default_value = BUNtail(bpi, 0);
+ p = BUNtail(bpi, 0);
+ default_size = ATOMlen(tp3, p);
+ default_value = GDKmalloc(default_size);
+ if (default_value)
+ memcpy(default_value, p, default_size);
bat_iterator_end(&bpi);
+ if (!default_value) {
+ msg = createException(SQL, op, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ free_default_value = true;
} else {
ValRecord *in = &(stk)->stk[(pci)->argv[3]];
default_value = VALget(in);
@@ -1161,7 +1172,7 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
int tpe = tp1;
if (isaBatType(tpe))
tpe = getBatType(tp1);
- default_value = ATOMnilptr(tpe);
+ default_value = (void *)ATOMnilptr(tpe);
}
assert(default_value); //default value must be set
@@ -1208,6 +1219,8 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
}
bailout:
+ if (free_default_value)
+ GDKfree(default_value);
unfix_inputs(4, b, p, l, d);
finalize_output(res, r, msg);
return msg;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list