[SCM] Samba Shared Repository - branch master updated
Noel Power
npower at samba.org
Thu Feb 7 16:18:02 UTC 2019
The branch, master has been updated
via 61670169d52 Clean up reference used with PyDict_Setxxx
via 2814690d8fc Cleanup (decref) some objects added to list.
via e29c34942dc decref results of PyStr_FromString
via 85b7574b91f pidl: Fix Generated ndr python code to DECREF imported modules
via 53d973f59c3 Cleanup references to module objects returned from PyImport_ImportModule
via 1be9b0cf1bc Examine result of SetList (and prevent sending NULL to PyList_SetItem)
via a8e10a12493 Decrement references to python objects passed to Py_BuildValue
from bf91ee0a972 tldap: avoid more use after free errors
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 61670169d5241f742bc80bec37b02800af8c8517
Author: Noel Power <noel.power at suse.com>
Date: Thu Jan 31 17:01:26 2019 +0000
Clean up reference used with PyDict_Setxxx
PyDictSetxxx methods don't steal reference so if the items added
to the dictionary were created just for the purpose of inserting
into the dict then we need to decref them.
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Autobuild-User(master): Noel Power <npower at samba.org>
Autobuild-Date(master): Thu Feb 7 17:17:46 CET 2019 on sn-devel-144
commit 2814690d8fc302e79b041b3175e85bef1ac98e51
Author: Noel Power <noel.power at suse.com>
Date: Wed Jan 23 18:43:43 2019 +0000
Cleanup (decref) some objects added to list.
PyList_Append doesn't steal references, so if the item created is
a temp object, created just to be added to the list we need to
decref the item appended in order for it to be released.
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
commit e29c34942dcc29721f8f3dc8dbb58a18afda1e60
Author: Noel Power <noel.power at suse.com>
Date: Wed Jan 23 18:08:58 2019 +0000
decref results of PyStr_FromString
Where we create temporary objects (which are added to containers)
these objects already get there ref count incremented. In this case
we need to decref those objects to ensure they are released.
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
commit 85b7574b91f3dfcf751de8ae81876dc64fc5e686
Author: Noel Power <noel.power at suse.com>
Date: Wed Jan 23 17:10:44 2019 +0000
pidl: Fix Generated ndr python code to DECREF imported modules
Generated code calls Py_ImportModule but in all error returns
and also successful exit the code fails to decrement reference to
loaded modules in MODULE_INIT_FUNC function.
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
commit 53d973f59c3514f9c288cc8e53a682176a5fc415
Author: Noel Power <noel.power at suse.com>
Date: Wed Jan 23 15:15:07 2019 +0000
Cleanup references to module objects returned from PyImport_ImportModule
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
commit 1be9b0cf1bc95715e83c27eabecbd4fa2022530b
Author: Noel Power <noel.power at suse.com>
Date: Fri Jan 25 12:02:50 2019 +0000
Examine result of SetList (and prevent sending NULL to PyList_SetItem)
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
commit a8e10a12493fdb6b8347b14e157aeb619cf2d2da
Author: Noel Power <noel.power at suse.com>
Date: Tue Jan 22 18:26:23 2019 +0000
Decrement references to python objects passed to Py_BuildValue
Py_BuildValue when processing format 'O' will
'Pass a Python object untouched (except for its reference count,
which is incremented by one'
Basically this means if you are using a new reference to a PyObject
to pass to BuildValue (to be used with the 'O' format) the reference
*isn't* stolen so you really do need to DECREF it in order to ensure
it gets cleaned up.
Signed-off-by: Noel Power <noel.power at suse.com>
Reviewed-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
-----------------------------------------------------------------------
Summary of changes:
auth/credentials/pycredentials.c | 7 +-
lib/ldb-samba/pyldb.c | 10 +-
lib/ldb/pyldb.c | 79 ++++++-
pidl/lib/Parse/Pidl/Samba4/Python.pm | 18 +-
source3/libsmb/pylibsmb.c | 8 +-
source3/passdb/py_passdb.c | 437 +++++++++++++++++++++--------------
source4/dns_server/pydns.c | 6 +-
source4/dsdb/pydsdb.c | 23 +-
source4/lib/policy/pypolicy.c | 18 +-
source4/libnet/py_net.c | 12 +-
source4/librpc/ndr/py_auth.c | 1 +
source4/librpc/ndr/py_security.c | 1 +
source4/librpc/ndr/py_xattr.c | 1 +
source4/librpc/rpc/pyrpc.c | 30 ++-
source4/librpc/rpc/pyrpc_util.c | 7 +-
source4/param/provision.c | 23 +-
16 files changed, 453 insertions(+), 228 deletions(-)
Changeset truncated at 500 lines:
diff --git a/auth/credentials/pycredentials.c b/auth/credentials/pycredentials.c
index d1ee12e45a9..1b86e001557 100644
--- a/auth/credentials/pycredentials.c
+++ b/auth/credentials/pycredentials.c
@@ -75,9 +75,10 @@ static PyObject *py_creds_get_ntlm_username_domain(PyObject *self, PyObject *unu
PyObject *ret = NULL;
cli_credentials_get_ntlm_username_domain(PyCredentials_AsCliCredentials(self),
frame, &user, &domain);
- ret = Py_BuildValue("(OO)",
- PyString_FromStringOrNULL(user),
- PyString_FromStringOrNULL(domain));
+ ret = Py_BuildValue("(ss)",
+ user,
+ domain);
+
TALLOC_FREE(frame);
return ret;
}
diff --git a/lib/ldb-samba/pyldb.c b/lib/ldb-samba/pyldb.c
index 57c5397bc06..0cf550bc7a5 100644
--- a/lib/ldb-samba/pyldb.c
+++ b/lib/ldb-samba/pyldb.c
@@ -180,8 +180,10 @@ static PyObject *py_ldb_set_session_info(PyObject *self, PyObject *args)
return NULL;
PyAuthSession_Type = PyObject_GetAttrString(mod_samba_auth, "session_info");
- if (PyAuthSession_Type == NULL)
+ if (PyAuthSession_Type == NULL) {
+ Py_CLEAR(mod_samba_auth);
return NULL;
+ }
ret = PyArg_ParseTuple(args, "O!", PyAuthSession_Type, &py_session_info);
@@ -262,11 +264,15 @@ MODULE_INIT_FUNC(_ldb)
return NULL;
PySambaLdb.tp_base = (PyTypeObject *)PyObject_GetAttrString(pyldb_module, "Ldb");
- if (PySambaLdb.tp_base == NULL)
+ if (PySambaLdb.tp_base == NULL) {
+ Py_CLEAR(pyldb_module);
return NULL;
+ }
py_ldb_error = PyObject_GetAttrString(pyldb_module, "LdbError");
+ Py_CLEAR(pyldb_module);
+
if (PyType_Ready(&PySambaLdb) < 0)
return NULL;
diff --git a/lib/ldb/pyldb.c b/lib/ldb/pyldb.c
index 8e48fa5d56d..3deb393e467 100644
--- a/lib/ldb/pyldb.c
+++ b/lib/ldb/pyldb.c
@@ -1673,9 +1673,13 @@ static PyObject *ldb_ldif_to_pyobject(struct ldb_ldif *ldif)
Py_RETURN_NONE;
} else {
/* We don't want this attached to the 'ldb' any more */
- return Py_BuildValue(discard_const_p(char, "(iO)"),
- ldif->changetype,
- PyLdbMessage_FromMessage(ldif->msg));
+ PyObject *obj = PyLdbMessage_FromMessage(ldif->msg);
+ PyObject *result =
+ Py_BuildValue(discard_const_p(char, "(iO)"),
+ ldif->changetype,
+ obj);
+ Py_CLEAR(obj);
+ return result;
}
}
@@ -1737,7 +1741,21 @@ static PyObject *py_ldb_parse_ldif(PyLdbObject *self, PyObject *args)
ldif = ldb_ldif_read_string(self->ldb_ctx, &s);
talloc_steal(mem_ctx, ldif);
if (ldif) {
- PyList_Append(list, ldb_ldif_to_pyobject(ldif));
+ int res = 0;
+ PyObject *py_ldif = ldb_ldif_to_pyobject(ldif);
+ if (py_ldif == NULL) {
+ Py_CLEAR(list);
+ PyErr_BadArgument();
+ talloc_free(mem_ctx);
+ return NULL;
+ }
+ res = PyList_Append(list, py_ldif);
+ Py_CLEAR(py_ldif);
+ if (res == -1) {
+ Py_CLEAR(list);
+ talloc_free(mem_ctx);
+ return NULL;
+ }
last_dn = ldif->msg->dn;
} else {
const char *last_dn_str = NULL;
@@ -1746,6 +1764,7 @@ static PyObject *py_ldb_parse_ldif(PyLdbObject *self, PyObject *args)
PyErr_SetString(PyExc_ValueError,
"unable to parse LDIF "
"string at first chunk");
+ Py_CLEAR(list);
talloc_free(mem_ctx);
return NULL;
}
@@ -1762,6 +1781,7 @@ static PyObject *py_ldb_parse_ldif(PyLdbObject *self, PyObject *args)
PyErr_SetString(PyExc_ValueError,
err_string);
talloc_free(mem_ctx);
+ Py_CLEAR(list);
return NULL;
}
}
@@ -2197,8 +2217,24 @@ static PyObject *py_ldb_modules(PyLdbObject *self)
PyObject *ret = PyList_New(0);
struct ldb_module *mod;
+ if (ret == NULL) {
+ return PyErr_NoMemory();
+ }
for (mod = ldb->modules; mod; mod = mod->next) {
- PyList_Append(ret, PyLdbModule_FromModule(mod));
+ PyObject *item = PyLdbModule_FromModule(mod);
+ int res = 0;
+ if (item == NULL) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Failed to load LdbModule");
+ Py_CLEAR(ret);
+ return NULL;
+ }
+ res = PyList_Append(ret, item);
+ Py_CLEAR(item);
+ if (res == -1) {
+ Py_CLEAR(ret);
+ return NULL;
+ }
}
return ret;
@@ -3426,14 +3462,41 @@ static PyObject *py_ldb_msg_items(PyLdbMessageObject *self)
struct ldb_message *msg = pyldb_Message_AsMessage(self);
Py_ssize_t i, j = 0;
PyObject *l = PyList_New(msg->num_elements + (msg->dn == NULL?0:1));
+ if (l == NULL) {
+ return PyErr_NoMemory();
+ }
if (msg->dn != NULL) {
- PyList_SetItem(l, 0, Py_BuildValue("(sO)", "dn", pyldb_Dn_FromDn(msg->dn)));
+ PyObject *value = NULL;
+ PyObject *obj = pyldb_Dn_FromDn(msg->dn);
+ int res = 0;
+ value = Py_BuildValue("(sO)", "dn", obj);
+ Py_CLEAR(obj);
+ if (value == NULL) {
+ Py_CLEAR(l);
+ return NULL;
+ }
+ res = PyList_SetItem(l, 0, value);
+ if (res == -1) {
+ Py_CLEAR(l);
+ return NULL;
+ }
j++;
}
for (i = 0; i < msg->num_elements; i++, j++) {
+ PyObject *value = NULL;
PyObject *py_el = PyLdbMessageElement_FromMessageElement(&msg->elements[i], msg->elements);
- PyObject *value = Py_BuildValue("(sO)", msg->elements[i].name, py_el);
- PyList_SetItem(l, j, value);
+ int res = 0;
+ Py_CLEAR(py_el);
+ value = Py_BuildValue("(sO)", msg->elements[i].name, py_el);
+ if (value == NULL ) {
+ Py_CLEAR(l);
+ return NULL;
+ }
+ res = PyList_SetItem(l, 0, value);
+ if (res == -1) {
+ Py_CLEAR(l);
+ return NULL;
+ }
}
return l;
}
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 5697b52c4fe..efa80d7cdd1 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -2367,9 +2367,9 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
$self->pidl("MODULE_INIT_FUNC($basename)");
$self->pidl("{");
$self->indent;
- $self->pidl("PyObject *m;");
+ $self->pidl("PyObject *m = NULL;");
foreach my $h (@{$self->{module_imports}}) {
- $self->pidl("PyObject *$h->{'key'};");
+ $self->pidl("PyObject *$h->{'key'} = NULL;");
}
$self->pidl("");
@@ -2378,7 +2378,7 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
my $module_path = $h->{'val'};
$self->pidl("$var_name = PyImport_ImportModule(\"$module_path\");");
$self->pidl("if ($var_name == NULL)");
- $self->pidl("\treturn NULL;");
+ $self->pidl("\tgoto out;");
$self->pidl("");
}
@@ -2391,7 +2391,7 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
$module_var =~ s/\./_/g;
$self->pidl("$type_var = (PyTypeObject *)PyObject_GetAttrString($module_var, \"$pretty_name\");");
$self->pidl("if ($type_var == NULL)");
- $self->pidl("\treturn NULL;");
+ $self->pidl("\tgoto out;");
$self->pidl("");
}
@@ -2399,7 +2399,7 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
foreach (@{$self->{ready_types}}) {
$self->pidl("if (PyType_Ready($_) < 0)");
- $self->pidl("\treturn NULL;");
+ $self->pidl("\tgoto out;");
}
$self->pidl($_) foreach (@{$self->{postreadycode}});
@@ -2415,7 +2415,7 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
$self->pidl("m = PyModule_Create(&moduledef);");
$self->pidl("if (m == NULL)");
- $self->pidl("\treturn NULL;");
+ $self->pidl("\tgoto out;");
$self->pidl("");
foreach my $h (@{$self->{constants}}) {
my $pretty_name = PrettifyTypeName($h->{'key'}, $basename);
@@ -2441,7 +2441,11 @@ static inline PyObject *ndr_PyLong_FromUnsignedLongLong(unsigned long long v)
$self->pidl("#ifdef PY_MOD_".uc($basename)."_PATCH");
$self->pidl("PY_MOD_".uc($basename)."_PATCH(m);");
$self->pidl("#endif");
-
+ $self->pidl("out:");
+ foreach my $h (@{$self->{module_imports}}) {
+ my $mod_var = $h->{'key'};
+ $self->pidl("Py_XDECREF($mod_var);");
+ }
$self->pidl("return m;");
$self->pidl("");
$self->deindent;
diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
index 629ff0a4fd3..5f3e6a8c724 100644
--- a/source3/libsmb/pylibsmb.c
+++ b/source3/libsmb/pylibsmb.c
@@ -1124,13 +1124,14 @@ static NTSTATUS list_helper(const char *mntpoint, struct file_info *finfo,
{
PyObject *result = (PyObject *)state;
PyObject *file = NULL;
+ PyObject *size = NULL;
int ret;
/* suppress '.' and '..' in the results we return */
if (ISDOT(finfo->name) || ISDOTDOT(finfo->name)) {
return NT_STATUS_OK;
}
-
+ size = PyLong_FromUnsignedLongLong(finfo->size);
/*
* Build a dictionary representing the file info.
* Note: Windows does not always return short_name (so it may be None)
@@ -1139,15 +1140,18 @@ static NTSTATUS list_helper(const char *mntpoint, struct file_info *finfo,
"name", finfo->name,
"attrib", (int)finfo->mode,
"short_name", finfo->short_name,
- "size", PyLong_FromUnsignedLongLong(finfo->size),
+ "size", size,
"mtime",
convert_timespec_to_time_t(finfo->mtime_ts));
+ Py_CLEAR(size);
+
if (file == NULL) {
return NT_STATUS_NO_MEMORY;
}
ret = PyList_Append(result, file);
+ Py_CLEAR(file);
if (ret == -1) {
return NT_STATUS_INTERNAL_ERROR;
}
diff --git a/source3/passdb/py_passdb.c b/source3/passdb/py_passdb.c
index 2ac2942a47f..30273141eb7 100644
--- a/source3/passdb/py_passdb.c
+++ b/source3/passdb/py_passdb.c
@@ -1483,6 +1483,8 @@ static PyObject *py_pdb_domain_info(PyObject *self, PyObject *args)
PyObject *py_domain_info;
struct dom_sid *sid;
struct GUID *guid;
+ PyObject *py_dom_sid = NULL;
+ PyObject *py_guid = NULL;
methods = pytalloc_get_ptr(self);
@@ -1506,18 +1508,20 @@ static PyObject *py_pdb_domain_info(PyObject *self, PyObject *args)
}
*guid = domain_info->guid;
- if ((py_domain_info = PyDict_New()) == NULL) {
- PyErr_NoMemory();
- talloc_free(frame);
- return NULL;
- }
+ py_dom_sid = pytalloc_steal(dom_sid_Type, sid);
+ py_guid = pytalloc_steal(guid_Type, guid);
- PyDict_SetItemString(py_domain_info, "name", PyStr_FromString(domain_info->name));
- PyDict_SetItemString(py_domain_info, "dns_domain", PyStr_FromString(domain_info->dns_domain));
- PyDict_SetItemString(py_domain_info, "dns_forest", PyStr_FromString(domain_info->dns_forest));
- PyDict_SetItemString(py_domain_info, "dom_sid", pytalloc_steal(dom_sid_Type, sid));
- PyDict_SetItemString(py_domain_info, "guid", pytalloc_steal(guid_Type, guid));
+ py_domain_info = Py_BuildValue(
+ "{s:s, s:s, s:s, s:O, s:O}",
+ "name", domain_info->name,
+ "dns_domain", domain_info->dns_domain,
+ "dns_forest", domain_info->dns_forest,
+ "dom_sid", py_dom_sid,
+ "guid", py_guid);
+
+ Py_CLEAR(py_dom_sid);
+ Py_CLEAR(py_guid);
talloc_free(frame);
return py_domain_info;
}
@@ -2107,12 +2111,19 @@ static PyObject *py_pdb_enum_group_mapping(PyObject *self, PyObject *args)
for(i=0; i<num_entries; i++) {
py_group_map = py_groupmap_new(&PyGroupmap, NULL, NULL);
if (py_group_map) {
+ int res = 0;
group_map = pytalloc_get_ptr(py_group_map);
*group_map = *gmap[i];
talloc_steal(group_map, gmap[i]->nt_name);
talloc_steal(group_map, gmap[i]->comment);
- PyList_Append(py_gmap_list, py_group_map);
+ res = PyList_Append(py_gmap_list, py_group_map);
+ Py_CLEAR(py_group_map);
+ if (res == -1) {
+ Py_CLEAR(py_gmap_list);
+ talloc_free(frame);
+ return NULL;
+ }
}
}
@@ -2165,8 +2176,18 @@ static PyObject *py_pdb_enum_group_members(PyObject *self, PyObject *args)
domain_sid = get_global_sam_sid();
for(i=0; i<num_members; i++) {
+ int res = 0;
+ PyObject *py_member_sid = NULL;
member_sid = dom_sid_add_rid(frame, domain_sid, member_rids[i]);
- PyList_Append(py_sid_list, pytalloc_steal(dom_sid_Type, member_sid));
+ py_member_sid = pytalloc_steal(dom_sid_Type, member_sid);
+ res = PyList_Append(py_sid_list,
+ py_member_sid);
+ Py_CLEAR(py_member_sid);
+ if (res == -1) {
+ talloc_free(frame);
+ Py_CLEAR(py_sid_list);
+ return NULL;
+ }
}
talloc_free(frame);
@@ -2215,7 +2236,11 @@ static PyObject *py_pdb_enum_group_memberships(PyObject *self, PyObject *args)
}
for(i=0; i<num_groups; i++) {
- PyList_Append(py_sid_list, pytalloc_steal(dom_sid_Type, dom_sid_dup(NULL, &user_group_sids[i])));
+ PyObject *py_sid =
+ pytalloc_steal(dom_sid_Type,
+ dom_sid_dup(NULL, &user_group_sids[i]));
+ PyList_Append(py_sid_list, py_sid);
+ Py_CLEAR(py_sid);
}
talloc_free(frame);
@@ -2375,19 +2400,11 @@ static PyObject *py_pdb_get_aliasinfo(PyObject *self, PyObject *args)
return NULL;
}
- py_alias_info = PyDict_New();
- if (py_alias_info == NULL) {
- PyErr_NoMemory();
- talloc_free(frame);
- return NULL;
- }
-
- PyDict_SetItemString(py_alias_info, "acct_name",
- PyStr_FromString(alias_info->acct_name));
- PyDict_SetItemString(py_alias_info, "acct_desc",
- PyStr_FromString(alias_info->acct_desc));
- PyDict_SetItemString(py_alias_info, "rid",
- PyInt_FromLong(alias_info->rid));
+ py_alias_info = Py_BuildValue(
+ "{s:s, s:s, s:l}",
+ "acct_name", alias_info->acct_name,
+ "acct_desc", alias_info->acct_desc,
+ "rid", alias_info->rid);
talloc_free(frame);
return py_alias_info;
@@ -2543,15 +2560,23 @@ static PyObject *py_pdb_enum_aliasmem(PyObject *self, PyObject *args)
}
for(i=0; i<num_members; i++) {
+ int res = 0;
py_member_sid = pytalloc_new(struct dom_sid, dom_sid_Type);
if (py_member_sid == NULL) {
PyErr_NoMemory();
+ Py_CLEAR(py_member_list);
talloc_free(frame);
return NULL;
}
tmp_sid = pytalloc_get_ptr(py_member_sid);
*tmp_sid = member_sid[i];
- PyList_Append(py_member_list, py_member_sid);
+ res = PyList_Append(py_member_list, py_member_sid);
+ Py_CLEAR(py_member_sid);
+ if (res == -1) {
+ Py_CLEAR(py_member_list);
+ talloc_free(frame);
+ return NULL;
+ }
}
talloc_free(frame);
@@ -2584,7 +2609,20 @@ static PyObject *py_pdb_get_account_policy(PyObject *self, PyObject *unused)
type = account_policy_name_to_typenum(names[i]);
status = methods->get_account_policy(methods, type, &value);
if (NT_STATUS_IS_OK(status)) {
- PyDict_SetItemString(py_acct_policy, names[i], Py_BuildValue("i", value));
+ int res = 0;
+ PyObject *py_value = Py_BuildValue("i", value);
+ if (py_value == NULL) {
+ Py_CLEAR(py_acct_policy);
+ break;
+ }
+ res = PyDict_SetItemString(py_acct_policy,
+ names[i],
+ py_value);
+ Py_CLEAR(py_value);
+ if (res == -1) {
+ Py_CLEAR(py_acct_policy);
+ break;
+ }
}
}
@@ -2672,21 +2710,30 @@ static PyObject *py_pdb_search_users(PyObject *self, PyObject *args)
}
while (search->next_entry(search, entry)) {
- py_dict = PyDict_New();
+ int res = 1;
+ py_dict = Py_BuildValue(
+ "{s:l, s:l, s:l, s:s, s:s, s:s}",
+ "idx", entry->idx,
+ "rid", entry->rid,
+ "acct_flags", entry->acct_flags,
+ "account_name", entry->account_name,
+ "fullname", entry->fullname,
+ "description", entry->description);
if (py_dict == NULL) {
- PyErr_NoMemory();
- } else {
- PyDict_SetItemString(py_dict, "idx", PyInt_FromLong(entry->idx));
- PyDict_SetItemString(py_dict, "rid", PyInt_FromLong(entry->rid));
- PyDict_SetItemString(py_dict, "acct_flags", PyInt_FromLong(entry->acct_flags));
- PyDict_SetItemString(py_dict, "account_name", PyStr_FromString(entry->account_name));
- PyDict_SetItemString(py_dict, "fullname", PyStr_FromString(entry->fullname));
- PyDict_SetItemString(py_dict, "description", PyStr_FromString(entry->description));
- PyList_Append(py_userlist, py_dict);
+ Py_CLEAR(py_userlist);
+ goto out;
+ }
+
+ res = PyList_Append(py_userlist, py_dict);
+ Py_CLEAR(py_dict);
+ if (res == -1) {
+ Py_CLEAR(py_userlist);
+ goto out;
}
}
search->search_end(search);
+out:
talloc_free(frame);
return py_userlist;
}
@@ -2730,21 +2777,30 @@ static PyObject *py_pdb_search_groups(PyObject *self, PyObject *unused)
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list