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