Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r81833:4fd739667032
Date: 2016-01-18 11:08 +0100
http://bitbucket.org/pypy/pypy/changeset/4fd739667032/

Log:    test and fix for the sandboxing issue on 32-bit (test_lseek)

diff --git a/rpython/rlib/rmarshal.py b/rpython/rlib/rmarshal.py
--- a/rpython/rlib/rmarshal.py
+++ b/rpython/rlib/rmarshal.py
@@ -90,6 +90,8 @@
     dumper._annenforceargs_ = [s_list_of_chars, s_obj]
 
 def add_loader(s_obj, loader):
+    # 's_obj' should be the **least general annotation** that we're
+    # interested in, somehow
     loaders.append((s_obj, loader))
 
 def get_dumper_annotation(dumper):
@@ -187,6 +189,14 @@
 
 r_32bits_mask = r_longlong(0xFFFFFFFF)
 
+def load_longlong_nonneg(loader):
+    x = load_longlong(loader)
+    if x < 0:
+        raise ValueError("expected a non-negative longlong")
+    return x
+add_loader(annmodel.SomeInteger(knowntype=r_longlong, nonneg=True),
+           load_longlong_nonneg)
+
 def load_longlong(loader):
     if readchr(loader) != TYPE_INT64:
         raise ValueError("expected a longlong")
diff --git a/rpython/rlib/test/test_rmarshal.py 
b/rpython/rlib/test/test_rmarshal.py
--- a/rpython/rlib/test/test_rmarshal.py
+++ b/rpython/rlib/test/test_rmarshal.py
@@ -190,3 +190,13 @@
     assert sttuple[4] == st[4]
     assert sttuple[5] == st[5]
     assert len(sttuple) == 10
+
+def test_longlong():
+    # get_loader for (r_longolong, nonneg=True) used to return
+    # load_int_nonneg on 32-bit, instead of load_longlong.
+    for nonneg in [True, False]:
+        s_longlong = annmodel.SomeInteger(knowntype=r_longlong, nonneg=nonneg)
+        load = get_loader(s_longlong)
+        loader = Loader("I\x01\x23\x45\x67\x89\xab\xcd\x0e")
+        res = load(loader)
+        assert res == 0x0ecdab8967452301
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to