r9464: fixed a problem with child pointers copied into non-allocated mpr variables. We
authorAndrew Tridgell <tridge@samba.org>
Mon, 22 Aug 2005 01:51:02 +0000 (01:51 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:18 +0000 (13:34 -0500)
now use the same free technique as is used for mpr strings, rather than relying on
being a child of the variable
(This used to be commit 3d6739eaa6e1b56d67bc7d9b5350a6911c96597a)

source4/lib/appweb/mpr/var.c
source4/scripting/ejs/mprutil.c

index 77f4cbc55a3ef4da6b16bf8f8081f6c3c1838814..09979156e89103972ab5b14d21664160a38d4a87 100644 (file)
@@ -181,6 +181,13 @@ static bool freeVarStorage(MprVar *vp, int force)
                }
                break;
 
+       case MPR_TYPE_PTR:
+               if (vp->allocatedData) {
+                       vp->allocatedData = 0;
+                       mprFree(vp->ptr);
+               }
+               break;
+
        case MPR_TYPE_OBJECT:
 #if VAR_DEBUG
                /*
@@ -1418,7 +1425,12 @@ static void copyVarCore(MprVar *dest, MprVar *src, int copyDepth)
        case MPR_TYPE_PTR:
                /* we have to reference here so talloc structures survive a
                   copy */
-               dest->ptr = talloc_reference(dest, src->ptr);
+               if (src->allocatedData) {
+                       dest->ptr = talloc_reference(mprMemCtx(), src->ptr);
+                       dest->allocatedData = 1;
+               } else {
+                       dest->ptr = src->ptr;
+               }
                break;
 
        case MPR_TYPE_STRING_CFUNCTION:
index 8f1e5f71c8738d9226ed6cc848d1fbee27cb701f..38cfd2c4934fd90569b372c5062898d70b344bd2 100644 (file)
@@ -369,12 +369,14 @@ void mprSetPtr(struct MprVar *v, const char *propname, const void *p)
 }
 
 /*
-  set a pointer in a existing MprVar, making it a child of the property
+  set a pointer in a existing MprVar, freeing it when the property goes away
 */
 void mprSetPtrChild(struct MprVar *v, const char *propname, const void *p)
 {
        mprSetVar(v, propname, mprCreatePtrVar(discard_const(p)));
-       talloc_steal(mprGetProperty(v, propname, NULL), p);
+       v = mprGetProperty(v, propname, NULL);
+       v->allocatedData = 1;
+       talloc_steal(mprMemCtx(), p);
 }
 
 /*