+++ /dev/null
-"""
-PyDict_GetItem() returns a borrowed reference.
-There are probably a number of places that are open to attacks
-such as the following one, in bltinmodule.c:min_max().
-"""
-
-class KeyFunc(object):
- def __call__(self, n):
- del d['key']
- return 1
-
-
-d = {'key': KeyFunc()}
-min(range(10), **d)
+++ /dev/null
-"""
-PyDict_GetItem() returns a borrowed reference.
-This attack is against ceval.c:IMPORT_NAME, which calls an
-object (__builtin__.__import__) without holding a reference to it.
-"""
-
-import types
-import __builtin__
-
-
-class X(object):
- def __getattr__(self, name):
- # this is called with name == '__bases__' by PyObject_IsInstance()
- # during the unbound method call -- it frees the unbound method
- # itself before it invokes its im_func.
- del __builtin__.__import__
- return ()
-
-pseudoclass = X()
-
-class Y(object):
- def __call__(self, *args):
- # 'self' was freed already
- print self, args
-
-# make an unbound method
-__builtin__.__import__ = types.MethodType(Y(), None, (pseudoclass, str))
-import spam
"%s() got an unexpected keyword argument", name);
return NULL;
}
+ Py_INCREF(keyfunc);
}
it = PyObject_GetIter(v);
- if (it == NULL)
+ if (it == NULL) {
+ Py_XDECREF(keyfunc);
return NULL;
+ }
maxitem = NULL; /* the result */
maxval = NULL; /* the value associated with the result */
else
Py_DECREF(maxval);
Py_DECREF(it);
+ Py_XDECREF(keyfunc);
return maxitem;
Fail_it_item_and_val:
Py_XDECREF(maxval);
Py_XDECREF(maxitem);
Py_DECREF(it);
+ Py_XDECREF(keyfunc);
return NULL;
}
"__import__ not found");
break;
}
+ Py_INCREF(x);
v = POP();
u = TOP();
if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
Py_DECREF(u);
if (w == NULL) {
u = POP();
+ Py_DECREF(x);
x = NULL;
break;
}
READ_TIMESTAMP(intr0);
- x = PyEval_CallObject(x, w);
+ v = x;
+ x = PyEval_CallObject(v, w);
+ Py_DECREF(v);
READ_TIMESTAMP(intr1);
Py_DECREF(w);
SET_TOP(x);