]> granicus.if.org Git - python/commitdiff
merge 3.2 (#14212)
authorBenjamin Peterson <benjamin@python.org>
Wed, 7 Mar 2012 20:59:13 +0000 (14:59 -0600)
committerBenjamin Peterson <benjamin@python.org>
Wed, 7 Mar 2012 20:59:13 +0000 (14:59 -0600)
1  2 
Lib/test/test_re.py
Misc/NEWS
Modules/_sre.c
Modules/sre.h

Simple merge
diff --cc Misc/NEWS
index f3e591c71a4b719474607dcb28d826ed86b9a609,44683f5d5f3acf57ab1efbdfbc04cef9064a95d1..7d6441168f25208922f4047b546835fd101afe96
+++ b/Misc/NEWS
@@@ -2,36 -2,10 +2,42 @@@
  Python News
  +++++++++++
  
 -What's New in Python 3.2.3 release candidate 1?
 -===============================================
 +What's New in Python 3.3.0 Alpha 2?
 +===================================
  
 -*Release date: 24-Feb-2011*
 +*Release date: XXXX-XX-XX*
 +
 +Core and Builtins
 +-----------------
 +
 +- Issue #14205: dict lookup raises a RuntimeError if the dict is modified
 +  during a lookup.
 +
 +Library
 +-------
 +
 +- Issue #14168: Check for presence of Element._attrs in minidom before
 +  accessing it.
 +
 +- Issue #12328: Fix multiprocessing's use of overlapped I/O on Windows.
 +  Also, add a multiprocessing.connection.wait(rlist, timeout=None) function
 +  for polling multiple objects at once.  Patch by sbt.
 +
 +- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end,
 +  data or close method) for the Python implementation as well.
 +  Drop the no-op TreeBuilder().xml() method from the C implementation.
 +
++Extension Modules
++-----------------
++
++- Issue #14212: The re module didn't retain a reference to buffers it was
++  scanning, resulting in segfaults.
++
 +
 +What's New in Python 3.3.0 Alpha 1?
 +===================================
 +
 +*Release date: 05-Mar-2012*
  
  Core and Builtins
  -----------------
diff --cc Modules/_sre.c
index f1c3bafd21e15160ab96bb73b6098b0fddf19d03,472b5a3797d8fa1e59a3dedce64c1e5f6401b6bd..92544808d39e066b7640ff0cd37a97451fa42447
@@@ -1649,8 -1664,7 +1649,9 @@@ state_reset(SRE_STATE* state
  }
  
  static void*
 -getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *view)
 +getstring(PyObject* string, Py_ssize_t* p_length,
-           int* p_logical_charsize, int* p_charsize)
++          int* p_logical_charsize, int* p_charsize,
++          Py_buffer *view)
  {
      /* given a python object, return a data pointer, a length (in
         characters), and a character size.  return NULL if the object
          return ptr;
      }
  
 -    /* get pointer to string buffer */
 +    /* get pointer to byte string buffer */
-     view.len = -1;
+     view->len = -1;
      buffer = Py_TYPE(string)->tp_as_buffer;
      if (!buffer || !buffer->bf_getbuffer ||
-         (*buffer->bf_getbuffer)(string, &view, PyBUF_SIMPLE) < 0) {
+         (*buffer->bf_getbuffer)(string, view, PyBUF_SIMPLE) < 0) {
              PyErr_SetString(PyExc_TypeError, "expected string or buffer");
              return NULL;
      }
  
      if (PyBytes_Check(string) || bytes == size)
          charsize = 1;
 -#if defined(HAVE_UNICODE)
 -    else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE)))
 -        charsize = sizeof(Py_UNICODE);
 -#endif
      else {
          PyErr_SetString(PyExc_TypeError, "buffer size mismatch");
-         return NULL;
+         goto err;
      }
  
      *p_length = size;
@@@ -1733,20 -1746,21 +1733,21 @@@ state_init(SRE_STATE* state, PatternObj
      state->lastmark = -1;
      state->lastindex = -1;
  
-     ptr = getstring(string, &length, &logical_charsize, &charsize);
+     state->buffer.buf = NULL;
 -    ptr = getstring(string, &length, &charsize, &state->buffer);
++    ptr = getstring(string, &length, &logical_charsize, &charsize, &state->buffer);
      if (!ptr)
-         return NULL;
+         goto err;
  
-         if (logical_charsize == 1 && pattern->logical_charsize > 1) {
-                 PyErr_SetString(PyExc_TypeError,
 -    if (charsize == 1 && pattern->charsize > 1) {
++    if (logical_charsize == 1 && pattern->logical_charsize > 1) {
+         PyErr_SetString(PyExc_TypeError,
 -                      "can't use a string pattern on a bytes-like object");
 +                        "can't use a string pattern on a bytes-like object");
-                 return NULL;
-         }
-         if (logical_charsize > 1 && pattern->logical_charsize == 1) {
-                 PyErr_SetString(PyExc_TypeError,
+         goto err;
+     }
 -    if (charsize > 1 && pattern->charsize == 1) {
++    if (logical_charsize > 1 && pattern->logical_charsize == 1) {
+         PyErr_SetString(PyExc_TypeError,
 -                      "can't use a bytes pattern on a string-like object");
 +                        "can't use a bytes pattern on a string-like object");
-                 return NULL;
-         }
+         goto err;
+     }
  
      /* adjust boundaries */
      if (start < 0)
@@@ -2270,8 -2303,9 +2279,9 @@@ pattern_subx(PatternObject* self, PyObj
      int status;
      Py_ssize_t n;
      Py_ssize_t i, b, e;
 -    int bint;
 +    int logical_charsize, charsize;
      int filter_is_callable;
+     Py_buffer view;
  
      if (PyCallable_Check(ptemplate)) {
          /* sub/subn takes either a function or a template */
      } else {
          /* if not callable, check if it's a literal string */
          int literal;
-         ptr = getstring(ptemplate, &n, &logical_charsize, &charsize);
+         view.buf = NULL;
 -        ptr = getstring(ptemplate, &n, &bint, &view);
 -        b = bint;
++        ptr = getstring(ptemplate, &n, &logical_charsize, &charsize, &view);
 +        b = charsize;
          if (ptr) {
 -            if (b == 1) {
 -                  literal = sre_literal_template((unsigned char *)ptr, n);
 -            } else {
 -#if defined(HAVE_UNICODE)
 -                  literal = sre_uliteral_template((Py_UNICODE *)ptr, n);
 -#endif
 -            }
 +            literal = sre_literal_template(b, ptr, n);
          } else {
              PyErr_Clear();
              literal = 0;
@@@ -2661,14 -2708,11 +2676,14 @@@ _compile(PyObject* self_, PyObject* arg
          return NULL;
      }
  
 -    if (pattern == Py_None)
 +    if (pattern == Py_None) {
 +        self->logical_charsize = -1;
          self->charsize = -1;
 +    }
      else {
          Py_ssize_t p_length;
 -        if (!getstring(pattern, &p_length, &self->charsize, &self->view)) {
 +        if (!getstring(pattern, &p_length, &self->logical_charsize,
-                        &self->charsize)) {
++                       &self->charsize, &self->view)) {
              Py_DECREF(self);
              return NULL;
          }
diff --cc Modules/sre.h
index 0d91f254094f5fe86b600b3d25d24a82b8efc70f,aec9b541dd0fc6b8fce6879dc6e8ac6ebe50eb70..01abcb0aedf75e6abc07f769d1029c705fa9e00e
@@@ -30,8 -30,8 +30,9 @@@ typedef struct 
      PyObject* pattern; /* pattern source (or None) */
      int flags; /* flags used when compiling pattern source */
      PyObject *weakreflist; /* List of weak references */
 -      int charsize; /* pattern charsize (or -1) */
 +    int logical_charsize; /* pattern charsize (or -1) */
 +    int charsize;
+     Py_buffer view;
      /* pattern code */
      Py_ssize_t codesize;
      SRE_CODE code[1];