Changeset: bdb74daca855 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bdb74daca855
Modified Files:
        monetdb5/modules/atoms/str.c
Branch: txtsim
Log Message:

Fix leak when STRlower fails.


diffs (117 lines):

diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3633,17 +3633,22 @@ STRstartsWith(Client cntxt, MalBlkPtr mb
        (void)cntxt;
        (void)mb;
        bit *res = getArgReference(stk, pci, 0);
-       const str *arg1 = getArgReference(stk, pci, 1);
-       const str *arg2 = getArgReference(stk, pci, 2);
+       const str *arg1 = getArgReference(stk, pci, 1), *arg2 = 
getArgReference(stk, pci, 2);
        bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true 
: false;
        str s = *arg1, prefix = *arg2, msg = MAL_SUCCEED;
 
        if (icase) {
-               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED ||
-                       (msg = STRlower(&prefix, &prefix)) != MAL_SUCCEED)
+               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED) {
+                       GDKfree(s);
                        goto bail;
+               }
+               if ((msg = STRlower(&prefix, &prefix)) != MAL_SUCCEED) {
+                       GDKfree(s);
+                       GDKfree(prefix);
+                       goto bail;
+               }
        }
-       *res = (strNil(s) || strNil(prefix)) ? bit_nil :str_is_prefix(s, 
prefix) ;
+       *res = (strNil(s) || strNil(prefix)) ? bit_nil : str_is_prefix(s, 
prefix);
  bail:
        return msg;
 }
@@ -3666,17 +3671,22 @@ STRendsWith(Client cntxt, MalBlkPtr mb, 
        (void)cntxt;
        (void)mb;
        bit *res = getArgReference(stk, pci, 0);
-       const str *arg1 = getArgReference(stk, pci, 1);
-       const str *arg2 = getArgReference(stk, pci, 2);
+       const str *arg1 = getArgReference(stk, pci, 1), *arg2 = 
getArgReference(stk, pci, 2);
        bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true 
: false;
        str s = *arg1, suffix = *arg2, msg = MAL_SUCCEED;
 
        if (icase) {
-               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED ||
-                       (msg = STRlower(&suffix, &suffix)) != MAL_SUCCEED)
+               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED) {
+                       GDKfree(s);
                        goto bail;
+               }
+               if ((msg = STRlower(&suffix, &suffix)) != MAL_SUCCEED) {
+                       GDKfree(s);
+                       GDKfree(suffix);
+                       goto bail;
+               }
        }
-       *res = (strNil(s) || strNil(suffix)) ? bit_nil :str_is_suffix(s, 
suffix) ;
+       *res = (strNil(s) || strNil(suffix)) ? bit_nil : str_is_suffix(s, 
suffix);
  bail:
        return msg;
 }
@@ -3698,19 +3708,22 @@ STRstr_search(Client cntxt, MalBlkPtr mb
        (void)cntxt;
        (void)mb;
        bit *res = getArgReference(stk, pci, 0);
-       const str *haystack = getArgReference(stk, pci, 1);
-       const str *needle = getArgReference(stk, pci, 2);
+       const str *haystack = getArgReference(stk, pci, 1), *needle = 
getArgReference(stk, pci, 2);
        bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true 
: false;
-
-       str s = *haystack, h = *needle;
-       str s_lower, h_lower, msg = MAL_SUCCEED;
+       str s = *haystack, h = *needle, msg = MAL_SUCCEED;
 
        if (icase) {
-               if ((msg = STRlower(&s, &s_lower)) != MAL_SUCCEED ||
-                       (msg = STRlower(&h, &h_lower)) != MAL_SUCCEED)
+               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED) {
+                       GDKfree(s);
                        goto bail;
+               }
+               if ((msg = STRlower(&h, &h)) != MAL_SUCCEED) {
+                       GDKfree(s);
+                       GDKfree(h);
+                       goto bail;
+               }
        }
-       *res = (strNil(s) || strNil(h)) ? bit_nil : str_search(s, h) ;
+       *res = (strNil(s) || strNil(h)) ? bit_nil : str_search(s, h);
  bail:
        return msg;
 }
@@ -3744,16 +3757,20 @@ STRrevstr_search(Client cntxt, MalBlkPtr
        const str *haystack = getArgReference(stk, pci, 1);
        const str *needle = getArgReference(stk, pci, 2);
        bit icase = pci->argc == 4 && *getArgReference_bit(stk, pci, 3) ? true 
: false;
-
-       str s = *haystack, h = *needle;
-       str s_lower, h_lower, msg = MAL_SUCCEED;
+       str s = *haystack, h = *needle, msg = MAL_SUCCEED;
 
        if (icase) {
-               if ((msg = STRlower(&s, &s_lower)) != MAL_SUCCEED ||
-                       (msg = STRlower(&h, &h_lower)) != MAL_SUCCEED)
+               if ((msg = STRlower(&s, &s)) != MAL_SUCCEED) {
+                       GDKfree(s);
                        goto bail;
+               }
+               if ((msg = STRlower(&h, &h)) != MAL_SUCCEED) {
+                       GDKfree(s);
+                       GDKfree(h);
+                       goto bail;
+               }
        }
-       *res = (strNil(s) || strNil(h)) ? bit_nil : str_reverse_str_search(s, 
h) ;
+       *res = (strNil(s) || strNil(h)) ? bit_nil : str_reverse_str_search(s, 
h);
  bail:
        return msg;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to