Changeset: 24b278db3ea1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=24b278db3ea1
Modified Files:
        sql/src/backends/monet5/sql_optimizer.mx
Branch: Oct2010
Log Message:

Fix bug found by valgrind.
Make sure that optimizerpipe is an independently allocated value so
that freeing memory in other parts of the code doesn't affect it.


diffs (48 lines):

diff -r d16b66f3ef64 -r 24b278db3ea1 sql/src/backends/monet5/sql_optimizer.mx
--- a/sql/src/backends/monet5/sql_optimizer.mx  Wed Oct 13 11:33:00 2010 +0200
+++ b/sql/src/backends/monet5/sql_optimizer.mx  Wed Oct 13 14:31:20 2010 +0200
@@ -560,7 +560,7 @@
 setOptimizers(str optimizer)
 {
        int top=0;
-       char *base, *nxt, *nme, *pipe="notdefined";
+       char *base=0, *nxt, *nme, *pipe="notdefined";
        
        /* do nothing if the pipe line is already set */
        if ( optimizerpipe && optimizer && strcmp(optimizerpipe,optimizer) == 0 
)
@@ -576,7 +576,8 @@
        if(strcmp(optimizer,"off")==0){
                if( previouspipe )
                        return optimizerpipe;
-               previouspipe = optimizerpipe;
+               previouspipe = optimizerpipe;  /* give reference away */
+               optimizerpipe = NULL;
                pipe = GDKgetenv(minimalPipe);
                if ( pipe )
                        optimizer = pipe;
@@ -585,6 +586,7 @@
                if (previouspipe == NULL)
                        return optimizerpipe;
                optimizer= previouspipe;
+               base = previouspipe;  /* free this later */
                previouspipe = 0;
        } else {
                /* the optimizer may be an environment alias */
@@ -593,7 +595,16 @@
                        optimizer = pipe;
        }
 
-       optimizerpipe= optimizer;
+       /* always strdup the value assigned to optimizerpipe, so we
+          need to also free the old value, making sure we don't first
+          free the value that maybe we want to strdup (in case
+          optimizer==optimizerpipe) */
+       optimizer = GDKstrdup(optimizer);
+       if (base)               /* free old value of previouspipe */
+               GDKstrdup(base);
+       if (optimizerpipe)
+               GDKfree(optimizerpipe);
+       optimizerpipe = optimizer;
        base = optimizer = GDKstrdup(optimizer);
 
        /* An optimizer pipe is a comma separated list of names */
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to