]> code.bitgloo.com Git - clyne/interpreter.git/commitdiff
leak fix for scripted returns
authorClyne Sullivan <tullivan99@gmail.com>
Mon, 5 Mar 2018 15:50:21 +0000 (10:50 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Mon, 5 Mar 2018 15:50:21 +0000 (10:50 -0500)
Makefile
builtins.c
parser.c

index c588c8fdee7befa781ff64713020a1e1b17c0af8..8bca3c1cb3be9950562593b24b310299cd29ac40 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,4 +16,4 @@ all:
        $(CC) $(CFLAGS) -c variable.c
        $(AR) r libinterp.a *.o
        @rm -f *.o
-       #$(CC) $(CFLAGS) shell.c *.o -o shell #-L. -l interp
+       #$(CC) $(CFLAGS) shell.c *.o -o shell
index 309e1d85ebd74afb39a00a11023c4ab9f481f8dd..b2295c5069a571dac126d26a36ff02bab204afc5 100644 (file)
@@ -94,15 +94,13 @@ int ifunc_do(interpreter *it)
 
 int ifunc_while(interpreter *it)
 {
-       //int c = igetarg_integer(it, 0);
+       int c = igetarg_integer(it, 0);
        ipop(it);
        int nidx = (int)ipop(it);
-       //if (c != 0) {
+       if (c != 0) {
                //ipush(it, (void *)nidx);
                it->lnidx = nidx - 1;
-       //} else {
-       //      c++;
-       //}
+       }
        ipush(it, 0);
        return 0;
 }
@@ -126,7 +124,10 @@ void iret(interpreter *it, variable *v)
        if (it->ret != 0) {
                it->ret->valtype = v->valtype;
                it->ret->value = v->value;
-               it->ret->svalue = v->svalue;
+               char *s = it->ret->svalue;
+               if (s != 0 && s != str_undef)
+                       free(s);
+               it->ret->svalue = strclone(v->svalue);
                it->ret = 0;
        }
 }
index 0c88cb0041ca4d996c05db69cc675c20ffd4340e..56089982bf43c93522f1605905131728218bb362 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -39,9 +39,9 @@ void iend(interpreter *it)
 {
        for (unsigned int i = 0; i < MAX_VARS; i++) {
                if (it->vars[i].used == 1) {
-                       char *s = it->vars[i].svalue;
-                       if (s != 0 && s != str_undef && s != str_func)
-                               free(s);
+                       //char *s = it->vars[i].svalue;
+                       //if (s != 0 && s != str_undef && s != str_func)
+                       //      free(s);
                        free(it->vnames[i]);
                }
        }