summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authortron <tron>2012-03-24 12:04:36 +0000
committertron <tron>2012-03-24 12:04:36 +0000
commitb5c7fe438a680c98a182817296a9d691014d7715 (patch)
treed9d825efe987f0d093e868c18af3cbb510e7a694 /lang
parentb797e7dece9c458ead6990628e85e51280edc88c (diff)
downloadpkgsrc-b5c7fe438a680c98a182817296a9d691014d7715.tar.gz
Add a fix for the DoS vulnerability reported in CVE-2012-1150 taken
from the Python Mercurial repository.
Diffstat (limited to 'lang')
-rw-r--r--lang/python27/Makefile4
-rw-r--r--lang/python27/distinfo30
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Doc_library_sys.rst16
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Doc_reference_datamodel.rst17
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Doc_using_cmdline.rst75
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Include_object.h21
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Include_pydebug.h16
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Include_pythonrun.h17
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_os.py31
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_cmd_line.py29
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_compiler.py19
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_hash.py129
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_os.py67
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_set.py73
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_support.py19
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_sys.py17
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Misc_NEWS20
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Misc_python.man58
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Modules_main.c59
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Modules_posixmodule.c165
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Objects_bufferobject.c30
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Objects_object.c17
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Objects_stringobject.c31
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Objects_unicodeobject.c31
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-PCbuild_pythoncore.vcproj1840
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Python_pythonrun.c37
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Python_random.c311
-rw-r--r--lang/python27/patches/patch-CVE-2012-1150-Python_sysmodule.c36
-rw-r--r--lang/python27/patches/patch-au32
29 files changed, 3238 insertions, 9 deletions
diff --git a/lang/python27/Makefile b/lang/python27/Makefile
index 24adc2005da..bf2d1d416fd 100644
--- a/lang/python27/Makefile
+++ b/lang/python27/Makefile
@@ -1,9 +1,9 @@
-# $NetBSD: Makefile,v 1.13 2012/03/16 14:21:36 abs Exp $
+# $NetBSD: Makefile,v 1.14 2012/03/24 12:04:36 tron Exp $
.include "dist.mk"
PKGNAME= python27-${PY_DISTVERSION}
-PKGREVISION= 2
+PKGREVISION= 3
CATEGORIES= lang python
MAINTAINER= pkgsrc-users@NetBSD.org
diff --git a/lang/python27/distinfo b/lang/python27/distinfo
index 56309c3aad7..22705482483 100644
--- a/lang/python27/distinfo
+++ b/lang/python27/distinfo
@@ -1,9 +1,35 @@
-$NetBSD: distinfo,v 1.15 2012/02/15 16:08:26 drochner Exp $
+$NetBSD: distinfo,v 1.16 2012/03/24 12:04:36 tron Exp $
SHA1 (Python-2.7.2.tar.bz2) = 417bdeea77abfaf1b9257fc6b4a04aaa209f4547
RMD160 (Python-2.7.2.tar.bz2) = c3bf4f09b7c429a4d9f4cc251c795304cd5232c5
Size (Python-2.7.2.tar.bz2) = 11754834 bytes
SHA1 (patch-CVE-2012-0845) = 1c0a8d7224b6b5cb65b24d38ac0967f8f8fb2da9
+SHA1 (patch-CVE-2012-1150-Doc_library_sys.rst) = 8580d187abaed9dce948988e50749be7527ee0f8
+SHA1 (patch-CVE-2012-1150-Doc_reference_datamodel.rst) = f145207d4cc32643e78fcac9d204089406dc96fe
+SHA1 (patch-CVE-2012-1150-Doc_using_cmdline.rst) = fadd6f4822219adccd2268fd1fd0bf2bc330c994
+SHA1 (patch-CVE-2012-1150-Include_object.h) = 18559b16c80e08b8df62bb5c06a34c92105e56d9
+SHA1 (patch-CVE-2012-1150-Include_pydebug.h) = f71040bfbf930384c1fd4f3258c89e86259e7a52
+SHA1 (patch-CVE-2012-1150-Include_pythonrun.h) = cd8b8dfd673a81b231f1a35074ec73aba3c999ce
+SHA1 (patch-CVE-2012-1150-Lib_os.py) = b7217bb7c7a3aeb974e65754f4314e76d65e0e12
+SHA1 (patch-CVE-2012-1150-Lib_test_test_cmd_line.py) = e55f48b43a4d41d05e2aa2b40f1a4f43d0d99eb9
+SHA1 (patch-CVE-2012-1150-Lib_test_test_compiler.py) = 27186659371dacee553a2fc9065db639f3336425
+SHA1 (patch-CVE-2012-1150-Lib_test_test_hash.py) = 8107307dc1bd6516280c464e631cf811e0cd59b4
+SHA1 (patch-CVE-2012-1150-Lib_test_test_os.py) = c3724a7346e3fc8d3003bd26a0556668b0896f5c
+SHA1 (patch-CVE-2012-1150-Lib_test_test_set.py) = a19cfff0a38411a19aadc4294b6f24deabaa4aab
+SHA1 (patch-CVE-2012-1150-Lib_test_test_support.py) = f635d3135f9a3e3387f6a2e6e00b054969f78d3c
+SHA1 (patch-CVE-2012-1150-Lib_test_test_sys.py) = 887f1f50b5e6102e334a73a451211addb9d4263a
+SHA1 (patch-CVE-2012-1150-Misc_NEWS) = 807b7bb73542861262890ea0a57dd13e193042ab
+SHA1 (patch-CVE-2012-1150-Misc_python.man) = d89d9258a4dad8de5a22e8625df03d6da34ea92c
+SHA1 (patch-CVE-2012-1150-Modules_main.c) = b79a20d671062039ba580921cfa1f06634cca135
+SHA1 (patch-CVE-2012-1150-Modules_posixmodule.c) = 1a252303f6adc29150e0a109f78ceb1a54bbc28d
+SHA1 (patch-CVE-2012-1150-Objects_bufferobject.c) = 383878c6b8767b3cce7a9b83890f8f79d1deac94
+SHA1 (patch-CVE-2012-1150-Objects_object.c) = bd134011028c0c73d95007878ad16499a3125a98
+SHA1 (patch-CVE-2012-1150-Objects_stringobject.c) = 6efc29891d04fd0112d88ce2898ef2bdd5f47718
+SHA1 (patch-CVE-2012-1150-Objects_unicodeobject.c) = 499b80ed541b49dfb3fbf49c2a18b30f89703f2c
+SHA1 (patch-CVE-2012-1150-PCbuild_pythoncore.vcproj) = 17277d7d82a10cd32c9cb35510a8c76f620536ed
+SHA1 (patch-CVE-2012-1150-Python_pythonrun.c) = 8ae9796a18145d3d6261aad1390ede9ab4c6d6c9
+SHA1 (patch-CVE-2012-1150-Python_random.c) = 71c4bcc6e781240ad91b1679c9790e77b770eeb9
+SHA1 (patch-CVE-2012-1150-Python_sysmodule.c) = cb14822430f9dcbaf34c10b211065cb9f244d963
SHA1 (patch-Mac_Modules_fm___Fmmodule.c) = b9314bccb51b4fe672b81559068f7a79d2965f94
SHA1 (patch-Mac_Modules_qd___Qdmodule.c) = 45c748b15b9436d45ba137460389638aa7108c8d
SHA1 (patch-Mac_Modules_qdoffs___Qdoffsmodule.c) = 9994f0c1a908f18f1f3df3f05b184f082c018365
@@ -16,7 +42,7 @@ SHA1 (patch-al) = b97c2e73b9038e22f55ec226c2cbcc671466ad19
SHA1 (patch-am) = f56a53eb9f4694913d317c09e162bdd413f8f38f
SHA1 (patch-an) = 6098fbf0fc31422196cc40d3a227934523db11ca
SHA1 (patch-ao) = 9996a444fc0034c9f01fd18f4ad7bf714a8c8d04
-SHA1 (patch-au) = 18fce68df48e43c2927cc83e6b4b404b5e1103b7
+SHA1 (patch-au) = 15b30cb5c77d2916538a390d9a08c0675ac01970
SHA1 (patch-av) = a14eaf4d5db6fc3b79ed896fbfcc34ca98051af2
SHA1 (patch-aw) = 15652e241f371a22c7300f46771825ea74514fa0
SHA1 (patch-ax) = bdb8e6555f36b1603c553e03a2d6d772e50c623b
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Doc_library_sys.rst b/lang/python27/patches/patch-CVE-2012-1150-Doc_library_sys.rst
new file mode 100644
index 00000000000..7be9d0a2c7c
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Doc_library_sys.rst
@@ -0,0 +1,16 @@
+$NetBSD: patch-CVE-2012-1150-Doc_library_sys.rst,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Doc/library/sys.rst.orig 2011-06-11 16:46:23.000000000 +0100
++++ Doc/library/sys.rst 2012-03-24 11:02:25.000000000 +0000
+@@ -287,6 +287,7 @@
+ :const:`verbose` :option:`-v`
+ :const:`unicode` :option:`-U`
+ :const:`bytes_warning` :option:`-b`
++ :const:`hash_randomization` :option:`-R`
+ ============================= ===================================
+
+ .. versionadded:: 2.6
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Doc_reference_datamodel.rst b/lang/python27/patches/patch-CVE-2012-1150-Doc_reference_datamodel.rst
new file mode 100644
index 00000000000..860c5c28c03
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Doc_reference_datamodel.rst
@@ -0,0 +1,17 @@
+$NetBSD: patch-CVE-2012-1150-Doc_reference_datamodel.rst,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Doc/reference/datamodel.rst.orig 2011-06-11 16:46:23.000000000 +0100
++++ Doc/reference/datamodel.rst 2012-03-24 11:02:25.000000000 +0000
+@@ -1282,6 +1282,8 @@
+ modules are still available at the time when the :meth:`__del__` method is
+ called.
+
++ See also the :option:`-R` command-line option.
++
+
+ .. method:: object.__repr__(self)
+
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Doc_using_cmdline.rst b/lang/python27/patches/patch-CVE-2012-1150-Doc_using_cmdline.rst
new file mode 100644
index 00000000000..95824763a3f
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Doc_using_cmdline.rst
@@ -0,0 +1,75 @@
+$NetBSD: patch-CVE-2012-1150-Doc_using_cmdline.rst,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Doc/using/cmdline.rst.orig 2011-06-11 16:46:23.000000000 +0100
++++ Doc/using/cmdline.rst 2012-03-24 11:02:25.000000000 +0000
+@@ -24,7 +24,7 @@
+
+ When invoking Python, you may specify any of these options::
+
+- python [-BdEiOQsStuUvVWxX3?] [-c command | -m module-name | script | - ] [args]
++ python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args]
+
+ The most common use case is, of course, a simple invocation of a script::
+
+@@ -253,6 +253,29 @@
+ :pep:`238` -- Changing the division operator
+
+
++.. cmdoption:: -R
++
++ Turn on hash randomization, so that the :meth:`__hash__` values of str,
++ bytes and datetime objects are "salted" with an unpredictable random value.
++ Although they remain constant within an individual Python process, they are
++ not predictable between repeated invocations of Python.
++
++ This is intended to provide protection against a denial-of-service caused by
++ carefully-chosen inputs that exploit the worst case performance of a dict
++ insertion, O(n^2) complexity. See
++ http://www.ocert.org/advisories/ocert-2011-003.html for details.
++
++ Changing hash values affects the order in which keys are retrieved from a
++ dict. Although Python has never made guarantees about this ordering (and it
++ typically varies between 32-bit and 64-bit builds), enough real-world code
++ implicitly relies on this non-guaranteed behavior that the randomization is
++ disabled by default.
++
++ See also :envvar:`PYTHONHASHSEED`.
++
++ .. versionadded:: 2.6.8
++
++
+ .. cmdoption:: -s
+
+ Don't add user site directory to sys.path
+@@ -521,6 +544,27 @@
+
+ .. versionadded:: 2.6
+
++.. envvar:: PYTHONHASHSEED
++
++ If this variable is set to ``random``, the effect is the same as specifying
++ the :option:`-R` option: a random value is used to seed the hashes of str,
++ bytes and datetime objects.
++
++ If :envvar:`PYTHONHASHSEED` is set to an integer value, it is used as a
++ fixed seed for generating the hash() of the types covered by the hash
++ randomization.
++
++ Its purpose is to allow repeatable hashing, such as for selftests for the
++ interpreter itself, or to allow a cluster of python processes to share hash
++ values.
++
++ The integer must be a decimal number in the range [0,4294967295].
++ Specifying the value 0 will lead to the same hash values as when hash
++ randomization is disabled.
++
++ .. versionadded:: 2.6.8
++
++
+ .. envvar:: PYTHONIOENCODING
+
+ Overrides the encoding used for stdin/stdout/stderr, in the syntax
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Include_object.h b/lang/python27/patches/patch-CVE-2012-1150-Include_object.h
new file mode 100644
index 00000000000..a63bc2f1e8e
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Include_object.h
@@ -0,0 +1,21 @@
+$NetBSD: patch-CVE-2012-1150-Include_object.h,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Include/object.h.orig 2011-06-11 16:46:23.000000000 +0100
++++ Include/object.h 2012-03-24 11:02:25.000000000 +0000
+@@ -517,6 +517,12 @@
+ PyAPI_FUNC(long) _Py_HashDouble(double);
+ PyAPI_FUNC(long) _Py_HashPointer(void*);
+
++typedef struct {
++ long prefix;
++ long suffix;
++} _Py_HashSecret_t;
++PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret;
++
+ /* Helper for passing objects to printf and the like */
+ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj))
+
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Include_pydebug.h b/lang/python27/patches/patch-CVE-2012-1150-Include_pydebug.h
new file mode 100644
index 00000000000..5395e087bc3
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Include_pydebug.h
@@ -0,0 +1,16 @@
+$NetBSD: patch-CVE-2012-1150-Include_pydebug.h,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Include/pydebug.h.orig 2011-06-11 16:46:23.000000000 +0100
++++ Include/pydebug.h 2012-03-24 11:02:25.000000000 +0000
+@@ -26,6 +26,7 @@
+ PyAPI_DATA(int) _Py_QnewFlag;
+ /* Warn about 3.x issues */
+ PyAPI_DATA(int) Py_Py3kWarningFlag;
++PyAPI_DATA(int) Py_HashRandomizationFlag;
+
+ /* this is a wrapper around getenv() that pays attention to
+ Py_IgnoreEnvironmentFlag. It should be used for getting variables like
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Include_pythonrun.h b/lang/python27/patches/patch-CVE-2012-1150-Include_pythonrun.h
new file mode 100644
index 00000000000..c7368b49d0a
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Include_pythonrun.h
@@ -0,0 +1,17 @@
+$NetBSD: patch-CVE-2012-1150-Include_pythonrun.h,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Include/pythonrun.h.orig 2011-06-11 16:46:23.000000000 +0100
++++ Include/pythonrun.h 2012-03-24 11:02:25.000000000 +0000
+@@ -171,6 +171,8 @@
+ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int);
+ PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t);
+
++/* Random */
++PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size);
+
+ #ifdef __cplusplus
+ }
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_os.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_os.py
new file mode 100644
index 00000000000..ebbb7749a35
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_os.py
@@ -0,0 +1,31 @@
+$NetBSD: patch-CVE-2012-1150-Lib_os.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/os.py.orig 2011-06-11 16:46:24.000000000 +0100
++++ Lib/os.py 2012-03-24 11:02:25.000000000 +0000
+@@ -738,22 +738,3 @@
+ _make_statvfs_result)
+ except NameError: # statvfs_result may not exist
+ pass
+-
+-if not _exists("urandom"):
+- def urandom(n):
+- """urandom(n) -> str
+-
+- Return a string of n random bytes suitable for cryptographic use.
+-
+- """
+- try:
+- _urandomfd = open("/dev/urandom", O_RDONLY)
+- except (OSError, IOError):
+- raise NotImplementedError("/dev/urandom (or equivalent) not found")
+- try:
+- bs = b""
+- while n > len(bs):
+- bs += read(_urandomfd, n - len(bs))
+- finally:
+- close(_urandomfd)
+- return bs
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_cmd_line.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_cmd_line.py
new file mode 100644
index 00000000000..86dc010262e
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_cmd_line.py
@@ -0,0 +1,29 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_cmd_line.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/test/test_cmd_line.py.orig 2011-06-11 16:46:25.000000000 +0100
++++ Lib/test/test_cmd_line.py 2012-03-24 11:02:25.000000000 +0000
+@@ -86,6 +86,20 @@
+ self.exit_code('-c', 'pass'),
+ 0)
+
++ def test_hash_randomization(self):
++ # Verify that -R enables hash randomization:
++ self.verify_valid_flag('-R')
++ hashes = []
++ for i in range(2):
++ code = 'print(hash("spam"))'
++ data = self.start_python('-R', '-c', code)
++ hashes.append(data)
++ self.assertNotEqual(hashes[0], hashes[1])
++
++ # Verify that sys.flags contains hash_randomization
++ code = 'import sys; print sys.flags'
++ data = self.start_python('-R', '-c', code)
++ self.assertTrue('hash_randomization=1' in data)
+
+ def test_main():
+ test.test_support.run_unittest(CmdLineTest)
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_compiler.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_compiler.py
new file mode 100644
index 00000000000..ac82658b69d
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_compiler.py
@@ -0,0 +1,19 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_compiler.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/e3fb353b3fd4
+
+--- Lib/test/test_compiler.py.orig 2011-06-11 16:46:25.000000000 +0100
++++ Lib/test/test_compiler.py 2012-03-24 11:48:09.000000000 +0000
+@@ -28,8 +28,8 @@
+ libdir = os.path.dirname(os.__file__)
+ testdir = os.path.dirname(test.test_support.__file__)
+
+- for dir in [libdir, testdir]:
+- for basename in os.listdir(dir):
++ for dir in [testdir]:
++ for basename in "test_os.py",:
+ # Print still working message since this test can be really slow
+ if next_time <= time.time():
+ next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_hash.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_hash.py
new file mode 100644
index 00000000000..19263f3c9f0
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_hash.py
@@ -0,0 +1,129 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_hash.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/test/test_hash.py.orig 2011-06-11 16:46:25.000000000 +0100
++++ Lib/test/test_hash.py 2012-03-24 11:02:25.000000000 +0000
+@@ -3,10 +3,18 @@
+ #
+ # Also test that hash implementations are inherited as expected
+
++import os
++import sys
++import struct
++import datetime
+ import unittest
++import subprocess
++
+ from test import test_support
+ from collections import Hashable
+
++IS_64BIT = (struct.calcsize('l') == 8)
++
+
+ class HashEqualityTestCase(unittest.TestCase):
+
+@@ -134,10 +142,100 @@
+ for obj in self.hashes_to_check:
+ self.assertEqual(hash(obj), _default_hash(obj))
+
++class HashRandomizationTests(unittest.TestCase):
++
++ # Each subclass should define a field "repr_", containing the repr() of
++ # an object to be tested
++
++ def get_hash_command(self, repr_):
++ return 'print(hash(%s))' % repr_
++
++ def get_hash(self, repr_, seed=None):
++ env = os.environ.copy()
++ if seed is not None:
++ env['PYTHONHASHSEED'] = str(seed)
++ else:
++ env.pop('PYTHONHASHSEED', None)
++ cmd_line = [sys.executable, '-c', self.get_hash_command(repr_)]
++ p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
++ stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
++ env=env)
++ out, err = p.communicate()
++ out = test_support.strip_python_stderr(out)
++ return int(out.strip())
++
++ def test_randomized_hash(self):
++ # two runs should return different hashes
++ run1 = self.get_hash(self.repr_, seed='random')
++ run2 = self.get_hash(self.repr_, seed='random')
++ self.assertNotEqual(run1, run2)
++
++class StringlikeHashRandomizationTests(HashRandomizationTests):
++ def test_null_hash(self):
++ # PYTHONHASHSEED=0 disables the randomized hash
++ if IS_64BIT:
++ known_hash_of_obj = 1453079729188098211
++ else:
++ known_hash_of_obj = -1600925533
++
++ # Randomization is disabled by default:
++ self.assertEqual(self.get_hash(self.repr_), known_hash_of_obj)
++
++ # It can also be disabled by setting the seed to 0:
++ self.assertEqual(self.get_hash(self.repr_, seed=0), known_hash_of_obj)
++
++ def test_fixed_hash(self):
++ # test a fixed seed for the randomized hash
++ # Note that all types share the same values:
++ if IS_64BIT:
++ h = -4410911502303878509
++ else:
++ h = -206076799
++ self.assertEqual(self.get_hash(self.repr_, seed=42), h)
++
++class StrHashRandomizationTests(StringlikeHashRandomizationTests):
++ repr_ = repr('abc')
++
++ def test_empty_string(self):
++ self.assertEqual(hash(""), 0)
++
++class UnicodeHashRandomizationTests(StringlikeHashRandomizationTests):
++ repr_ = repr(u'abc')
++
++ def test_empty_string(self):
++ self.assertEqual(hash(u""), 0)
++
++class BufferHashRandomizationTests(StringlikeHashRandomizationTests):
++ repr_ = 'buffer("abc")'
++
++ def test_empty_string(self):
++ self.assertEqual(hash(buffer("")), 0)
++
++class DatetimeTests(HashRandomizationTests):
++ def get_hash_command(self, repr_):
++ return 'import datetime; print(hash(%s))' % repr_
++
++class DatetimeDateTests(DatetimeTests):
++ repr_ = repr(datetime.date(1066, 10, 14))
++
++class DatetimeDatetimeTests(DatetimeTests):
++ repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7))
++
++class DatetimeTimeTests(DatetimeTests):
++ repr_ = repr(datetime.time(0))
++
++
+ def test_main():
+ test_support.run_unittest(HashEqualityTestCase,
+ HashInheritanceTestCase,
+- HashBuiltinsTestCase)
++ HashBuiltinsTestCase,
++ StrHashRandomizationTests,
++ UnicodeHashRandomizationTests,
++ BufferHashRandomizationTests,
++ DatetimeDateTests,
++ DatetimeDatetimeTests,
++ DatetimeTimeTests)
++
+
+
+ if __name__ == "__main__":
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_os.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_os.py
new file mode 100644
index 00000000000..2b5cfb2f0f0
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_os.py
@@ -0,0 +1,67 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_os.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+http://hg.python.org/cpython/rev/e3fb353b3fd4
+
+--- Lib/test/test_os.py.orig 2011-06-11 16:46:25.000000000 +0100
++++ Lib/test/test_os.py 2012-03-24 11:48:51.000000000 +0000
+@@ -10,6 +10,7 @@
+ import signal
+ import subprocess
+ import time
++
+ from test import test_support
+ import mmap
+ import uuid
+@@ -512,18 +513,37 @@
+ f.close()
+
+ class URandomTests (unittest.TestCase):
+- def test_urandom(self):
+- try:
+- self.assertEqual(len(os.urandom(1)), 1)
+- self.assertEqual(len(os.urandom(10)), 10)
+- self.assertEqual(len(os.urandom(100)), 100)
+- self.assertEqual(len(os.urandom(1000)), 1000)
+- # see http://bugs.python.org/issue3708
+- self.assertRaises(TypeError, os.urandom, 0.9)
+- self.assertRaises(TypeError, os.urandom, 1.1)
+- self.assertRaises(TypeError, os.urandom, 2.0)
+- except NotImplementedError:
+- pass
++
++ def test_urandom_length(self):
++ self.assertEqual(len(os.urandom(0)), 0)
++ self.assertEqual(len(os.urandom(1)), 1)
++ self.assertEqual(len(os.urandom(10)), 10)
++ self.assertEqual(len(os.urandom(100)), 100)
++ self.assertEqual(len(os.urandom(1000)), 1000)
++
++ def test_urandom_value(self):
++ data1 = os.urandom(16)
++ data2 = os.urandom(16)
++ self.assertNotEqual(data1, data2)
++
++ def get_urandom_subprocess(self, count):
++ code = '\n'.join((
++ 'import os, sys',
++ 'data = os.urandom(%s)' % count,
++ 'sys.stdout.write(data)',
++ 'sys.stdout.flush()'))
++ cmd_line = [sys.executable, '-c', code]
++ p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE,
++ stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
++ out, err = p.communicate()
++ out = test_support.strip_python_stderr(out)
++ self.assertEqual(len(out), count)
++ return out
++
++ def test_urandom_subprocess(self):
++ data1 = self.get_urandom_subprocess(16)
++ data2 = self.get_urandom_subprocess(16)
++ self.assertNotEqual(data1, data2)
+
+ def test_execvpe_with_bad_arglist(self):
+ self.assertRaises(ValueError, os.execvpe, 'notepad', [], None)
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_set.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_set.py
new file mode 100644
index 00000000000..342fa13370a
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_set.py
@@ -0,0 +1,73 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_set.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/test/test_set.py.orig 2011-06-11 16:46:25.000000000 +0100
++++ Lib/test/test_set.py 2012-03-24 11:02:25.000000000 +0000
+@@ -687,6 +687,17 @@
+ if self.repr is not None:
+ self.assertEqual(repr(self.set), self.repr)
+
++ def check_repr_against_values(self):
++ text = repr(self.set)
++ self.assertTrue(text.startswith('{'))
++ self.assertTrue(text.endswith('}'))
++
++ result = text[1:-1].split(', ')
++ result.sort()
++ sorted_repr_values = [repr(value) for value in self.values]
++ sorted_repr_values.sort()
++ self.assertEqual(result, sorted_repr_values)
++
+ def test_print(self):
+ fo = open(test_support.TESTFN, "wb")
+ try:
+@@ -836,6 +847,46 @@
+ self.length = 3
+ self.repr = None
+
++#------------------------------------------------------------------------------
++
++class TestBasicOpsString(TestBasicOps):
++ def setUp(self):
++ self.case = "string set"
++ self.values = ["a", "b", "c"]
++ self.set = set(self.values)
++ self.dup = set(self.values)
++ self.length = 3
++
++ def test_repr(self):
++ self.check_repr_against_values()
++
++#------------------------------------------------------------------------------
++
++class TestBasicOpsUnicode(TestBasicOps):
++ def setUp(self):
++ self.case = "unicode set"
++ self.values = [u"a", u"b", u"c"]
++ self.set = set(self.values)
++ self.dup = set(self.values)
++ self.length = 3
++
++ def test_repr(self):
++ self.check_repr_against_values()
++
++#------------------------------------------------------------------------------
++
++class TestBasicOpsMixedStringUnicode(TestBasicOps):
++ def setUp(self):
++ self.case = "string and bytes set"
++ self.values = ["a", "b", u"a", u"b"]
++ self.set = set(self.values)
++ self.dup = set(self.values)
++ self.length = 4
++
++ def test_repr(self):
++ with test_support.check_warnings():
++ self.check_repr_against_values()
++
+ #==============================================================================
+
+ def baditer():
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_support.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_support.py
new file mode 100644
index 00000000000..cccbfb8d074
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_support.py
@@ -0,0 +1,19 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_support.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/test/test_support.py.orig 2011-06-11 16:46:26.000000000 +0100
++++ Lib/test/test_support.py 2012-03-24 11:02:25.000000000 +0000
+@@ -36,8 +36,8 @@
+ "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
+ "threading_cleanup", "reap_children", "cpython_only",
+ "check_impl_detail", "get_attribute", "py3k_bytes",
+- "import_fresh_module"]
+-
++ "import_fresh_module", "threading_cleanup", "reap_children",
++ "strip_python_stderr"]
+
+ class Error(Exception):
+ """Base class for regression test exceptions."""
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_sys.py b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_sys.py
new file mode 100644
index 00000000000..e6f5da477bc
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Lib_test_test_sys.py
@@ -0,0 +1,17 @@
+$NetBSD: patch-CVE-2012-1150-Lib_test_test_sys.py,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Lib/test/test_sys.py.orig 2011-06-11 16:46:26.000000000 +0100
++++ Lib/test/test_sys.py 2012-03-24 11:02:25.000000000 +0000
+@@ -426,7 +426,7 @@
+ attrs = ("debug", "py3k_warning", "division_warning", "division_new",
+ "inspect", "interactive", "optimize", "dont_write_bytecode",
+ "no_site", "ignore_environment", "tabcheck", "verbose",
+- "unicode", "bytes_warning")
++ "unicode", "bytes_warning", "hash_randomization")
+ for attr in attrs:
+ self.assertTrue(hasattr(sys.flags, attr), attr)
+ self.assertEqual(type(getattr(sys.flags, attr)), int, attr)
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Misc_NEWS b/lang/python27/patches/patch-CVE-2012-1150-Misc_NEWS
new file mode 100644
index 00000000000..479ef475576
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Misc_NEWS
@@ -0,0 +1,20 @@
+$NetBSD: patch-CVE-2012-1150-Misc_NEWS,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Misc/NEWS.orig 2011-06-11 16:46:26.000000000 +0100
++++ Misc/NEWS 2012-03-24 11:03:47.000000000 +0000
+@@ -12,6 +12,11 @@
+
+ - Issue #12009: Fixed regression in netrc file comment handling.
+
++- Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
++ environment variable, to provide an opt-in way to protect against denial of
++ service attacks due to hash collisions within the dict and set types. Patch
++ by David Malcolm, based on work by Victor Stinner.
++
+ Extension Modules
+ -----------------
+
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Misc_python.man b/lang/python27/patches/patch-CVE-2012-1150-Misc_python.man
new file mode 100644
index 00000000000..e79470115cb
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Misc_python.man
@@ -0,0 +1,58 @@
+$NetBSD: patch-CVE-2012-1150-Misc_python.man,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Misc/python.man.orig 2011-06-11 16:46:26.000000000 +0100
++++ Misc/python.man 2012-03-24 11:02:25.000000000 +0000
+@@ -34,6 +34,9 @@
+ .B \-OO
+ ]
+ [
++.B \-R
++]
++[
+ .B -Q
+ .I argument
+ ]
+@@ -151,6 +154,18 @@
+ .B \-OO
+ Discard docstrings in addition to the \fB-O\fP optimizations.
+ .TP
++.B \-R
++Turn on "hash randomization", so that the hash() values of str, bytes and
++datetime objects are "salted" with an unpredictable pseudo-random value.
++Although they remain constant within an individual Python process, they are
++not predictable between repeated invocations of Python.
++.IP
++This is intended to provide protection against a denial of service
++caused by carefully-chosen inputs that exploit the worst case performance
++of a dict insertion, O(n^2) complexity. See
++http://www.ocert.org/advisories/ocert-2011-003.html
++for details.
++.TP
+ .BI "\-Q " argument
+ Division control; see PEP 238. The argument must be one of "old" (the
+ default, int/int and long/long return an int or long), "new" (new
+@@ -423,6 +438,20 @@
+ .IP PYTHONWARNINGS
+ If this is set to a comma-separated string it is equivalent to
+ specifying the \fB\-W\fP option for each separate value.
++.IP PYTHONHASHSEED
++If this variable is set to "random", the effect is the same as specifying
++the \fB-R\fP option: a random value is used to seed the hashes of str,
++bytes and datetime objects.
++
++If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
++generating the hash() of the types covered by the hash randomization. Its
++purpose is to allow repeatable hashing, such as for selftests for the
++interpreter itself, or to allow a cluster of python processes to share hash
++values.
++
++The integer must be a decimal number in the range [0,4294967295]. Specifying
++the value 0 will lead to the same hash values as when hash randomization is
++disabled.
+ .SH AUTHOR
+ The Python Software Foundation: http://www.python.org/psf
+ .SH INTERNET RESOURCES
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Modules_main.c b/lang/python27/patches/patch-CVE-2012-1150-Modules_main.c
new file mode 100644
index 00000000000..ae52bc963f4
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Modules_main.c
@@ -0,0 +1,59 @@
+$NetBSD: patch-CVE-2012-1150-Modules_main.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Modules/main.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Modules/main.c 2012-03-24 11:02:25.000000000 +0000
+@@ -40,7 +40,7 @@
+ static int orig_argc;
+
+ /* command line options */
+-#define BASE_OPTS "3bBc:dEhiJm:OQ:sStuUvVW:xX?"
++#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW:xX?"
+
+ #ifndef RISCOS
+ #define PROGRAM_OPTS BASE_OPTS
+@@ -71,6 +71,9 @@
+ -m mod : run library module as a script (terminates option list)\n\
+ -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
+ -OO : remove doc-strings in addition to the -O optimizations\n\
++-R : use a pseudo-random salt to make hash() values of various types be\n\
++ unpredictable between separate invocations of the interpreter, as\n\
++ a defense against denial-of-service attacks\n\
+ -Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\
+ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
+ -S : don't imply 'import site' on initialization\n\
+@@ -102,6 +105,12 @@
+ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\
+ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\
+ ";
++static char *usage_6 = "\
++PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\
++ as specifying the :option:`-R` option: a random value is used to seed the\n\
++ hashes of str, bytes and datetime objects. It can also be set to an integer\n\
++ in the range [0,4294967295] to get hash values with a predictable seed.\n\
++";
+
+
+ static int
+@@ -118,6 +127,7 @@
+ fputs(usage_3, f);
+ fprintf(f, usage_4, DELIM);
+ fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
++ fputs(usage_6, f);
+ }
+ #if defined(__VMS)
+ if (exitcode == 0) {
+@@ -389,6 +399,10 @@
+ PySys_AddWarnOption(_PyOS_optarg);
+ break;
+
++ case 'R':
++ Py_HashRandomizationFlag++;
++ break;
++
+ /* This space reserved for other options */
+
+ default:
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Modules_posixmodule.c b/lang/python27/patches/patch-CVE-2012-1150-Modules_posixmodule.c
new file mode 100644
index 00000000000..2c87d2a662d
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Modules_posixmodule.c
@@ -0,0 +1,165 @@
+$NetBSD: patch-CVE-2012-1150-Modules_posixmodule.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Modules/posixmodule.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Modules/posixmodule.c 2012-03-24 11:02:25.000000000 +0000
+@@ -8476,117 +8476,35 @@
+ }
+ #endif
+
+-#ifdef MS_WINDOWS
+-
+-PyDoc_STRVAR(win32_urandom__doc__,
++PyDoc_STRVAR(posix_urandom__doc__,
+ "urandom(n) -> str\n\n\
+-Return a string of n random bytes suitable for cryptographic use.");
+-
+-typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
+- LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
+- DWORD dwFlags );
+-typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
+- BYTE *pbBuffer );
+-
+-static CRYPTGENRANDOM pCryptGenRandom = NULL;
+-/* This handle is never explicitly released. Instead, the operating
+- system will release it when the process terminates. */
+-static HCRYPTPROV hCryptProv = 0;
++Return n random bytes suitable for cryptographic use.");
+
+-static PyObject*
+-win32_urandom(PyObject *self, PyObject *args)
++static PyObject *
++posix_urandom(PyObject *self, PyObject *args)
+ {
+- int howMany;
+- PyObject* result;
++ Py_ssize_t size;
++ PyObject *result;
++ int ret;
+
+- /* Read arguments */
+- if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
++ /* Read arguments */
++ if (!PyArg_ParseTuple(args, "n:urandom", &size))
+ return NULL;
+- if (howMany < 0)
++ if (size < 0)
+ return PyErr_Format(PyExc_ValueError,
+ "negative argument not allowed");
+-
+- if (hCryptProv == 0) {
+- HINSTANCE hAdvAPI32 = NULL;
+- CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
+-
+- /* Obtain handle to the DLL containing CryptoAPI
+- This should not fail */
+- hAdvAPI32 = GetModuleHandle("advapi32.dll");
+- if(hAdvAPI32 == NULL)
+- return win32_error("GetModuleHandle", NULL);
+-
+- /* Obtain pointers to the CryptoAPI functions
+- This will fail on some early versions of Win95 */
+- pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
+- hAdvAPI32,
+- "CryptAcquireContextA");
+- if (pCryptAcquireContext == NULL)
+- return PyErr_Format(PyExc_NotImplementedError,
+- "CryptAcquireContextA not found");
+-
+- pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(
+- hAdvAPI32, "CryptGenRandom");
+- if (pCryptGenRandom == NULL)
+- return PyErr_Format(PyExc_NotImplementedError,
+- "CryptGenRandom not found");
+-
+- /* Acquire context */
+- if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
+- PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
+- return win32_error("CryptAcquireContext", NULL);
+- }
+-
+- /* Allocate bytes */
+- result = PyString_FromStringAndSize(NULL, howMany);
+- if (result != NULL) {
+- /* Get random data */
+- memset(PyString_AS_STRING(result), 0, howMany); /* zero seed */
+- if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*)
+- PyString_AS_STRING(result))) {
+- Py_DECREF(result);
+- return win32_error("CryptGenRandom", NULL);
+- }
+- }
+- return result;
+-}
+-#endif
+-
+-#ifdef __VMS
+-/* Use openssl random routine */
+-#include <openssl/rand.h>
+-PyDoc_STRVAR(vms_urandom__doc__,
+-"urandom(n) -> str\n\n\
+-Return a string of n random bytes suitable for cryptographic use.");
+-
+-static PyObject*
+-vms_urandom(PyObject *self, PyObject *args)
+-{
+- int howMany;
+- PyObject* result;
+-
+- /* Read arguments */
+- if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
++ result = PyBytes_FromStringAndSize(NULL, size);
++ if (result == NULL)
+ return NULL;
+- if (howMany < 0)
+- return PyErr_Format(PyExc_ValueError,
+- "negative argument not allowed");
+
+- /* Allocate bytes */
+- result = PyString_FromStringAndSize(NULL, howMany);
+- if (result != NULL) {
+- /* Get random data */
+- if (RAND_pseudo_bytes((unsigned char*)
+- PyString_AS_STRING(result),
+- howMany) < 0) {
+- Py_DECREF(result);
+- return PyErr_Format(PyExc_ValueError,
+- "RAND_pseudo_bytes");
+- }
++ ret = _PyOS_URandom(PyBytes_AS_STRING(result),
++ PyBytes_GET_SIZE(result));
++ if (ret == -1) {
++ Py_DECREF(result);
++ return NULL;
+ }
+ return result;
+ }
+-#endif
+
+ #ifdef HAVE_SETRESUID
+ PyDoc_STRVAR(posix_setresuid__doc__,
+@@ -8972,12 +8890,6 @@
+ #ifdef HAVE_GETLOADAVG
+ {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
+ #endif
+- #ifdef MS_WINDOWS
+- {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__},
+- #endif
+- #ifdef __VMS
+- {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__},
+- #endif
+ #ifdef HAVE_SETRESUID
+ {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__},
+ #endif
+@@ -8990,7 +8902,7 @@
+ #ifdef HAVE_GETRESGID
+ {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__},
+ #endif
+-
++ {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__},
+ {NULL, NULL} /* Sentinel */
+ };
+
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Objects_bufferobject.c b/lang/python27/patches/patch-CVE-2012-1150-Objects_bufferobject.c
new file mode 100644
index 00000000000..71661719084
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Objects_bufferobject.c
@@ -0,0 +1,30 @@
+$NetBSD: patch-CVE-2012-1150-Objects_bufferobject.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Objects/bufferobject.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Objects/bufferobject.c 2012-03-24 11:02:25.000000000 +0000
+@@ -334,10 +334,20 @@
+ return -1;
+ p = (unsigned char *) ptr;
+ len = size;
+- x = *p << 7;
++ /*
++ We make the hash of the empty buffer be 0, rather than using
++ (prefix ^ suffix), since this slightly obfuscates the hash secret
++ */
++ if (len == 0) {
++ self->b_hash = 0;
++ return 0;
++ }
++ x = _Py_HashSecret.prefix;
++ x ^= *p << 7;
+ while (--len >= 0)
+ x = (1000003*x) ^ *p++;
+ x ^= size;
++ x ^= _Py_HashSecret.suffix;
+ if (x == -1)
+ x = -2;
+ self->b_hash = x;
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Objects_object.c b/lang/python27/patches/patch-CVE-2012-1150-Objects_object.c
new file mode 100644
index 00000000000..4af52555b13
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Objects_object.c
@@ -0,0 +1,17 @@
+$NetBSD: patch-CVE-2012-1150-Objects_object.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Objects/object.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Objects/object.c 2012-03-24 11:02:25.000000000 +0000
+@@ -1094,6 +1094,8 @@
+ return -1;
+ }
+
++_Py_HashSecret_t _Py_HashSecret;
++
+ long
+ PyObject_Hash(PyObject *v)
+ {
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Objects_stringobject.c b/lang/python27/patches/patch-CVE-2012-1150-Objects_stringobject.c
new file mode 100644
index 00000000000..33f059a278e
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Objects_stringobject.c
@@ -0,0 +1,31 @@
+$NetBSD: patch-CVE-2012-1150-Objects_stringobject.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Objects/stringobject.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Objects/stringobject.c 2012-03-24 11:02:25.000000000 +0000
+@@ -1265,11 +1265,21 @@
+ if (a->ob_shash != -1)
+ return a->ob_shash;
+ len = Py_SIZE(a);
++ /*
++ We make the hash of the empty string be 0, rather than using
++ (prefix ^ suffix), since this slightly obfuscates the hash secret
++ */
++ if (len == 0) {
++ a->ob_shash = 0;
++ return 0;
++ }
+ p = (unsigned char *) a->ob_sval;
+- x = *p << 7;
++ x = _Py_HashSecret.prefix;
++ x ^= *p << 7;
+ while (--len >= 0)
+ x = (1000003*x) ^ *p++;
+ x ^= Py_SIZE(a);
++ x ^= _Py_HashSecret.suffix;
+ if (x == -1)
+ x = -2;
+ a->ob_shash = x;
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Objects_unicodeobject.c b/lang/python27/patches/patch-CVE-2012-1150-Objects_unicodeobject.c
new file mode 100644
index 00000000000..1e6212cbc3c
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Objects_unicodeobject.c
@@ -0,0 +1,31 @@
+$NetBSD: patch-CVE-2012-1150-Objects_unicodeobject.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Objects/unicodeobject.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Objects/unicodeobject.c 2012-03-24 11:02:25.000000000 +0000
+@@ -6546,11 +6546,21 @@
+ if (self->hash != -1)
+ return self->hash;
+ len = PyUnicode_GET_SIZE(self);
++ /*
++ We make the hash of the empty string be 0, rather than using
++ (prefix ^ suffix), since this slightly obfuscates the hash secret
++ */
++ if (len == 0) {
++ self->hash = 0;
++ return 0;
++ }
+ p = PyUnicode_AS_UNICODE(self);
+- x = *p << 7;
++ x = _Py_HashSecret.prefix;
++ x ^= *p << 7;
+ while (--len >= 0)
+ x = (1000003*x) ^ *p++;
+ x ^= PyUnicode_GET_SIZE(self);
++ x ^= _Py_HashSecret.suffix;
+ if (x == -1)
+ x = -2;
+ self->hash = x;
diff --git a/lang/python27/patches/patch-CVE-2012-1150-PCbuild_pythoncore.vcproj b/lang/python27/patches/patch-CVE-2012-1150-PCbuild_pythoncore.vcproj
new file mode 100644
index 00000000000..f93d00fc114
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-PCbuild_pythoncore.vcproj
@@ -0,0 +1,1840 @@
+$NetBSD: patch-CVE-2012-1150-PCbuild_pythoncore.vcproj,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- PCbuild/pythoncore.vcproj.orig 2011-06-11 16:46:27.000000000 +0100
++++ PCbuild/pythoncore.vcproj 2012-03-24 11:02:25.000000000 +0000
+@@ -1,3 +1,4 @@
++<<<<<<< local
+ <?xml version="1.0" encoding="Windows-1252"?>
+ <VisualStudioProject
+ ProjectType="Visual C++"
+@@ -1871,3 +1872,1826 @@
+ <Globals>
+ </Globals>
+ </VisualStudioProject>
++=======
++<?xml version="1.0" encoding="Windows-1252"?>
++<VisualStudioProject
++ ProjectType="Visual C++"
++ Version="9,00"
++ Name="pythoncore"
++ ProjectGUID="{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
++ RootNamespace="pythoncore"
++ TargetFrameworkVersion="131072"
++ >
++ <Platforms>
++ <Platform
++ Name="Win32"
++ />
++ <Platform
++ Name="x64"
++ />
++ </Platforms>
++ <ToolFiles>
++ </ToolFiles>
++ <Configurations>
++ <Configuration
++ Name="Release|Win32"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDir)$(PyDllName).lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="Release|x64"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\x64.vsprops;.\release.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ TargetEnvironment="3"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDir)$(PyDllName).lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="Debug|Win32"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\debug.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ CharacterSet="0"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ Optimization="0"
++ InlineFunctionExpansion="0"
++ EnableIntrinsicFunctions="false"
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="3"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="_DEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName)_d.dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName)_d.pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDir)$(PyDllName)_d.lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="Debug|x64"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\x64.vsprops;.\debug.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ TargetEnvironment="3"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ Optimization="0"
++ InlineFunctionExpansion="0"
++ EnableIntrinsicFunctions="false"
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="3"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="_DEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Debug"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName)_d.dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName)_d.pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDir)$(PyDllName)_d.lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="PGInstrument|Win32"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops;.\pginstrument.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDirPGI)$(PyDllName).lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="PGInstrument|x64"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\x64.vsprops;.\release.vsprops;.\pginstrument.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ TargetEnvironment="3"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDirPGI)$(PyDllName).lib"
++ TargetMachine="17"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="PGUpdate|Win32"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops;.\pgupdate.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDirPGI)$(PyDllName).lib"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ <Configuration
++ Name="PGUpdate|x64"
++ ConfigurationType="2"
++ InheritedPropertySheets=".\pyproject.vsprops;.\x64.vsprops;.\release.vsprops;.\pgupdate.vsprops"
++ UseOfMFC="0"
++ ATLMinimizesCRunTimeLibraryUsage="false"
++ >
++ <Tool
++ Name="VCPreBuildEventTool"
++ />
++ <Tool
++ Name="VCCustomBuildTool"
++ />
++ <Tool
++ Name="VCXMLDataGeneratorTool"
++ />
++ <Tool
++ Name="VCWebServiceProxyGeneratorTool"
++ />
++ <Tool
++ Name="VCMIDLTool"
++ TargetEnvironment="3"
++ />
++ <Tool
++ Name="VCCLCompilerTool"
++ AdditionalOptions="/Zm200 "
++ AdditionalIncludeDirectories="..\Python;..\Modules\zlib"
++ PreprocessorDefinitions="_USRDLL;Py_BUILD_CORE;Py_ENABLE_SHARED;WIN32"
++ RuntimeLibrary="2"
++ />
++ <Tool
++ Name="VCManagedResourceCompilerTool"
++ />
++ <Tool
++ Name="VCResourceCompilerTool"
++ PreprocessorDefinitions="NDEBUG"
++ Culture="1033"
++ AdditionalIncludeDirectories="..\Include"
++ />
++ <Tool
++ Name="VCPreLinkEventTool"
++ Description="Generate build information..."
++ CommandLine="&quot;$(SolutionDir)make_buildinfo.exe&quot; Release"
++ />
++ <Tool
++ Name="VCLinkerTool"
++ AdditionalDependencies="getbuildinfo.o"
++ OutputFile="$(OutDir)\$(PyDllName).dll"
++ IgnoreDefaultLibraryNames="libc"
++ ProgramDatabaseFile="$(OutDir)$(PyDllName).pdb"
++ BaseAddress="0x1e000000"
++ ImportLibrary="$(OutDirPGI)$(PyDllName).lib"
++ TargetMachine="17"
++ />
++ <Tool
++ Name="VCALinkTool"
++ />
++ <Tool
++ Name="VCManifestTool"
++ />
++ <Tool
++ Name="VCXDCMakeTool"
++ />
++ <Tool
++ Name="VCBscMakeTool"
++ />
++ <Tool
++ Name="VCFxCopTool"
++ />
++ <Tool
++ Name="VCAppVerifierTool"
++ />
++ <Tool
++ Name="VCPostBuildEventTool"
++ />
++ </Configuration>
++ </Configurations>
++ <References>
++ </References>
++ <Files>
++ <Filter
++ Name="Include"
++ >
++ <File
++ RelativePath="..\Include\abstract.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\asdl.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\ast.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\bitset.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\boolobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\bufferobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\bytes_methods.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\bytearrayobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\bytesobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\cellobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\ceval.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\classobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\cobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\code.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\codecs.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\compile.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\complexobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\cStringIO.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\datetime.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\descrobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\dictobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\enumobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\errcode.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\eval.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\fileobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\floatobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\frameobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\funcobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\genobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\graminit.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\grammar.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\import.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\intobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\intrcheck.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\iterobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\listobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\longintrepr.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\longobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\marshal.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\memoryobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\metagrammar.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\methodobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\modsupport.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\moduleobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\node.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\object.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\objimpl.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\opcode.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\osdefs.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\parsetok.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\patchlevel.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pgen.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pgenheaders.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\py_curses.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pyarena.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pydebug.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pyerrors.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pyexpat.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pyfpe.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pygetopt.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pymactoolbox.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pymath.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pymem.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pyport.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pystate.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pystrcmp.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pystrtod.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\Python-ast.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\Python.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pythonrun.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\pythread.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\rangeobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\setobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\sliceobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\stringobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\structmember.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\structseq.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\symtable.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\sysmodule.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\timefuncs.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\token.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\traceback.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\tupleobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\ucnhash.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\unicodeobject.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Include\weakrefobject.h"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="Modules"
++ >
++ <File
++ RelativePath="..\Modules\_bisectmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_codecsmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_collectionsmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_csv.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_fileio.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_bytesio.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_functoolsmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_heapqmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_hotshot.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_json.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_localemodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_lsprof.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_randommodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_sre.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_struct.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\_weakref.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\arraymodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\audioop.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\binascii.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cmathmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cPickle.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cStringIO.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\datetimemodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\errnomodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\future_builtins.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\gcmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\imageop.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\itertoolsmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\main.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\mathmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\md5.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\md5.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\md5module.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\mmapmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\operator.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\parsermodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\posixmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\rotatingtree.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\rotatingtree.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\sha256module.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\sha512module.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\shamodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\signalmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\stropmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\symtablemodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\threadmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\timemodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\xxsubtype.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\yuv.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\yuvconvert.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zipimport.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlibmodule.c"
++ >
++ </File>
++ <Filter
++ Name="zlib"
++ >
++ <File
++ RelativePath="..\Modules\zlib\adler32.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\compress.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\crc32.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\crc32.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\deflate.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\deflate.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\gzio.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\infback.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inffast.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inffast.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inffixed.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inflate.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inflate.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inftrees.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\inftrees.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\trees.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\trees.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\uncompr.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\zconf.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\zconf.in.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\zlib.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\zutil.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\zlib\zutil.h"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="cjkcodecs"
++ >
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_cn.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_hk.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_iso2022.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_jp.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_kr.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\_codecs_tw.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\alg_jisx0201.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\cjkcodecs.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\emu_jisx0213_2000.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_cn.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_hk.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_jisx0213_pair.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_jp.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_kr.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\mappings_tw.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\multibytecodec.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Modules\cjkcodecs\multibytecodec.h"
++ >
++ </File>
++ </Filter>
++ </Filter>
++ <Filter
++ Name="Objects"
++ >
++ <File
++ RelativePath="..\Objects\abstract.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\boolobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\bufferobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\bytes_methods.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\bytearrayobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\stringobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\cellobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\classobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\cobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\codeobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\complexobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\stringlib\count.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\descrobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\dictobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\enumobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\exceptions.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\stringlib\fastsearch.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\fileobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\stringlib\find.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\floatobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\frameobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\funcobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\genobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\intobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\iterobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\listobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\longobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\methodobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\moduleobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\object.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\obmalloc.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\stringlib\partition.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\rangeobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\setobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\sliceobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\structseq.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\tupleobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\typeobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\unicodectype.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\unicodeobject.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\unicodetype_db.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Objects\weakrefobject.c"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="Parser"
++ >
++ <File
++ RelativePath="..\Parser\acceler.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\bitset.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\firstsets.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\grammar.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\grammar1.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\listnode.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\metagrammar.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\myreadline.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\node.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\parser.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\parser.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\parsetok.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\tokenizer.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Parser\tokenizer.h"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="PC"
++ >
++ <File
++ RelativePath="..\PC\_subprocess.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\_winreg.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\config.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\dl_nt.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\errmap.h"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\getpathp.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\import_nt.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\msvcrtmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\PC\pyconfig.h"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="Python"
++ >
++ <File
++ RelativePath="..\Python\_warnings.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\asdl.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\ast.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\bltinmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\ceval.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\codecs.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\compile.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\dynload_win.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\errors.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\formatter_string.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\formatter_unicode.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\frozen.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\future.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getargs.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getcompiler.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getcopyright.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getmtime.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getopt.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getplatform.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\getversion.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\graminit.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\import.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\importdl.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\importdl.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\marshal.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\modsupport.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\mysnprintf.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\mystrtoul.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\peephole.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pyarena.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pyfpe.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pymath.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pystate.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pystrcmp.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pystrtod.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\Python-ast.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\pythonrun.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\random.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\structmember.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\symtable.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\sysmodule.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\thread.c"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\thread_nt.h"
++ >
++ </File>
++ <File
++ RelativePath="..\Python\traceback.c"
++ >
++ </File>
++ </Filter>
++ <Filter
++ Name="Resource Files"
++ >
++ <File
++ RelativePath="..\PC\python_nt.rc"
++ >
++ </File>
++ </Filter>
++ </Files>
++ <Globals>
++ </Globals>
++</VisualStudioProject>
++>>>>>>> other
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Python_pythonrun.c b/lang/python27/patches/patch-CVE-2012-1150-Python_pythonrun.c
new file mode 100644
index 00000000000..d23d857607f
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Python_pythonrun.c
@@ -0,0 +1,37 @@
+$NetBSD: patch-CVE-2012-1150-Python_pythonrun.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Python/pythonrun.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Python/pythonrun.c 2012-03-24 11:02:25.000000000 +0000
+@@ -67,6 +67,7 @@
+ static void call_ll_exitfuncs(void);
+ extern void _PyUnicode_Init(void);
+ extern void _PyUnicode_Fini(void);
++extern void _PyRandom_Init(void);
+
+ #ifdef WITH_THREAD
+ extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
+@@ -89,6 +90,7 @@
+ true divisions (which they will be in 2.3). */
+ int _Py_QnewFlag = 0;
+ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
++int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */
+
+ /* PyModule_GetWarningsModule is no longer necessary as of 2.6
+ since _warnings is builtin. This API should not be used. */
+@@ -166,6 +168,12 @@
+ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
+ if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
+ Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
++ /* The variable is only tested for existence here; _PyRandom_Init will
++ check its value further. */
++ if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
++ Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p);
++
++ _PyRandom_Init();
+
+ interp = PyInterpreterState_New();
+ if (interp == NULL)
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Python_random.c b/lang/python27/patches/patch-CVE-2012-1150-Python_random.c
new file mode 100644
index 00000000000..94a858fc0ff
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Python_random.c
@@ -0,0 +1,311 @@
+$NetBSD: patch-CVE-2012-1150-Python_random.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Python/random.c.orig 2012-03-24 11:02:25.000000000 +0000
++++ Python/random.c 2012-03-24 11:02:25.000000000 +0000
+@@ -0,0 +1,302 @@
++#include "Python.h"
++#ifdef MS_WINDOWS
++#include <windows.h>
++#else
++#include <fcntl.h>
++#endif
++
++static int random_initialized = 0;
++
++#ifdef MS_WINDOWS
++typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
++ LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
++ DWORD dwFlags );
++typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
++ BYTE *pbBuffer );
++
++static CRYPTGENRANDOM pCryptGenRandom = NULL;
++/* This handle is never explicitly released. Instead, the operating
++ system will release it when the process terminates. */
++static HCRYPTPROV hCryptProv = 0;
++
++static int
++win32_urandom_init(int raise)
++{
++ HINSTANCE hAdvAPI32 = NULL;
++ CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
++
++ /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */
++ hAdvAPI32 = GetModuleHandle("advapi32.dll");
++ if(hAdvAPI32 == NULL)
++ goto error;
++
++ /* Obtain pointers to the CryptoAPI functions. This will fail on some early
++ versions of Win95. */
++ pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
++ hAdvAPI32, "CryptAcquireContextA");
++ if (pCryptAcquireContext == NULL)
++ goto error;
++
++ pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32,
++ "CryptGenRandom");
++ if (pCryptGenRandom == NULL)
++ goto error;
++
++ /* Acquire context */
++ if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
++ PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
++ goto error;
++
++ return 0;
++
++error:
++ if (raise)
++ PyErr_SetFromWindowsErr(0);
++ else
++ Py_FatalError("Failed to initialize Windows random API (CryptoGen)");
++ return -1;
++}
++
++/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen
++ API. Return 0 on success, or -1 on error. */
++static int
++win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise)
++{
++ Py_ssize_t chunk;
++
++ if (hCryptProv == 0)
++ {
++ if (win32_urandom_init(raise) == -1)
++ return -1;
++ }
++
++ while (size > 0)
++ {
++ chunk = size > INT_MAX ? INT_MAX : size;
++ if (!pCryptGenRandom(hCryptProv, chunk, buffer))
++ {
++ /* CryptGenRandom() failed */
++ if (raise)
++ PyErr_SetFromWindowsErr(0);
++ else
++ Py_FatalError("Failed to initialized the randomized hash "
++ "secret using CryptoGen)");
++ return -1;
++ }
++ buffer += chunk;
++ size -= chunk;
++ }
++ return 0;
++}
++#endif /* MS_WINDOWS */
++
++
++#ifdef __VMS
++/* Use openssl random routine */
++#include <openssl/rand.h>
++static int
++vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise)
++{
++ if (RAND_pseudo_bytes(buffer, size) < 0) {
++ if (raise) {
++ PyErr_Format(PyExc_ValueError,
++ "RAND_pseudo_bytes");
++ } else {
++ Py_FatalError("Failed to initialize the randomized hash "
++ "secret using RAND_pseudo_bytes");
++ }
++ return -1;
++ }
++ return 0;
++}
++#endif /* __VMS */
++
++
++#if !defined(MS_WINDOWS) && !defined(__VMS)
++
++/* Read size bytes from /dev/urandom into buffer.
++ Call Py_FatalError() on error. */
++static void
++dev_urandom_noraise(char *buffer, Py_ssize_t size)
++{
++ int fd;
++ Py_ssize_t n;
++
++ assert (0 < size);
++
++ fd = open("/dev/urandom", O_RDONLY);
++ if (fd < 0)
++ Py_FatalError("Failed to open /dev/urandom");
++
++ while (0 < size)
++ {
++ do {
++ n = read(fd, buffer, (size_t)size);
++ } while (n < 0 && errno == EINTR);
++ if (n <= 0)
++ {
++ /* stop on error or if read(size) returned 0 */
++ Py_FatalError("Failed to read bytes from /dev/urandom");
++ break;
++ }
++ buffer += n;
++ size -= (Py_ssize_t)n;
++ }
++ close(fd);
++}
++
++/* Read size bytes from /dev/urandom into buffer.
++ Return 0 on success, raise an exception and return -1 on error. */
++static int
++dev_urandom_python(char *buffer, Py_ssize_t size)
++{
++ int fd;
++ Py_ssize_t n;
++
++ if (size <= 0)
++ return 0;
++
++ Py_BEGIN_ALLOW_THREADS
++ fd = open("/dev/urandom", O_RDONLY);
++ Py_END_ALLOW_THREADS
++ if (fd < 0)
++ {
++ PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom");
++ return -1;
++ }
++
++ Py_BEGIN_ALLOW_THREADS
++ do {
++ do {
++ n = read(fd, buffer, (size_t)size);
++ } while (n < 0 && errno == EINTR);
++ if (n <= 0)
++ break;
++ buffer += n;
++ size -= (Py_ssize_t)n;
++ } while (0 < size);
++ Py_END_ALLOW_THREADS
++
++ if (n <= 0)
++ {
++ /* stop on error or if read(size) returned 0 */
++ if (n < 0)
++ PyErr_SetFromErrno(PyExc_OSError);
++ else
++ PyErr_Format(PyExc_RuntimeError,
++ "Failed to read %zi bytes from /dev/urandom",
++ size);
++ close(fd);
++ return -1;
++ }
++ close(fd);
++ return 0;
++}
++#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */
++
++/* Fill buffer with pseudo-random bytes generated by a linear congruent
++ generator (LCG):
++
++ x(n+1) = (x(n) * 214013 + 2531011) % 2^32
++
++ Use bits 23..16 of x(n) to generate a byte. */
++static void
++lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size)
++{
++ size_t index;
++ unsigned int x;
++
++ x = x0;
++ for (index=0; index < size; index++) {
++ x *= 214013;
++ x += 2531011;
++ /* modulo 2 ^ (8 * sizeof(int)) */
++ buffer[index] = (x >> 16) & 0xff;
++ }
++}
++
++/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic
++ use, from the operating random number generator (RNG).
++
++ Return 0 on success, raise an exception and return -1 on error. */
++int
++_PyOS_URandom(void *buffer, Py_ssize_t size)
++{
++ if (size < 0) {
++ PyErr_Format(PyExc_ValueError,
++ "negative argument not allowed");
++ return -1;
++ }
++ if (size == 0)
++ return 0;
++
++#ifdef MS_WINDOWS
++ return win32_urandom((unsigned char *)buffer, size, 1);
++#else
++# ifdef __VMS
++ return vms_urandom((unsigned char *)buffer, size, 1);
++# else
++ return dev_urandom_python((char*)buffer, size);
++# endif
++#endif
++}
++
++void
++_PyRandom_Init(void)
++{
++ char *env;
++ void *secret = &_Py_HashSecret;
++ Py_ssize_t secret_size = sizeof(_Py_HashSecret);
++
++ if (random_initialized)
++ return;
++ random_initialized = 1;
++
++ /*
++ By default, hash randomization is disabled, and only
++ enabled if PYTHONHASHSEED is set to non-empty or if
++ "-R" is provided at the command line:
++ */
++ if (!Py_HashRandomizationFlag) {
++ /* Disable the randomized hash: */
++ memset(secret, 0, secret_size);
++ return;
++ }
++
++ /*
++ Hash randomization is enabled. Generate a per-process secret,
++ using PYTHONHASHSEED if provided.
++ */
++
++ env = Py_GETENV("PYTHONHASHSEED");
++ if (env && *env != '\0' && strcmp(env, "random") != 0) {
++ char *endptr = env;
++ unsigned long seed;
++ seed = strtoul(env, &endptr, 10);
++ if (*endptr != '\0'
++ || seed > 4294967295UL
++ || (errno == ERANGE && seed == ULONG_MAX))
++ {
++ Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer "
++ "in range [0; 4294967295]");
++ }
++ if (seed == 0) {
++ /* disable the randomized hash */
++ memset(secret, 0, secret_size);
++ }
++ else {
++ lcg_urandom(seed, (unsigned char*)secret, secret_size);
++ }
++ }
++ else {
++#ifdef MS_WINDOWS
++ (void)win32_urandom((unsigned char *)secret, secret_size, 0);
++#else /* #ifdef MS_WINDOWS */
++# ifdef __VMS
++ vms_urandom((unsigned char *)secret, secret_size, 0);
++# else
++ dev_urandom_noraise((char*)secret, secret_size);
++# endif
++#endif
++ }
++}
diff --git a/lang/python27/patches/patch-CVE-2012-1150-Python_sysmodule.c b/lang/python27/patches/patch-CVE-2012-1150-Python_sysmodule.c
new file mode 100644
index 00000000000..91b4618236d
--- /dev/null
+++ b/lang/python27/patches/patch-CVE-2012-1150-Python_sysmodule.c
@@ -0,0 +1,36 @@
+$NetBSD: patch-CVE-2012-1150-Python_sysmodule.c,v 1.1 2012/03/24 12:04:37 tron Exp $
+
+Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Python/sysmodule.c.orig 2011-06-11 16:46:27.000000000 +0100
++++ Python/sysmodule.c 2012-03-24 11:02:25.000000000 +0000
+@@ -1208,6 +1208,7 @@
+ {"unicode", "-U"},
+ /* {"skip_first", "-x"}, */
+ {"bytes_warning", "-b"},
++ {"hash_randomization", "-R"},
+ {0}
+ };
+
+@@ -1216,9 +1217,9 @@
+ flags__doc__, /* doc */
+ flags_fields, /* fields */
+ #ifdef RISCOS
+- 16
++ 17
+ #else
+- 15
++ 16
+ #endif
+ };
+
+@@ -1255,6 +1256,7 @@
+ SetFlag(Py_UnicodeFlag);
+ /* SetFlag(skipfirstline); */
+ SetFlag(Py_BytesWarningFlag);
++ SetFlag(Py_HashRandomizationFlag);
+ #undef SetFlag
+
+ if (PyErr_Occurred()) {
diff --git a/lang/python27/patches/patch-au b/lang/python27/patches/patch-au
index 1841ab3e402..71b3517bea3 100644
--- a/lang/python27/patches/patch-au
+++ b/lang/python27/patches/patch-au
@@ -1,8 +1,21 @@
-$NetBSD: patch-au,v 1.3 2011/06/13 11:31:13 obache Exp $
+$NetBSD: patch-au,v 1.4 2012/03/24 12:04:37 tron Exp $
---- Makefile.pre.in.orig 2011-06-11 15:46:26.000000000 +0000
-+++ Makefile.pre.in
-@@ -447,7 +447,7 @@ gdbhooks: $(BUILDPYTHON)-gdb.py
+1.) Fix for unpriviliged build.
+2.) Fix for CVE-2012-1150 taken from here:
+
+http://hg.python.org/cpython/rev/a0f43f4481e0
+
+--- Makefile.pre.in.orig 2011-06-11 16:46:26.000000000 +0100
++++ Makefile.pre.in 2012-03-24 11:02:25.000000000 +0000
+@@ -290,6 +290,7 @@
+ Python/pymath.o \
+ Python/pystate.o \
+ Python/pythonrun.o \
++ Python/random.o \
+ Python/structmember.o \
+ Python/symtable.o \
+ Python/sysmodule.o \
+@@ -447,7 +448,7 @@
SRC_GDB_HOOKS=$(srcdir)/Tools/gdb/libpython.py
$(BUILDPYTHON)-gdb.py: $(SRC_GDB_HOOKS)
@@ -11,7 +24,16 @@ $NetBSD: patch-au,v 1.3 2011/06/13 11:31:13 obache Exp $
# This rule is here for OPENSTEP/Rhapsody/MacOSX. It builds a temporary
# minimal framework (not including the Lib directory and such) in the current
-@@ -820,7 +820,8 @@ altbininstall: $(BUILDPYTHON)
+@@ -739,7 +740,7 @@
+ -@if which pybuildbot.identify >/dev/null 2>&1; then \
+ pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \
+ fi
+- $(TESTPYTHON) $(TESTPROG) -uall -rwW $(TESTOPTS)
++ $(TESTPYTHON) -R $(TESTPROG) -uall -rwW $(TESTOPTS)
+
+ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \
+ test_multibytecodec test_urllib2_localnet test_itertools \
+@@ -820,7 +821,8 @@
(cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \
fi \
fi; \