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

Reply via email to