From fb36c7acffe29bcc3ff026aac55a4fdb745f0b16 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Fri, 6 Jul 2018 23:39:39 +0000 Subject: [PATCH] Add type_getattro.patch because it is no longer downloadable (#43130) See https://github.com/NixOS/nixpkgs/commit/f2f7c4287ff257e7c219737b0d7416a7965c0c3e --- .../python/cpython/2.7/default.nix | 2 +- .../python/cpython/2.7/type_getattro.patch | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 pkgs/development/interpreters/python/cpython/2.7/type_getattro.patch diff --git a/pkgs/development/interpreters/python/cpython/2.7/default.nix b/pkgs/development/interpreters/python/cpython/2.7/default.nix index 8dd4d9ad4fa..cd1a0fc6e18 100644 --- a/pkgs/development/interpreters/python/cpython/2.7/default.nix +++ b/pkgs/development/interpreters/python/cpython/2.7/default.nix @@ -73,7 +73,7 @@ let # https://github.com/python/cpython/pull/6118 (fetchpatch { name = "type_getattro.patch"; - url = "https://github.com/python/cpython/pull/6118/commits/8c6da2d7e7e719c40fb539b7f7cb7583cccc5527.patch"; + url = "file://${./type_getattro.patch}"; sha256 = "11v9yx20hs3jmw0wggzvmw39qs4mxay4kb8iq2qjydwy9ya61nrd"; }) ] ++ optionals (x11Support && stdenv.isDarwin) [ diff --git a/pkgs/development/interpreters/python/cpython/2.7/type_getattro.patch b/pkgs/development/interpreters/python/cpython/2.7/type_getattro.patch new file mode 100644 index 00000000000..c69c86b642b --- /dev/null +++ b/pkgs/development/interpreters/python/cpython/2.7/type_getattro.patch @@ -0,0 +1,62 @@ +--- a/Objects/typeobject.c ++++ b/Objects/typeobject.c +@@ -3137,6 +3137,7 @@ + PyTypeObject *metatype = Py_TYPE(type); + PyObject *meta_attribute, *attribute; + descrgetfunc meta_get; ++ PyObject* res; + + if (!PyUnicode_Check(name)) { + PyErr_Format(PyExc_TypeError, +@@ -3158,6 +3159,7 @@ + meta_attribute = _PyType_Lookup(metatype, name); + + if (meta_attribute != NULL) { ++ Py_INCREF(meta_attribute); + meta_get = Py_TYPE(meta_attribute)->tp_descr_get; + + if (meta_get != NULL && PyDescr_IsData(meta_attribute)) { +@@ -3165,10 +3167,11 @@ + * writes. Assume the attribute is not overridden in + * type's tp_dict (and bases): call the descriptor now. + */ +- return meta_get(meta_attribute, (PyObject *)type, +- (PyObject *)metatype); ++ res = meta_get(meta_attribute, (PyObject *)type, ++ (PyObject *)metatype); ++ Py_DECREF(meta_attribute); ++ return res; + } +- Py_INCREF(meta_attribute); + } + + /* No data descriptor found on metatype. Look in tp_dict of this +@@ -3176,6 +3179,7 @@ + attribute = _PyType_Lookup(type, name); + if (attribute != NULL) { + /* Implement descriptor functionality, if any */ ++ Py_INCREF(attribute); + descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get; + + Py_XDECREF(meta_attribute); +@@ -3183,11 +3187,12 @@ + if (local_get != NULL) { + /* NULL 2nd argument indicates the descriptor was + * found on the target object itself (or a base) */ +- return local_get(attribute, (PyObject *)NULL, +- (PyObject *)type); ++ res = local_get(attribute, (PyObject *)NULL, ++ (PyObject *)type); ++ Py_DECREF(attribute); ++ return res; + } + +- Py_INCREF(attribute); + return attribute; + } + +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-14-21-42-17.bpo-25750.lxgkQz.rst +@@ -0,0 +1,2 @@ ++Fix rare Python crash due to bad refcounting in ``type_getattro()`` if a ++descriptor deletes itself from the class.