From fffc25da8388b4bcea4c81e1b3dff4e4f4e85b0a Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 28 Oct 2012 07:59:42 +0100 Subject: #8040: fix jQuery incompatibility --- Doc/tools/sphinxext/static/version_switch.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Doc/tools/sphinxext/static/version_switch.js b/Doc/tools/sphinxext/static/version_switch.js index 363bebf..cc7be1c 100644 --- a/Doc/tools/sphinxext/static/version_switch.js +++ b/Doc/tools/sphinxext/static/version_switch.js @@ -43,19 +43,21 @@ if (new_url != url) { // check beforehand if url exists, else redirect to version's start page - $.get(new_url, function() { - window.location.href = new_url; - }).error(function() { - window.location.href = 'http://docs.python.org/' + selected; + $.ajax({ + url: new_url, + success: function() { + window.location.href = new_url; + }, + error: function() { + window.location.href = 'http://docs.python.org/' + selected; + } }); } } $(document).ready(function() { - var version = DOCUMENTATION_OPTIONS.VERSION.split('.'), - release = DOCUMENTATION_OPTIONS.RELEASE || DOCUMENTATION_OPTIONS.VERSION; - - version = version[0] + '.' + version[1]; + var release = DOCUMENTATION_OPTIONS.VERSION; + var version = release.substr(0, 3); var select = build_select(version, release); $('.version_switcher_placeholder').html(select); -- cgit v0.12 From 01f47e82a3e6bccce7dddea63fa64fec29748112 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 28 Oct 2012 08:09:02 +0100 Subject: Add a autobuild-quick target that only rebuilds HTML. --- Doc/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/Makefile b/Doc/Makefile index a6dc1e2..a774aad 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -187,6 +187,10 @@ autobuild-dev: make update make dist SPHINXOPTS='-A daily=1 -A versionswitcher=1' +# for quick rebuilds (HTML only) +autobuild-html: + make html SPHINXOPTS='-A daily=1 -A versionswitcher=1' + # for stable releases: only build if not in pre-release stage (alpha, beta, rc) autobuild-stable: @case $(DISTVERSION) in *[abc]*) \ @@ -194,3 +198,4 @@ autobuild-stable: exit 1;; \ esac @make autobuild-dev + -- cgit v0.12 From 65e2bef4f0dd1e39915be45e219d82bf25e7d5e4 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Sun, 28 Oct 2012 09:11:00 +0000 Subject: Issue #16340: exclude venv/scripts from byte-compilation at installation time on Windows. --- Tools/msi/msi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py index 2057beb..2ec6951 100644 --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -415,7 +415,7 @@ def add_ui(db): ("VerdanaRed9", "Verdana", 9, 255, 0), ]) - compileargs = r'-Wi "[TARGETDIR]Lib\compileall.py" -f -x "bad_coding|badsyntax|site-packages|py2_|lib2to3\\tests" "[TARGETDIR]Lib"' + compileargs = r'-Wi "[TARGETDIR]Lib\compileall.py" -f -x "bad_coding|badsyntax|site-packages|py2_|lib2to3\\tests|venv\\scripts" "[TARGETDIR]Lib"' lib2to3args = r'-c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"' # See "CustomAction Table" add_data(db, "CustomAction", [ -- cgit v0.12 From c2415eb7e6ccb22888f35138527d6dc106e50a4e Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sun, 28 Oct 2012 11:42:26 +0200 Subject: Issue #14616: Mention shlex.quote in subprocess docs. Patch by Chris Rebert. --- Doc/library/subprocess.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 66d6cbb..34fdf10 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -341,6 +341,10 @@ default values. The arguments that are most commonly needed are: from this vulnerability; see the Note in the :class:`Popen` constructor documentation for helpful hints in getting ``shell=False`` to work. + When using ``shell=True``, :func:`shlex.quote` can be used to properly + escape whitespace and shell metacharacters in strings that are going to + be used to construct shell commands. + These options, along with all of the other options, are described in more detail in the :class:`Popen` constructor documentation. -- cgit v0.12 From 579d5cd643d31b732e6e7707582276565e44ece9 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 28 Oct 2012 10:51:35 +0100 Subject: changeset: 80007:49e4541f2aef parent: 80003:be83cbf4a789 parent: 80006:32df036e6b75 user: Georg Brandl date: Sun Oct 28 10:50:11 2012 +0100 summary: merge with 3.3 --- Lib/test/test_urllib2net.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 5fcb4cb..e2b1d95 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -156,12 +156,12 @@ class OtherNetworkTests(unittest.TestCase): ## self._test_urls(urls, self._extra_handlers()+[bauth, dauth]) def test_urlwithfrag(self): - urlwith_frag = "http://docs.python.org/glossary.html#glossary" + urlwith_frag = "http://docs.python.org/2/glossary.html#glossary" with support.transient_internet(urlwith_frag): req = urllib.request.Request(urlwith_frag) res = urllib.request.urlopen(req) self.assertEqual(res.geturl(), - "http://docs.python.org/glossary.html#glossary") + "http://docs.python.org/2/glossary.html#glossary") def test_custom_headers(self): url = "http://www.example.com" -- cgit v0.12 From fb90c0934c22041cad1fc4019c9853205befc967 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 28 Oct 2012 10:18:03 +0000 Subject: Issue #14700: Fix buggy overflow checks for large precision and width in new-style and old-style formatting. --- Lib/test/test_unicode.py | 27 +++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Objects/stringlib/formatter.h | 16 +++++++--------- Objects/stringlib/string_format.h | 15 ++++++--------- Objects/unicodeobject.c | 4 ++-- 5 files changed, 45 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 19b06a0..000ae6a 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -906,6 +906,21 @@ class UnicodeTest(string_tests.CommonTest, self.assertRaises(ValueError, '{}'.format_map, 'a') self.assertRaises(ValueError, '{a} {}'.format_map, {"a" : 2, "b" : 1}) + def test_format_huge_precision(self): + format_string = ".{}f".format(sys.maxsize + 1) + with self.assertRaises(ValueError): + result = format(2.34, format_string) + + def test_format_huge_width(self): + format_string = "{}f".format(sys.maxsize + 1) + with self.assertRaises(ValueError): + result = format(2.34, format_string) + + def test_format_huge_item_number(self): + format_string = "{{{}:.6f}}".format(sys.maxsize + 1) + with self.assertRaises(ValueError): + result = format_string.format(2.34) + def test_format_auto_numbering(self): class C: def __init__(self, x=100): @@ -990,6 +1005,18 @@ class UnicodeTest(string_tests.CommonTest, self.assertEqual('%f' % INF, 'inf') self.assertEqual('%F' % INF, 'INF') + @support.cpython_only + def test_formatting_huge_precision(self): + from _testcapi import INT_MAX + format_string = "%.{}f".format(INT_MAX + 1) + with self.assertRaises(ValueError): + result = format_string % 2.34 + + def test_formatting_huge_width(self): + format_string = "%{}f".format(sys.maxsize + 1) + with self.assertRaises(ValueError): + result = format_string % 2.34 + def test_startswith_endswith_errors(self): for meth in ('foo'.startswith, 'foo'.endswith): with self.assertRaises(TypeError) as cm: diff --git a/Misc/NEWS b/Misc/NEWS index 6c306d8..f2ba982 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.2.4 Core and Builtins ----------------- +- Issue #14700: Fix buggy overflow checks when handling large precisions and + widths in old-style and new-style formatting. + - Issue #6074: Ensure cached bytecode files can always be updated by the user that created them, even when the source file is read-only. diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h index 4fdc62d..139b56c 100644 --- a/Objects/stringlib/formatter.h +++ b/Objects/stringlib/formatter.h @@ -73,7 +73,7 @@ static int get_integer(STRINGLIB_CHAR **ptr, STRINGLIB_CHAR *end, Py_ssize_t *result) { - Py_ssize_t accumulator, digitval, oldaccumulator; + Py_ssize_t accumulator, digitval; int numdigits; accumulator = numdigits = 0; for (;;(*ptr)++, numdigits++) { @@ -83,19 +83,17 @@ get_integer(STRINGLIB_CHAR **ptr, STRINGLIB_CHAR *end, if (digitval < 0) break; /* - This trick was copied from old Unicode format code. It's cute, - but would really suck on an old machine with a slow divide - implementation. Fortunately, in the normal case we do not - expect too many digits. + Detect possible overflow before it happens: + + accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if + accumulator > (PY_SSIZE_T_MAX - digitval) / 10. */ - oldaccumulator = accumulator; - accumulator *= 10; - if ((accumulator+10)/10 != oldaccumulator+1) { + if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) { PyErr_Format(PyExc_ValueError, "Too many decimal digits in format string"); return -1; } - accumulator += digitval; + accumulator = accumulator * 10 + digitval; } *result = accumulator; return numdigits; diff --git a/Objects/stringlib/string_format.h b/Objects/stringlib/string_format.h index 6c7adcb..c46bdc2 100644 --- a/Objects/stringlib/string_format.h +++ b/Objects/stringlib/string_format.h @@ -197,7 +197,6 @@ get_integer(const SubString *str) { Py_ssize_t accumulator = 0; Py_ssize_t digitval; - Py_ssize_t oldaccumulator; STRINGLIB_CHAR *p; /* empty string is an error */ @@ -209,19 +208,17 @@ get_integer(const SubString *str) if (digitval < 0) return -1; /* - This trick was copied from old Unicode format code. It's cute, - but would really suck on an old machine with a slow divide - implementation. Fortunately, in the normal case we do not - expect too many digits. + Detect possible overflow before it happens: + + accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if + accumulator > (PY_SSIZE_T_MAX - digitval) / 10. */ - oldaccumulator = accumulator; - accumulator *= 10; - if ((accumulator+10)/10 != oldaccumulator+1) { + if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) { PyErr_Format(PyExc_ValueError, "Too many decimal digits in format string"); return -1; } - accumulator += digitval; + accumulator = accumulator * 10 + digitval; } return accumulator; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1dd3a85..3ef9c9b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9648,7 +9648,7 @@ PyObject *PyUnicode_Format(PyObject *format, c = *fmt++; if (c < '0' || c > '9') break; - if ((width*10) / 10 != width) { + if (width > (PY_SSIZE_T_MAX - ((int)c - '0')) / 10) { PyErr_SetString(PyExc_ValueError, "width too big"); goto onError; @@ -9683,7 +9683,7 @@ PyObject *PyUnicode_Format(PyObject *format, c = *fmt++; if (c < '0' || c > '9') break; - if ((prec*10) / 10 != prec) { + if (prec > (INT_MAX - ((int)c - '0')) / 10) { PyErr_SetString(PyExc_ValueError, "prec too big"); goto onError; -- cgit v0.12 From 2ec53be2e272bbe475b2c8173a03dbb29d1413ba Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sun, 28 Oct 2012 14:10:30 +0200 Subject: Issue #14570: Document json sort_keys parameter properly. Patch by Chris Rebert. --- Doc/library/json.rst | 13 +++++++++++-- Lib/json/__init__.py | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 95f120c..f9547cb 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -116,7 +116,10 @@ Using json.tool from the shell to validate and pretty-print:: Basic Usage ----------- -.. function:: dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, **kw) +.. function:: dump(obj, fp, skipkeys=False, ensure_ascii=True, \ + check_circular=True, allow_nan=True, cls=None, \ + indent=None, separators=None, default=None, \ + sort_keys=False, **kw) Serialize *obj* as a JSON formatted stream to *fp* (a ``.write()``-supporting :term:`file-like object`). @@ -159,12 +162,18 @@ Basic Usage *default(obj)* is a function that should return a serializable version of *obj* or raise :exc:`TypeError`. The default simply raises :exc:`TypeError`. + If *sort_keys* is ``True`` (default: ``False``), then the output of + dictionaries will be sorted by key. + To use a custom :class:`JSONEncoder` subclass (e.g. one that overrides the :meth:`default` method to serialize additional types), specify it with the *cls* kwarg; otherwise :class:`JSONEncoder` is used. -.. function:: dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, **kw) +.. function:: dumps(obj, skipkeys=False, ensure_ascii=True, \ + check_circular=True, allow_nan=True, cls=None, \ + indent=None, separators=None, default=None, \ + sort_keys=False, **kw) Serialize *obj* to a JSON formatted :class:`str`. The arguments have the same meaning as in :func:`dump`. diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 725b5cd..86a7a3e 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -122,7 +122,7 @@ _default_encoder = JSONEncoder( def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, - default=None, **kw): + default=None, sort_keys=False, **kw): """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a ``.write()``-supporting file-like object). @@ -155,6 +155,9 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, ``default(obj)`` is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. + If *sort_keys* is ``True`` (default: ``False``), then the output of + dictionaries will be sorted by key. + To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the ``.default()`` method to serialize additional types), specify it with the ``cls`` kwarg; otherwise ``JSONEncoder`` is used. @@ -164,7 +167,7 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, if (not skipkeys and ensure_ascii and check_circular and allow_nan and cls is None and indent is None and separators is None and - default is None and not kw): + default is None and not sort_keys and not kw): iterable = _default_encoder.iterencode(obj) else: if cls is None: @@ -172,7 +175,7 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, check_circular=check_circular, allow_nan=allow_nan, indent=indent, separators=separators, - default=default, **kw).iterencode(obj) + default=default, sort_keys=sort_keys, **kw).iterencode(obj) # could accelerate with writelines in some versions of Python, at # a debuggability cost for chunk in iterable: @@ -181,7 +184,7 @@ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, - default=None, **kw): + default=None, sort_keys=False, **kw): """Serialize ``obj`` to a JSON formatted ``str``. If ``skipkeys`` is false then ``dict`` keys that are not basic types @@ -213,6 +216,9 @@ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, ``default(obj)`` is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. + If *sort_keys* is ``True`` (default: ``False``), then the output of + dictionaries will be sorted by key. + To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the ``.default()`` method to serialize additional types), specify it with the ``cls`` kwarg; otherwise ``JSONEncoder`` is used. @@ -222,14 +228,14 @@ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, if (not skipkeys and ensure_ascii and check_circular and allow_nan and cls is None and indent is None and separators is None and - default is None and not kw): + default is None and not sort_keys and not kw): return _default_encoder.encode(obj) if cls is None: cls = JSONEncoder return cls( skipkeys=skipkeys, ensure_ascii=ensure_ascii, check_circular=check_circular, allow_nan=allow_nan, indent=indent, - separators=separators, default=default, + separators=separators, default=default, sort_keys=sort_keys, **kw).encode(obj) -- cgit v0.12 From 75f0020d29a1a9ea6b06dc125fb3e023655a21bb Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 28 Oct 2012 13:35:56 +0100 Subject: Remove confusing "Release" and "Date" markers from whatsnews. --- Doc/whatsnew/2.6.rst | 2 -- Doc/whatsnew/2.7.rst | 2 -- Doc/whatsnew/3.0.rst | 2 -- Doc/whatsnew/3.1.rst | 2 -- Doc/whatsnew/3.2.rst | 2 -- 5 files changed, 10 deletions(-) diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index a84bc19..bdd7ff7 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -7,8 +7,6 @@ .. XXX add trademark info for Apple, Microsoft, SourceForge. :Author: A.M. Kuchling (amk at amk.ca) -:Release: |release| -:Date: |today| .. $Id$ Rules for maintenance: diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 2e90f96..b26c9b2 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -3,8 +3,6 @@ **************************** :Author: A.M. Kuchling (amk at amk.ca) -:Release: |release| -:Date: |today| .. hyperlink all the methods & functions. diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 9f1ec97..133ecab 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -5,8 +5,6 @@ .. XXX Add trademark info for Apple, Microsoft. :Author: Guido van Rossum -:Release: |release| -:Date: |today| .. $Id$ Rules for maintenance: diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index 64ae1c1..ab327f5 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -3,8 +3,6 @@ **************************** :Author: Raymond Hettinger -:Release: |release| -:Date: |today| .. $Id$ Rules for maintenance: diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 0553ec3..09640f6 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -3,8 +3,6 @@ **************************** :Author: Raymond Hettinger -:Release: |release| -:Date: |today| .. $Id$ Rules for maintenance: -- cgit v0.12 From bdd13fd09819495ce1bf249a705832ce86968b42 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Sun, 28 Oct 2012 12:39:39 +0000 Subject: Closes #16340: Handle exception while copying script to venv. --- Lib/venv/__init__.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 8d2deb7..3c0d7af 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -305,11 +305,17 @@ class EnvBuilder: mode = 'wb' else: mode = 'w' - data = data.decode('utf-8') - data = self.replace_variables(data, context) - with open(dstfile, mode) as f: - f.write(data) - shutil.copymode(srcfile, dstfile) + try: + data = data.decode('utf-8') + data = self.replace_variables(data, context) + except UnicodeDecodeError as e: + data = None + logger.warning('unable to copy script %r, ' + 'may be binary: %s', srcfile, e) + if data is not None: + with open(dstfile, mode) as f: + f.write(data) + shutil.copymode(srcfile, dstfile) def create(env_dir, system_site_packages=False, clear=False, symlinks=False): -- cgit v0.12 From a1952d41201c292f16d7c9cac3a3755cb77bf68c Mon Sep 17 00:00:00 2001 From: Nadeem Vawda Date: Sun, 28 Oct 2012 15:20:48 +0100 Subject: Add test for BZ2Decompressor.decompress("") after end of stream. --- Lib/test/test_bz2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 715468a..5b48e2b 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -365,6 +365,7 @@ class BZ2DecompressorTest(BaseTest): bz2d = BZ2Decompressor() text = bz2d.decompress(self.DATA) self.assertRaises(EOFError, bz2d.decompress, b"anything") + self.assertRaises(EOFError, bz2d.decompress, b"") @bigmemtest(size=_4G, memuse=1.25, dry_run=False) def testBigmem(self, unused_size): -- cgit v0.12