On Mon, Mar 04, 2013 at 06:47:10AM -0500, Michael K. Johnson wrote:
> Finally, I think you forgot to post the patches, unless I have somehow
> accidentally enabled a "strip attachments from posts" feature in
> setting up this list in mailman...

OK, mailman seems to default (at least, I didn't change from the
defaults intentionally) to stripping non-whitelisted attachment
types.  It allows text/plain and text/x-patch among others.

Uri sent the Conary patch to me directly.

Here it is inline:

diff -ruN rpathsync-conary-fb64f746afaf/conary/lib/ext/dep_freeze.c 
rpathsync-conary-fb64f746afaf_new/conary/lib/ext/dep_freeze.c
--- rpathsync-conary-fb64f746afaf/conary/lib/ext/dep_freeze.c   2012-04-11 
18:14:08.000000000 +0300
+++ rpathsync-conary-fb64f746afaf_new/conary/lib/ext/dep_freeze.c       
2013-03-03 10:46:22.000000000 +0200
@@ -300,7 +300,6 @@
                    ((struct depList *) b)->className);
 }
 
-/* This leaks memory on error. Oh well. */
 static int depClassFreezeRaw(PyObject * tagObj, PyObject * dict,
                           char ** resultPtr, int * resultSizePtr) {
     PyObject * depObjList, * tuple;
@@ -333,6 +332,11 @@
     }
 
     depList = malloc(depCount * sizeof(*depList));
+    if (!depList)
+        return -1;
+
+    memset(depList,0,depCount * sizeof(*depList));
+
     for (i = 0; i < depCount; i++) {
         tuple = PyList_GET_ITEM(depObjList, i);
         if (!PYBYTES_CheckExact(PyTuple_GET_ITEM(tuple, 0))) {
@@ -350,15 +354,17 @@
     qsort(depList, depCount, sizeof(*depList), depListSort);
 
     totalSize = 0;
+    rc=0;
     for (i = 0; i < depCount; i++) {
         if (!(nameObj = PyObject_GetAttrString(depList[i].dep, "name"))) {
-            free(depList);
-            return -1;
+            rc=-1;
+            break;
         }
 
         if (!(flagsObj = PyObject_GetAttrString(depList[i].dep, "flags"))) {
-            free(depList);
-            return -1;
+            Py_DECREF(nameObj);
+            rc=-1;
+            break;
         }
 
         rc = depFreezeRaw(nameObj, flagsObj, &depList[i].frz, 
&depList[i].frzSize);
@@ -367,13 +373,20 @@
         Py_DECREF(flagsObj);
 
         if (rc == -1) {
-            free(depList);
-            return -1;
+            break;
         }
 
         totalSize += depList[i].frzSize;
     }
 
+    if ( rc==-1 ) {
+        for (i = 0; i < depCount; i++) {
+            free(depList[i].frz);
+        }
+        free(depList);
+        return -1;
+    }
+
     /* 15 leaves plenty of room for the tag integer and the # */
     result = malloc((depCount * 15) + totalSize);
     next = result;
@@ -393,6 +406,7 @@
     *resultPtr = result;
     *resultSizePtr = next - result;
 
+    free(depList);
     return 0;
 }
 
@@ -482,6 +496,9 @@
         }
 
         totalSize += members[i].frzSize + 1;
+
+        Py_DECREF(tagObj);
+        Py_DECREF(classMembers);
     }
 
     Py_DECREF(memberList);
diff -ruN rpathsync-conary-fb64f746afaf/conary/lib/ext/pack.c 
rpathsync-conary-fb64f746afaf_new/conary/lib/ext/pack.c
--- rpathsync-conary-fb64f746afaf/conary/lib/ext/pack.c 2012-04-11 
18:14:08.000000000 +0300
+++ rpathsync-conary-fb64f746afaf_new/conary/lib/ext/pack.c     2013-02-21 
06:33:06.000000000 +0200
@@ -140,6 +140,9 @@
     }
 
     result = malloc(strLen);
+    if (!result)
+        return NULL;
+
     argNum = 1;
     strLen = 0;
     formatPtr = format + 1;
@@ -168,11 +171,13 @@
                     formatPtr++;
                 } else if (isdigit(*formatPtr)) {
                     if (getSize(&formatPtr, &i)) {
+                        free(result);
                         return NULL;
                     }
                 } else {
                     PyErr_SetString(PyExc_RuntimeError,
                                     "internal pack error 1");
+                    free(result);
                     return NULL;
                 }
 
@@ -184,11 +189,13 @@
             default:
                 PyErr_SetString(PyExc_RuntimeError,
                                 "internal pack error 2");
+                free(result);
                 return NULL;
         }
     }
 
     resultObj = PYBYTES_FromStringAndSize(result, strLen);
+    free(result);
     return resultObj;
 }
 
diff -ruN rpathsync-conary-fb64f746afaf/conary/lib/ext/streams_set.c 
rpathsync-conary-fb64f746afaf_new/conary/lib/ext/streams_set.c
--- rpathsync-conary-fb64f746afaf/conary/lib/ext/streams_set.c  2012-04-11 
18:14:08.000000000 +0300
+++ rpathsync-conary-fb64f746afaf_new/conary/lib/ext/streams_set.c      
2013-02-27 08:06:25.000000000 +0200
@@ -66,7 +66,12 @@
 /* StreamSetDef Implementation           */
 
 static void StreamSetDef_Dealloc(PyObject * self) {
+    int i;
     StreamSetDefObject * ssd = (StreamSetDefObject *) self;
+    for (i=0; i<ssd->tagCount; ++i) {
+        Py_CLEAR(ssd->tags[i].name);
+        Py_CLEAR(ssd->tags[i].type);
+    }
     free(ssd->tags);
     Py_TYPE(self)->tp_free(self);
 }
@@ -112,6 +117,8 @@
        Py_INCREF(streamType);
     }
 
+    Py_DECREF(items);
+
     /* simple bubble sort */
     for (i = 0; i < ssd->tagCount - 1; i++) {
        for (j = 0; j < ssd->tagCount - i - 1; j++) {




If I read this correctly, all the changes except for the the
stream_set.c change are for out-of-memory conditions.

Am I missing anything?

Thanks

_______________________________________________
Foresight-devel mailing list
[email protected]
https://lists.foresightlinux.org/mailman/listinfo/foresight-devel

Reply via email to