[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#771148: marked as done ((pre-upload) unblock: pypy/2.4.0+dfsg-2)



Your message dated Sun, 14 Dec 2014 11:56:23 +0100
with message-id <20141214105623.GB16808@ugent.be>
and subject line Re: Bug#771148: (pre-upload) unblock: pypy/2.4.0+dfsg-2
has caused the Debian Bug report #771148,
regarding (pre-upload) unblock: pypy/2.4.0+dfsg-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
771148: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771148
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please consider unblocking the follow upload for package pypy:

There is an FTBFS (#771137) with the current gcc in sid (that I only
noticed when preparing this request), so we should definitely do an
upload, fixing that.

There have been a few issues reported in PyPy 2.4, fixed post-release,
that are probably worth cherry-picking into jessie. They haven't been
reported in Debian's BTS, but even subtle interpreter bugs tend to be
important.

The one that caught my attention was a segfault, if one runs the hy test
suite. See http://thread.gmane.org/gmane.comp.python.pypy/13039

These also appear interesting:
* https://bitbucket.org/pypy/pypy/issue/1902 (one of the two test-cases
  has been fixed)
* https://bitbucket.org/pypy/pypy/issue/1872 (although we don't provide
  have a packaged numpypy in Debian, yet)
* https://bitbucket.org/pypy/pypy/issue/1887

I am proposing the following:

diff --git a/debian/changelog b/debian/changelog
index 541f13e..67f6e59 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,16 @@
+pypy (2.4.0+dfsg-2) UNRELEASED; urgency=medium
+
+  * Patch trackgcroot-new-ops: Fix FTBFS with gcc 4.9.2, expect some new
+    operations. (Closes: #771137)
+  * Cherry-pick upstream patches for:
+    - ast-segfault: an AST compiler crash.
+    - io-double-rewind: EINVAL in raw io.
+    - streamio-ext-seek: Avoid an crash when fds are unexpectedly seeked.
+    - ndarray-swapaxes-segfault: Description: Fix a segfault when doing a noop
+      swapaxes.
+
+ -- Stefano Rivera <stefanor@debian.org>  Thu, 25 Sep 2014 19:56:34 -0700
+
 pypy (2.4.0+dfsg-1) unstable; urgency=medium
 
   * New upstream release.
diff --git a/debian/patches/ast-segfault b/debian/patches/ast-segfault
new file mode 100644
index 0000000..2df75e1
--- /dev/null
+++ b/debian/patches/ast-segfault
@@ -0,0 +1,52 @@
+Description: Fix a crash in the AST compiler
+Origin: Upstream, https://bitbucket.org/pypy/pypy/commits/75ab5316ff3f
+                  https://bitbucket.org/pypy/pypy/commits/27aa8184f00f
+Author: Armin Rigo <arigo@tunes.org>
+
+diff --git a/pypy/module/_ast/test/test_ast.py b/pypy/module/_ast/test/test_ast.py
+--- a/pypy/module/_ast/test/test_ast.py
++++ b/pypy/module/_ast/test/test_ast.py
+@@ -425,3 +425,8 @@
+         str_node2 = copy.deepcopy(str_node)
+         dict_res = str_node2.__dict__
+         assert dict_res == {'n':2, 'lineno':2}
++
++    def test_bug_null_in_objspace_type(self):
++        import ast
++        code = ast.Expression(lineno=1, col_offset=1, body=ast.ListComp(lineno=1, col_offset=1, elt=ast.Call(lineno=1, col_offset=1, func=ast.Name(lineno=1, col_offset=1, id='str', ctx=ast.Load(lineno=1, col_offset=1)), args=[ast.Name(lineno=1, col_offset=1, id='x', ctx=ast.Load(lineno=1, col_offset=1))], keywords=[]), generators=[ast.comprehension(lineno=1, col_offset=1, target=ast.Name(lineno=1, col_offset=1, id='x', ctx=ast.Store(lineno=1, col_offset=1)), iter=ast.List(lineno=1, col_offset=1, elts=[ast.Num(lineno=1, col_offset=1, n=23)], ctx=ast.Load(lineno=1, col_offset=1, )), ifs=[])]))
++        compile(code, '<template>', 'eval')
+
+diff --git a/pypy/interpreter/astcompiler/ast.py b/pypy/interpreter/astcompiler/ast.py
+--- a/pypy/interpreter/astcompiler/ast.py
++++ b/pypy/interpreter/astcompiler/ast.py
+@@ -22,9 +22,11 @@
+ 
+ def get_field(space, w_node, name, optional):
+     w_obj = w_node.getdictvalue(space, name)
+-    if w_obj is None and not optional:
+-        raise oefmt(space.w_TypeError,
++    if w_obj is None:
++        if not optional:
++            raise oefmt(space.w_TypeError,
+                 "required field \"%s\" missing from %T", name, w_node)
++        w_obj = space.w_None
+     return w_obj
+ 
+ 
+diff --git a/pypy/interpreter/astcompiler/tools/asdl_py.py b/pypy/interpreter/astcompiler/tools/asdl_py.py
+--- a/pypy/interpreter/astcompiler/tools/asdl_py.py
++++ b/pypy/interpreter/astcompiler/tools/asdl_py.py
+@@ -405,9 +405,11 @@
+ 
+ def get_field(space, w_node, name, optional):
+     w_obj = w_node.getdictvalue(space, name)
+-    if w_obj is None and not optional:
+-        raise oefmt(space.w_TypeError,
++    if w_obj is None:
++        if not optional:
++            raise oefmt(space.w_TypeError,
+                 "required field \"%s\" missing from %T", name, w_node)
++        w_obj = space.w_None
+     return w_obj
+ 
+ 
diff --git a/debian/patches/io-double-rewind b/debian/patches/io-double-rewind
new file mode 100644
index 0000000..e034889
--- /dev/null
+++ b/debian/patches/io-double-rewind
@@ -0,0 +1,36 @@
+Description: Fix a buffer flush thinko that rewound the raw stream twice
+ Causes EINVALs to be thrown.
+Bug-Upstream: https://bitbucket.org/pypy/pypy/issue/1902
+Origin: upstream, https://bitbucket.org/pypy/pypy/commits/60d682352d46
+Author: Philip Jenvey <pjenvey@underboss.org>
+
+--- a/pypy/module/_io/interp_bufferedio.py
++++ b/pypy/module/_io/interp_bufferedio.py
+@@ -812,11 +812,6 @@
+         self._check_closed(space, "flush of closed file")
+         with self.lock:
+             self._flush_and_rewind_unlocked(space)
+-            if self.readable:
+-                # Rewind the raw stream so that its position corresponds to
+-                # the current logical position.
+-                self._raw_seek(space, -self._raw_offset(), 1)
+-                self._reader_reset_buf()
+ 
+     def _flush_and_rewind_unlocked(self, space):
+         self._writer_flush_unlocked(space)
+--- a/pypy/module/_io/test/test_io.py
++++ b/pypy/module/_io/test/test_io.py
+@@ -352,3 +352,13 @@
+                 assert mod == 'io'
+             else:
+                 assert mod == '_io'
++
++    def test_issue1902(self):
++        import _io
++        with _io.open(self.tmpfile, 'w+b', 4096) as f:
++            f.write(b'\xff' * 13569)
++            f.flush()
++            f.seek(0, 0)
++            f.read(1)
++            f.seek(-1, 1)
++            f.write(b'')
diff --git a/debian/patches/ndarray-swapaxes-segfault b/debian/patches/ndarray-swapaxes-segfault
new file mode 100644
index 0000000..fa32496
--- /dev/null
+++ b/debian/patches/ndarray-swapaxes-segfault
@@ -0,0 +1,29 @@
+Description: Fix a segfault when doing a noop swapaxes
+Author: Brian Kearns <bdkearns@gmail.com>
+Bug-Upstream: https://bitbucket.org/pypy/pypy/issue/1872
+Origin: upstream, https://bitbucket.org/pypy/pypy/commits/8faa11984f7a
+
+--- a/pypy/module/micronumpy/ndarray.py
++++ b/pypy/module/micronumpy/ndarray.py
+@@ -407,7 +407,7 @@
+         --------
+         numpy.swapaxes : equivalent function
+         """
+-        if self.is_scalar():
++        if axis1 == axis2 or len(self.get_shape()) <= 1:
+             return self
+         return self.implementation.swapaxes(space, self, axis1, axis2)
+ 
+--- a/pypy/module/micronumpy/test/test_ndarray.py
++++ b/pypy/module/micronumpy/test/test_ndarray.py
+@@ -2020,6 +2020,10 @@
+ 
+     def test_swapaxes(self):
+         from numpypy import array
++        x = array([])
++        assert x.swapaxes(0, 2) is x
++        x = array([[1, 2]])
++        assert x.swapaxes(0, 0) is x
+         # testcases from numpy docstring
+         x = array([[1, 2, 3]])
+         assert (x.swapaxes(0, 1) == array([[1], [2], [3]])).all()
diff --git a/debian/patches/series b/debian/patches/series
index 66eae25..9dd096a 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -12,6 +12,11 @@ test_fsync-eatmydata
 test_termios
 fpic-archs
 sandbox-access
+trackgcroot-new-ops
+ast-segfault
+io-double-rewind
+streamio-ext-seek
+ndarray-swapaxes-segfault
 
 # from python2.7
 ctypes-arm
diff --git a/debian/patches/streamio-ext-seek b/debian/patches/streamio-ext-seek
new file mode 100644
index 0000000..70e526a
--- /dev/null
+++ b/debian/patches/streamio-ext-seek
@@ -0,0 +1,64 @@
+Description: Avoid crashing with an AssertionError when fds are unexpectedly seeked
+Author: Armin Rigo <arigo@tunes.org>
+Bug-Upstream: https://bitbucket.org/pypy/pypy/issue/1887
+Origin: upstream, https://bitbucket.org/pypy/pypy/commits/80f6a6e5c89c
+
+--- a/rpython/rlib/streamio.py
++++ b/rpython/rlib/streamio.py
+@@ -557,13 +557,27 @@
+ 
+     def tell(self):
+         tellpos = self.do_tell()  # This may fail
++        # Best-effort: to avoid extra system calls to tell() all the
++        # time, and a more complicated logic in this class, we can
++        # only assume that nobody changed the underlying file
++        # descriptor position while we have buffered data.  If they
++        # do, we might get bogus results here (and the following
++        # read() will still return the data cached at the old
++        # position).  Just make sure that we don't fail an assert.
+         offset = len(self.buf) - self.pos
+-        assert tellpos >= offset #, (locals(), self.__dict__)
++        if tellpos < offset:
++            # bug!  someone changed the fd position under our feet,
++            # and moved it at or very close to the beginning of the
++            # file, so that we have more buffered data than the
++            # current offset.
++            self.buf = ""
++            self.pos = 0
++            offset = 0
+         return tellpos - offset
+ 
+     def seek(self, offset, whence):
+-        # This may fail on the do_seek() or do_tell() call.
+-        # But it won't call either on a relative forward seek.
++        # This may fail on the do_seek() or on the tell() call.
++        # But it won't depend on either on a relative forward seek.
+         # Nor on a seek to the very end.
+         if whence == 0 or whence == 1:
+             currentsize = len(self.buf) - self.pos
+--- a/rpython/rlib/test/test_streamio.py
++++ b/rpython/rlib/test/test_streamio.py
+@@ -1119,6 +1119,23 @@
+         assert x.read() == 'abc123456'
+         x.close()
+ 
++    def test_seek_changed_underlying_position(self):
++        tfn = str(udir.join('seek_changed_underlying_position'))
++        fo = streamio.open_file_as_stream # shorthand
++        x = fo(tfn, 'w')
++        x.write('abc123')
++        x.close()
++
++        x = fo(tfn, 'r')
++        fd = x.try_to_find_file_descriptor()
++        assert fd >= 0
++        got = x.read(1)
++        assert got == 'a'
++        assert x.tell() == 1
++        os.lseek(fd, 0, 0)
++        assert x.tell() == 0    # detected in this case.  not always.
++        # the point of the test is that we don't crash in an assert.
++
+ 
+ # Speed test
+ 
diff --git a/debian/patches/trackgcroot-new-ops b/debian/patches/trackgcroot-new-ops
new file mode 100644
index 0000000..dd3a688
--- /dev/null
+++ b/debian/patches/trackgcroot-new-ops
@@ -0,0 +1,26 @@
+Description: Expect cmovnb and jnb
+ Fixes an FTBFS since gcc 4.9.2, which is emmiting new operations
+Author: Stefano Rivera <stefanor@debian.org>
+Forwarded: https://bitbucket.org/pypy/pypy/commits/c1abec418acf30bb04891c3249bc12cbe8f48d4a
+Bug-Debian: https://bugs.debian.org/771137
+Last-Update: 2014-11-26
+
+--- a/rpython/translator/c/gcc/trackgcroot.py
++++ b/rpython/translator/c/gcc/trackgcroot.py
+@@ -590,7 +590,7 @@
+ 
+     # The various cmov* operations
+     for name in '''
+-        e ne g ge l le a ae b be p np s ns o no
++        e ne g ge l le a ae b be nb p np s ns o no
+         '''.split():
+         locals()['visit_cmov' + name] = binary_insn
+         locals()['visit_cmov' + name + 'l'] = binary_insn
+@@ -837,6 +837,7 @@
+     visit_jb = conditional_jump
+     visit_jbe = conditional_jump
+     visit_jp = conditional_jump
++    visit_jnb = conditional_jump
+     visit_jnp = conditional_jump
+     visit_js = conditional_jump
+     visit_jns = conditional_jump

Thanks,

SR

unblock pypy/2.4.0+dfsg-2

--- End Message ---
--- Begin Message ---
Hi Stefano,

On Sat, Dec 13, 2014 at 09:59:13PM +0200, Stefano Rivera wrote:
> Another (pair of) give-backs resolved it.

Unblocked.

Cheers,

Ivo

--- End Message ---

Reply to: