[pypy-commit] pypy stdlib-2.7.8: check fd compatibility with mode in fdopen_as_stream
bdkearns
noreply at buildbot.pypy.org
Wed Aug 27 20:19:37 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: stdlib-2.7.8
Changeset: r73099:ef774aafe39d
Date: 2014-08-27 14:18 -0400
http://bitbucket.org/pypy/pypy/changeset/ef774aafe39d/
Log: check fd compatibility with mode in fdopen_as_stream
diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -8,7 +8,7 @@
from rpython.rlib.rstring import StringBuilder
from pypy.module._file.interp_stream import W_AbstractStream, StreamErrors
from pypy.module.posix.interp_posix import dispatch_filename
-from pypy.interpreter.error import OperationError, oefmt
+from pypy.interpreter.error import OperationError, oefmt, wrap_oserror
from pypy.interpreter.typedef import (TypeDef, GetSetProperty,
interp_attrproperty, make_weakref_descr, interp_attrproperty_w)
from pypy.interpreter.gateway import interp2app, unwrap_spec
@@ -299,8 +299,8 @@
def file_fdopen(self, fd, mode="r", buffering=-1):
try:
self.direct_fdopen(fd, mode, buffering)
- except StreamErrors, e:
- raise wrap_streamerror(self.space, e, self.w_name)
+ except OSError as e:
+ raise wrap_oserror(self.space, e)
_exposed_method_names = []
diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py
--- a/rpython/rlib/_rsocket_rffi.py
+++ b/rpython/rlib/_rsocket_rffi.py
@@ -105,6 +105,9 @@
linux = platform.Defined('linux')
WIN32 = platform.Defined('_WIN32')
+ O_RDONLY = platform.DefinedConstantInteger('O_RDONLY')
+ O_WRONLY = platform.DefinedConstantInteger('O_WRONLY')
+ O_RDWR = platform.DefinedConstantInteger('O_RDWR')
O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK')
F_GETFL = platform.DefinedConstantInteger('F_GETFL')
F_SETFL = platform.DefinedConstantInteger('F_SETFL')
@@ -406,6 +409,9 @@
locals().update(constants)
+O_RDONLY = cConfig.O_RDONLY
+O_WRONLY = cConfig.O_WRONLY
+O_RDWR = cConfig.O_RDWR
O_NONBLOCK = cConfig.O_NONBLOCK
F_GETFL = cConfig.F_GETFL
F_SETFL = cConfig.F_SETFL
diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py
--- a/rpython/rlib/streamio.py
+++ b/rpython/rlib/streamio.py
@@ -37,7 +37,7 @@
import os, sys, errno
from rpython.rlib.objectmodel import specialize, we_are_translated
from rpython.rlib.rarithmetic import r_longlong, intmask
-from rpython.rlib import rposix, nonconst
+from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c
from rpython.rlib.rstring import StringBuilder
from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND
@@ -85,10 +85,26 @@
def _setfd_binary(fd):
pass
+if hasattr(_c, 'fcntl'):
+ def _check_fd_mode(fd, reading, writing):
+ flags = intmask(_c.fcntl(fd, _c.F_GETFL, 0))
+ if flags & _c.O_RDWR:
+ return
+ elif flags & _c.O_WRONLY:
+ if not reading:
+ return
+ else: # O_RDONLY
+ if not writing:
+ return
+ raise OSError(22, "Invalid argument")
+else:
+ def _check_fd_mode(fd, reading, writing):
+ # XXX
+ pass
+
def fdopen_as_stream(fd, mode, buffering=-1, signal_checker=None):
- # XXX XXX XXX you want do check whether the modes are compatible
- # otherwise you get funny results
os_flags, universal, reading, writing, basemode, binary = decode_mode(mode)
+ _check_fd_mode(fd, reading, writing)
_setfd_binary(fd)
stream = DiskFile(fd, signal_checker)
return construct_stream_tower(stream, buffering, universal, reading,
More information about the pypy-commit
mailing list