[pypy-commit] pypy py3.5: Detect null bytes in unicode or byte strings for the OS functions
arigo
pypy.commits at gmail.com
Thu Jan 12 09:20:21 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r89506:6e3116ffd73c
Date: 2017-01-12 15:17 +0100
http://bitbucket.org/pypy/pypy/changeset/6e3116ffd73c/
Log: Detect null bytes in unicode or byte strings for the OS functions
diff --git a/pypy/interpreter/test/test_fsencode.py b/pypy/interpreter/test/test_fsencode.py
--- a/pypy/interpreter/test/test_fsencode.py
+++ b/pypy/interpreter/test/test_fsencode.py
@@ -78,3 +78,8 @@
assert space.fsencode_w(w_enc) == space.bytes_w(w_enc)
assert space.eq_w(space.wrap_fsdecoded(space.bytes_w(w_enc)), w_st2)
+
+ def test_null_byte(self):
+ space = self.space
+ w_u = space.newunicode(u'abc\x00def')
+ space.raises_w(space.w_ValueError, space.fsencode, w_u)
diff --git a/pypy/interpreter/unicodehelper.py b/pypy/interpreter/unicodehelper.py
--- a/pypy/interpreter/unicodehelper.py
+++ b/pypy/interpreter/unicodehelper.py
@@ -1,5 +1,5 @@
import sys
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, oefmt
from rpython.rlib.objectmodel import specialize
from rpython.rlib import runicode
from pypy.module._codecs import interp_codecs
@@ -104,6 +104,8 @@
from pypy.module._codecs.locale import (
unicode_encode_locale_surrogateescape)
uni = space.unicode_w(w_uni)
+ if u'\x00' in uni:
+ raise oefmt(space.w_ValueError, "embedded null character")
bytes = unicode_encode_locale_surrogateescape(
uni, errorhandler=encode_error_handler(space))
else:
diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -148,11 +148,15 @@
try:
path_b = space.fsencode_w(w_value)
return Path(-1, path_b, None, w_value)
- except OperationError:
+ except OperationError as e:
+ if not e.match(space, space.w_TypeError):
+ raise
if allow_fd:
fd = unwrap_fd(space, w_value, "string, bytes or integer")
return Path(fd, None, None, w_value)
- raise oefmt(space.w_TypeError, "illegal type for path parameter")
+ raise oefmt(space.w_TypeError,
+ "illegal type for path parameter (expected "
+ "string or bytes, got %T)", w_value)
class _PathOrFd(Unwrapper):
def unwrap(self, space, w_value):
diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -202,6 +202,8 @@
excinfo = raises(TypeError, self.posix.stat, 2.)
assert "should be string, bytes or integer, not float" in str(excinfo.value)
raises(ValueError, self.posix.stat, -1)
+ raises(ValueError, self.posix.stat, b"abc\x00def")
+ raises(ValueError, self.posix.stat, u"abc\x00def")
if hasattr(__import__(os.name), "statvfs"):
def test_statvfs(self):
More information about the pypy-commit
mailing list