pyxattr: Fix memory leaks.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 21 Jan 2010 03:44:12 +0000 (16:44 +1300)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 21 Jan 2010 03:44:12 +0000 (16:44 +1300)
source4/librpc/ndr/py_xattr.c
source4/scripting/python/pyxattr_native.c
source4/scripting/python/pyxattr_tdb.c

index 9cf87e24a99b0f7cfeb6399742c2fdd9331300e7..19c5f266728c198d2ee61f57d564223bdae0f779 100644 (file)
@@ -78,7 +78,7 @@ static PyObject *py_ntacl_print(PyObject *self, PyObject *args)
        pr->print = ntacl_print_debug_helper;
        ndr_print_xattr_NTACL(pr, "file", ntacl);
 
-       talloc_free(pr);
+       talloc_free(mem_ctx);
 
        Py_RETURN_NONE;
 }
index 70fdf571f1f23e40d080f1a58a7ea012a5caa332..9b60039a3851d4825cbacfe8129ef0f35c8f2fbc 100644 (file)
@@ -35,6 +35,7 @@ static PyObject *py_is_xattr_supported(PyObject *self)
        return Py_True;
 #endif
 }
+
 static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
 {
        char *filename, *attribute;
@@ -42,11 +43,12 @@ static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
        int blobsize;
        DATA_BLOB blob;
 
-       if (!PyArg_ParseTuple(args, "sss#", &filename,&attribute,&blob.data,&blobsize))
+       if (!PyArg_ParseTuple(args, "sss#", &filename, &attribute, &blob.data, 
+        &blobsize))
                return NULL;
 
        blob.length = blobsize;
-       ret = wrap_setxattr(filename,attribute,blob.data,blob.length,0);
+       ret = wrap_setxattr(filename, attribute, blob.data, blob.length, 0);
        if( ret < 0 ) {
                if (errno == ENOTSUP) {
                        PyErr_SetFromErrno(PyExc_IOError);
@@ -65,7 +67,7 @@ static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
        TALLOC_CTX *mem_ctx;
        char *buf;
        PyObject *ret;
-       if (!PyArg_ParseTuple(args, "ss", &filename,&attribute))
+       if (!PyArg_ParseTuple(args, "ss", &filename, &attribute))
                return NULL;
        mem_ctx = talloc_new(NULL);
        len = wrap_getxattr(filename,attribute,NULL,0);
@@ -75,6 +77,7 @@ static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
                } else {
                        PyErr_SetFromErrno(PyExc_TypeError);
                }
+               talloc_free(mem_ctx);
                return NULL;
        }
        /* check length ... */
@@ -86,10 +89,11 @@ static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
                } else {
                        PyErr_SetFromErrno(PyExc_TypeError);
                }
+               talloc_free(mem_ctx);
                return NULL;
        }
        ret = PyString_FromStringAndSize(buf, len);
-       talloc_free(buf);
+       talloc_free(mem_ctx);
        return ret;
 }
 
index ed5a97fe3cb26a24946f1cfe07400ea71d91a3a4..f90cfd5a2662eb1b39f210133d454f3b4d49bd26 100644 (file)
@@ -49,7 +49,8 @@ static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
        TALLOC_CTX *mem_ctx;
        struct tdb_wrap *eadb;
 
-       if (!PyArg_ParseTuple(args, "ssss#", &tdbname,&filename,&attribute,&blob.data,&blobsize))
+       if (!PyArg_ParseTuple(args, "ssss#", &tdbname, &filename, &attribute, 
+                                                 &blob.data, &blobsize))
                return NULL;
 
        blob.length = blobsize;
@@ -59,13 +60,16 @@ static PyObject *py_wrap_setxattr(PyObject *self, PyObject *args)
 
        if (eadb == NULL) {
                PyErr_SetFromErrno(PyExc_IOError);
+               talloc_free(mem_ctx);
                return NULL;
        }
        status = push_xattr_blob_tdb_raw(eadb,mem_ctx,attribute,filename,-1,&blob);
-       if( !NT_STATUS_IS_OK(status) ) {
-               PyErr_SetFromErrno(PyExc_TypeError);
+       if (!NT_STATUS_IS_OK(status)) {
+               PyErr_FromNTSTATUS(status);
+               talloc_free(mem_ctx);
                return NULL;
        }
+       talloc_free(mem_ctx);
        Py_RETURN_NONE;
 }
 
@@ -86,14 +90,18 @@ static PyObject *py_wrap_getxattr(PyObject *self, PyObject *args)
                                TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
        if (eadb == NULL) {
                PyErr_SetFromErrno(PyExc_IOError);
+               talloc_free(mem_ctx);
                return NULL;
        }
-       status = pull_xattr_blob_tdb_raw(eadb,mem_ctx,attribute,filename,-1,100,&blob);
+       status = pull_xattr_blob_tdb_raw(eadb, mem_ctx, attribute, filename, 
+                                                                        -1, 100, &blob);
        if (!NT_STATUS_IS_OK(status) || blob.length < 0) {
                PyErr_FromNTSTATUS(status);
+               talloc_free(mem_ctx);
                return NULL;
        }
        ret = PyString_FromStringAndSize((char *)blob.data, blob.length);
+       talloc_free(mem_ctx);
        return ret;
 }