Kaydet (Commit) 992ded8f authored tarafından Guido van Rossum's avatar Guido van Rossum

fix free memory reads in dictlookup et al

üst e5fe4af0
...@@ -761,7 +761,7 @@ typeobject Mappingtype = { ...@@ -761,7 +761,7 @@ typeobject Mappingtype = {
/* For backward compatibility with old dictionary interface */ /* For backward compatibility with old dictionary interface */
static object *last_name_object; static object *last_name_object;
static char *last_name_char; static char *last_name_char; /* NULL or == getstringvalue(last_name_object) */
object * object *
getattro(v, name) getattro(v, name)
...@@ -797,15 +797,14 @@ dictlookup(v, key) ...@@ -797,15 +797,14 @@ dictlookup(v, key)
object *v; object *v;
char *key; char *key;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return NULL; return NULL;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappinglookup(v, last_name_object); return mappinglookup(v, last_name_object);
} }
...@@ -816,15 +815,14 @@ dictinsert(v, key, item) ...@@ -816,15 +815,14 @@ dictinsert(v, key, item)
char *key; char *key;
object *item; object *item;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return -1; return -1;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappinginsert(v, last_name_object, item); return mappinginsert(v, last_name_object, item);
} }
...@@ -834,15 +832,14 @@ dictremove(v, key) ...@@ -834,15 +832,14 @@ dictremove(v, key)
object *v; object *v;
char *key; char *key;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return -1; return -1;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappingremove(v, last_name_object); return mappingremove(v, last_name_object);
} }
...@@ -761,7 +761,7 @@ typeobject Mappingtype = { ...@@ -761,7 +761,7 @@ typeobject Mappingtype = {
/* For backward compatibility with old dictionary interface */ /* For backward compatibility with old dictionary interface */
static object *last_name_object; static object *last_name_object;
static char *last_name_char; static char *last_name_char; /* NULL or == getstringvalue(last_name_object) */
object * object *
getattro(v, name) getattro(v, name)
...@@ -797,15 +797,14 @@ dictlookup(v, key) ...@@ -797,15 +797,14 @@ dictlookup(v, key)
object *v; object *v;
char *key; char *key;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return NULL; return NULL;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappinglookup(v, last_name_object); return mappinglookup(v, last_name_object);
} }
...@@ -816,15 +815,14 @@ dictinsert(v, key, item) ...@@ -816,15 +815,14 @@ dictinsert(v, key, item)
char *key; char *key;
object *item; object *item;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return -1; return -1;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappinginsert(v, last_name_object, item); return mappinginsert(v, last_name_object, item);
} }
...@@ -834,15 +832,14 @@ dictremove(v, key) ...@@ -834,15 +832,14 @@ dictremove(v, key)
object *v; object *v;
char *key; char *key;
{ {
if (key != last_name_char || if (key != last_name_char) {
strcmp(key, getstringvalue(last_name_object)) != 0) {
XDECREF(last_name_object); XDECREF(last_name_object);
last_name_object = newstringobject(key); last_name_object = newstringobject(key);
if (last_name_object == NULL) { if (last_name_object == NULL) {
last_name_char = NULL; last_name_char = NULL;
return -1; return -1;
} }
last_name_char = key; last_name_char = getstringvalue(last_name_object);
} }
return mappingremove(v, last_name_object); return mappingremove(v, last_name_object);
} }
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