Commit 3be7140d authored by Guido van Rossum's avatar Guido van Rossum

Rewritten keys() and has_key() to avoid memory leaks.

parent 9e720e39
...@@ -187,38 +187,44 @@ dbm_keys(dp, args) ...@@ -187,38 +187,44 @@ dbm_keys(dp, args)
object *args; object *args;
{ {
register object *v, *item; register object *v, *item;
datum key, okey={ (char *)NULL, 0}; datum key, nextkey;
int err; int err;
if (dp == NULL || !is_dbmobject(dp)) { if (dp == NULL || !is_dbmobject(dp)) {
err_badcall(); err_badcall();
return NULL; return NULL;
} }
if (!getnoarg(args)) if (!getnoarg(args))
return NULL; return NULL;
v = newlistobject(0); v = newlistobject(0);
if (v == NULL) if (v == NULL)
return 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); item = newsizedstringobject(key.dptr, key.dsize);
if (item == 0) { if (item == NULL) {
DECREF(v); free(key.dptr);
return NULL; DECREF(v);
return NULL;
} }
err = addlistitem(v, item); err = addlistitem(v, item);
DECREF(item); DECREF(item);
if(okey.dsize) free(okey.dptr);
if (err != 0) { if (err != 0) {
DECREF(v); free(key.dptr);
return NULL; DECREF(v);
return NULL;
} }
okey=key; nextkey = gdbm_nextkey(dp->di_dbm, key);
free(key.dptr);
key = nextkey;
} }
return v; return v;
} }
static object * static object *
dbm_has_key(dp, args) dbm_has_key(dp, args)
register dbmobject *dp; register dbmobject *dp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment