Commit 4cd6a95d authored by Benjamin Peterson's avatar Benjamin Peterson

Merged revisions 65659,65693,65700,65702,65706-65707,65761 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r65659 | martin.v.loewis | 2008-08-12 15:45:21 -0500 (Tue, 12 Aug 2008) | 2 lines

  Add Hirokazu Yamamoto.
........
  r65693 | georg.brandl | 2008-08-15 13:35:09 -0500 (Fri, 15 Aug 2008) | 2 lines

  #3558: Attribute reference binds more tightly than subscription and call.
........
  r65700 | antoine.pitrou | 2008-08-15 16:03:21 -0500 (Fri, 15 Aug 2008) | 3 lines

  #2676: email/message.py [Message.get_content_type]: Trivial regex hangs on pathological input
........
  r65702 | gregory.p.smith | 2008-08-15 18:14:00 -0500 (Fri, 15 Aug 2008) | 2 lines

  document that waitpid raises OSError
........
  r65706 | benjamin.peterson | 2008-08-15 22:02:41 -0500 (Fri, 15 Aug 2008) | 1 line

  fix markup
........
  r65707 | benjamin.peterson | 2008-08-15 22:13:07 -0500 (Fri, 15 Aug 2008) | 1 line

  note how os.utime should be used for emulating touch
........
  r65761 | antoine.pitrou | 2008-08-17 08:06:29 -0500 (Sun, 17 Aug 2008) | 3 lines

  fix ZipFile.testzip() to work with very large embedded files
........
parent 9209138f
...@@ -1076,15 +1076,16 @@ Files and Directories ...@@ -1076,15 +1076,16 @@ Files and Directories
.. function:: utime(path, times) .. function:: utime(path, times)
Set the access and modified times of the file specified by *path*. If *times* is Set the access and modified times of the file specified by *path*. If *times*
``None``, then the file's access and modified times are set to the current time. is ``None``, then the file's access and modified times are set to the current
Otherwise, *times* must be a 2-tuple of numbers, of the form ``(atime, mtime)`` time. (The effect is similar to running the Unix program :program:`touch` on
which is used to set the access and modified times, respectively. Whether a the path.) Otherwise, *times* must be a 2-tuple of numbers, of the form
directory can be given for *path* depends on whether the operating system ``(atime, mtime)`` which is used to set the access and modified times,
implements directories as files (for example, Windows does not). Note that the respectively. Whether a directory can be given for *path* depends on whether
exact times you set here may not be returned by a subsequent :func:`stat` call, the operating system implements directories as files (for example, Windows
depending on the resolution with which your operating system records access and does not). Note that the exact times you set here may not be returned by a
modification times; see :func:`stat`. subsequent :func:`stat` call, depending on the resolution with which your
operating system records access and modification times; see :func:`stat`.
Availability: Macintosh, Unix, Windows. Availability: Macintosh, Unix, Windows.
...@@ -1596,6 +1597,9 @@ written in Python, such as a mail server's external command delivery program. ...@@ -1596,6 +1597,9 @@ written in Python, such as a mail server's external command delivery program.
``-1``, status is requested for any process in the process group ``-pid`` (the ``-1``, status is requested for any process in the process group ``-pid`` (the
absolute value of *pid*). absolute value of *pid*).
An :exc:`OSError` is raised with the value of errno when the syscall
returns -1.
On Windows: Wait for completion of a process given by process handle *pid*, and On Windows: Wait for completion of a process given by process handle *pid*, and
return a tuple containing *pid*, and its exit status shifted left by 8 bits return a tuple containing *pid*, and its exit status shifted left by 8 bits
(shifting makes cross-platform use of the function easier). A *pid* less than or (shifting makes cross-platform use of the function easier). A *pid* less than or
......
...@@ -1266,13 +1266,13 @@ groups from right to left). ...@@ -1266,13 +1266,13 @@ groups from right to left).
+----------------------------------------------+-------------------------------------+ +----------------------------------------------+-------------------------------------+
| ``**`` | Exponentiation | | ``**`` | Exponentiation |
+----------------------------------------------+-------------------------------------+ +----------------------------------------------+-------------------------------------+
| ``x.attribute`` | Attribute reference |
+----------------------------------------------+-------------------------------------+
| ``x[index]`` | Subscription | | ``x[index]`` | Subscription |
+----------------------------------------------+-------------------------------------+ +----------------------------------------------+-------------------------------------+
| ``x[index:index]`` | Slicing | | ``x[index:index]`` | Slicing |
+----------------------------------------------+-------------------------------------+ +----------------------------------------------+-------------------------------------+
| ``f(arguments...)`` | Function call | | ``x(arguments...)`` | Call |
+----------------------------------------------|-------------------------------------+
| ``x.attribute`` | Attribute reference |
+----------------------------------------------+-------------------------------------+ +----------------------------------------------+-------------------------------------+
| ``(expressions...)`` | Binding, tuple display, generator | | ``(expressions...)`` | Binding, tuple display, generator |
| | expressions | | | expressions |
......
...@@ -20,18 +20,22 @@ from email.charset import Charset ...@@ -20,18 +20,22 @@ from email.charset import Charset
SEMISPACE = '; ' SEMISPACE = '; '
# Regular expression used to split header parameters. BAW: this may be too
# simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches
# most headers found in the wild. We may eventually need a full fledged
# parser eventually.
paramre = re.compile(r'\s*;\s*')
# Regular expression that matches `special' characters in parameters, the # Regular expression that matches `special' characters in parameters, the
# existance of which force quoting of the parameter value. # existance of which force quoting of the parameter value.
tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
# Helper functions # Helper functions
def _splitparam(param):
# Split header parameters. BAW: this may be too simple. It isn't
# strictly RFC 2045 (section 5.1) compliant, but it catches most headers
# found in the wild. We may eventually need a full fledged parser
# eventually.
a, sep, b = param.partition(';')
if not sep:
return a.strip(), None
return a.strip(), b.strip()
def _formatparam(param, value=None, quote=True): def _formatparam(param, value=None, quote=True):
"""Convenience function to format and return a key=value pair. """Convenience function to format and return a key=value pair.
...@@ -443,7 +447,7 @@ class Message: ...@@ -443,7 +447,7 @@ class Message:
if value is missing: if value is missing:
# This should have no parameters # This should have no parameters
return self.get_default_type() return self.get_default_type()
ctype = paramre.split(value)[0].lower().strip() ctype = _splitparam(value)[0].lower()
# RFC 2045, section 5.2 says if its invalid, use text/plain # RFC 2045, section 5.2 says if its invalid, use text/plain
if ctype.count('/') != 1: if ctype.count('/') != 1:
return 'text/plain' return 'text/plain'
......
...@@ -813,9 +813,14 @@ class ZipFile: ...@@ -813,9 +813,14 @@ class ZipFile:
def testzip(self): def testzip(self):
"""Read all the files and check the CRC.""" """Read all the files and check the CRC."""
chunk_size = 2 ** 20
for zinfo in self.filelist: for zinfo in self.filelist:
try: try:
self.read(zinfo.filename) # Check CRC-32 # Read by chunks, to avoid an OverflowError or a
# MemoryError with very large embedded files.
f = self.open(zinfo.filename, "r")
while f.read(chunk_size): # Check CRC-32
pass
except BadZipfile: except BadZipfile:
return zinfo.filename return zinfo.filename
......
...@@ -30,6 +30,10 @@ Core and Builtins ...@@ -30,6 +30,10 @@ Core and Builtins
Library Library
------- -------
- Issue #2676: in the email package, content-type parsing was hanging on
pathological input because of quadratic or exponential behaviour of a
regular expression.
- Issue #3476: binary buffered reading through the new "io" library is now - Issue #3476: binary buffered reading through the new "io" library is now
thread-safe. thread-safe.
......
...@@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise. ...@@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
Permissions History Permissions History
------------------- -------------------
- Hirokazu Yamamoto was given SVN access on August 12 2008 by MvL,
for contributions to the Windows build.
- Antoine Pitrou was given SVN access on July 16 2008, by recommendation - Antoine Pitrou was given SVN access on July 16 2008, by recommendation
from GvR, for general contributions to Python. from GvR, for general contributions to Python.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment