]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #26494: Fixed crash on iterating exhausting iterators.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Mar 2016 17:41:15 +0000 (20:41 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 30 Mar 2016 17:41:15 +0000 (20:41 +0300)
Affected classes are generic sequence iterators, iterators of str, bytes,
bytearray, list, tuple, set, frozenset, dict, OrderedDict, corresponding
views and os.scandir() iterator.

15 files changed:
1  2 
Lib/test/support/__init__.py
Lib/test/test_bytes.py
Lib/test/test_deque.py
Lib/test/test_dict.py
Lib/test/test_ordered_dict.py
Lib/test/test_set.py
Misc/NEWS
Modules/posixmodule.c
Objects/bytearrayobject.c
Objects/bytesobject.c
Objects/dictobject.c
Objects/listobject.c
Objects/setobject.c
Objects/tupleobject.c
Objects/unicodeobject.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc Misc/NEWS
index 34ef0cd6b01640c3c156fc2713db4c6c00b3b8d2,391bbf256e62a1e2543a42089d59cee7318765d8..6fb0fc4fdda0b5d4b182daf61baa8c43eebc6153
+++ b/Misc/NEWS
@@@ -10,9 -10,11 +10,14 @@@ Release date: tb
  Core and Builtins
  -----------------
  
+ - Issue #26494: Fixed crash on iterating exhausting iterators.
+   Affected classes are generic sequence iterators, iterators of str, bytes,
+   bytearray, list, tuple, set, frozenset, dict, OrderedDict, corresponding
+   views and os.scandir() iterator.
 +- Issue #26574: Optimize ``bytes.replace(b'', b'.')`` and
 +  ``bytearray.replace(b'', b'.')``. Patch written by Josh Snider.
 +
  - Issue #26581: If coding cookie is specified multiple times on a line in
    Python source code file, only the first one is taken to account.
  
index 1cd0f24148c88950309dc6f06d3ccd9c2000206b,c95668b3fda66b6ecc311edb23fde9a3b85baa47..9013888f290a4649adcd1feb4e4c138d15345cc5
@@@ -11947,22 -11925,18 +11947,24 @@@ typedef struct 
  
  #ifdef MS_WINDOWS
  
 +static int
 +ScandirIterator_is_closed(ScandirIterator *iterator)
 +{
 +    return iterator->handle == INVALID_HANDLE_VALUE;
 +}
 +
  static void
 -ScandirIterator_close(ScandirIterator *iterator)
 +ScandirIterator_closedir(ScandirIterator *iterator)
  {
-     if (iterator->handle == INVALID_HANDLE_VALUE)
+     HANDLE handle = iterator->handle;
+     if (handle == INVALID_HANDLE_VALUE)
          return;
  
+     iterator->handle = INVALID_HANDLE_VALUE;
      Py_BEGIN_ALLOW_THREADS
-     FindClose(iterator->handle);
+     FindClose(handle);
      Py_END_ALLOW_THREADS
-     iterator->handle = INVALID_HANDLE_VALUE;
  }
  
  static PyObject *
@@@ -12009,22 -11983,18 +12011,24 @@@ ScandirIterator_iternext(ScandirIterato
  
  #else /* POSIX */
  
 +static int
 +ScandirIterator_is_closed(ScandirIterator *iterator)
 +{
 +    return !iterator->dirp;
 +}
 +
  static void
 -ScandirIterator_close(ScandirIterator *iterator)
 +ScandirIterator_closedir(ScandirIterator *iterator)
  {
-     if (!iterator->dirp)
+     DIR *dirp = iterator->dirp;
+     if (!dirp)
          return;
  
+     iterator->dirp = NULL;
      Py_BEGIN_ALLOW_THREADS
-     closedir(iterator->dirp);
+     closedir(dirp);
      Py_END_ALLOW_THREADS
-     iterator->dirp = NULL;
      return;
  }
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge