mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
Rewritten keys() and has_key() to avoid memory leaks.
This commit is contained in:
parent
9e720e390a
commit
3be7140d31
1 changed files with 17 additions and 11 deletions
|
@ -187,38 +187,44 @@ dbm_keys(dp, args)
|
|||
object *args;
|
||||
{
|
||||
register object *v, *item;
|
||||
datum key, okey={ (char *)NULL, 0};
|
||||
datum key, nextkey;
|
||||
int err;
|
||||
|
||||
if (dp == NULL || !is_dbmobject(dp)) {
|
||||
err_badcall();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!getnoarg(args))
|
||||
return NULL;
|
||||
|
||||
v = newlistobject(0);
|
||||
if (v == NULL)
|
||||
return NULL;
|
||||
for (key = gdbm_firstkey(dp->di_dbm); key.dptr;
|
||||
key = gdbm_nextkey(dp->di_dbm,okey) ) {
|
||||
|
||||
key = gdbm_firstkey(dp->di_dbm);
|
||||
while (key.dptr) {
|
||||
item = newsizedstringobject(key.dptr, key.dsize);
|
||||
if (item == 0) {
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
if (item == NULL) {
|
||||
free(key.dptr);
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
}
|
||||
err = addlistitem(v, item);
|
||||
DECREF(item);
|
||||
if(okey.dsize) free(okey.dptr);
|
||||
if (err != 0) {
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
free(key.dptr);
|
||||
DECREF(v);
|
||||
return NULL;
|
||||
}
|
||||
okey=key;
|
||||
nextkey = gdbm_nextkey(dp->di_dbm, key);
|
||||
free(key.dptr);
|
||||
key = nextkey;
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
static object *
|
||||
dbm_has_key(dp, args)
|
||||
register dbmobject *dp;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue