Author: Armin Rigo <[email protected]>
Branch: sandbox-2
Changeset: r97290:76b447660dd6
Date: 2019-08-27 09:26 +0200
http://bitbucket.org/pypy/pypy/changeset/76b447660dd6/
Log: More review of the posix modules
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -395,12 +395,14 @@
save_err=rffi.RFFI_SAVE_ERRNO)
c_open = external(UNDERSCORE_ON_WIN32 + 'open',
[rffi.CCHARP, rffi.INT, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
# Win32 Unicode functions
c_wopen = external(UNDERSCORE_ON_WIN32 + 'wopen',
[rffi.CWCHARP, rffi.INT, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
#___________________________________________________________________
# Wrappers around posix functions, that accept either strings, or
@@ -495,7 +497,6 @@
#___________________________________________________________________
-@sandbox_review(reviewed=True)
@replace_os_function('open')
@specialize.argtype(0)
@enforceargs(NOT_CONSTANT, int, int, typecheck=False)
@@ -652,13 +653,13 @@
#___________________________________________________________________
c_chdir = external('chdir', [rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_fchdir = external('fchdir', [rffi.INT], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO)
c_access = external(UNDERSCORE_ON_WIN32 + 'access',
- [rffi.CCHARP, rffi.INT], rffi.INT)
+ [rffi.CCHARP, rffi.INT], rffi.INT, sandboxsafe="nowrite")
c_waccess = external(UNDERSCORE_ON_WIN32 + 'waccess',
- [rffi.CWCHARP, rffi.INT], rffi.INT)
+ [rffi.CWCHARP, rffi.INT], rffi.INT, sandboxsafe="nowrite")
@replace_os_function('chdir')
@specialize.argtype(0)
@@ -714,7 +715,6 @@
with FdValidator(fd):
handle_posix_error('fchdir', c_fchdir(fd))
-@sandbox_review(reviewed=True)
@replace_os_function('access')
@specialize.argtype(0)
def access(path, mode):
@@ -817,9 +817,11 @@
DIRENT = dirent_config['DIRENT']
DIRENTP = lltype.Ptr(DIRENT)
c_opendir = external('opendir',
- [rffi.CCHARP], DIRP, save_err=rffi.RFFI_SAVE_ERRNO)
+ [rffi.CCHARP], DIRP, save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
c_fdopendir = external('fdopendir',
- [rffi.INT], DIRP, save_err=rffi.RFFI_SAVE_ERRNO)
+ [rffi.INT], DIRP, save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
c_rewinddir = external('rewinddir',
[DIRP], lltype.Void, releasegil=False)
# XXX macro=True is hack to make sure we get the correct kind of
@@ -834,6 +836,7 @@
else:
dirent_config = {}
+@sandbox_review(reviewed=True)
def _listdir(dirp, rewind=False):
result = []
while True:
@@ -853,6 +856,7 @@
return result
if not _WIN32:
+ @sandbox_review(reviewed=True)
def fdlistdir(dirfd):
"""
Like listdir(), except that the directory is specified as an open
@@ -927,17 +931,17 @@
#___________________________________________________________________
c_execv = external('execv', [rffi.CCHARP, rffi.CCHARPP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_execve = external('execve',
[rffi.CCHARP, rffi.CCHARPP, rffi.CCHARPP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_spawnv = external(UNDERSCORE_ON_WIN32 + 'spawnv',
[rffi.INT, rffi.CCHARP, rffi.CCHARPP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_spawnve = external(UNDERSCORE_ON_WIN32 + 'spawnve',
[rffi.INT, rffi.CCHARP, rffi.CCHARPP, rffi.CCHARPP],
rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
@replace_os_function('execv')
def execv(path, args):
@@ -1116,6 +1120,7 @@
c_getloadavg = external('getloadavg',
[rffi.CArrayPtr(lltype.Float), rffi.INT], rffi.INT)
+@sandbox_review(reviewed=True)
@replace_os_function('getlogin')
def getlogin():
result = c_getlogin()
@@ -1123,6 +1128,7 @@
raise OSError(get_saved_errno(), "getlogin failed")
return rffi.charp2str(result)
+@sandbox_review(reviewed=True)
@replace_os_function('getloadavg')
def getloadavg():
load = lltype.malloc(rffi.CArrayPtr(lltype.Float).TO, 3, flavor='raw')
@@ -1140,6 +1146,7 @@
[rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T], rffi.SSIZE_T,
save_err=rffi.RFFI_SAVE_ERRNO)
+@sandbox_review(reviewed=True)
@replace_os_function('readlink')
def readlink(path):
path = _as_bytes0(path)
@@ -1174,6 +1181,7 @@
releasegil=False,
save_err=rffi.RFFI_SAVE_ERRNO)
+@sandbox_review(reviewed=True)
@replace_os_function('ttyname')
def ttyname(fd):
l_name = c_ttyname(fd)
@@ -1184,6 +1192,7 @@
c_strerror = external('strerror', [rffi.INT], rffi.CCHARP,
releasegil=False, sandboxsafe=True)
+@sandbox_review(reviewed=True)
@replace_os_function('strerror')
def strerror(errnum):
res = c_strerror(errnum)
@@ -1191,20 +1200,20 @@
raise ValueError("os_strerror failed")
return rffi.charp2str(res)
-c_system = external('system', [rffi.CCHARP], rffi.INT)
+c_system = external('system', [rffi.CCHARP], rffi.INT, sandboxsafe="nowrite")
@replace_os_function('system')
def system(command):
return widen(c_system(command))
c_unlink = external('unlink', [rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_mkdir = external('mkdir', [rffi.CCHARP, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_rmdir = external(UNDERSCORE_ON_WIN32 + 'rmdir', [rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_wrmdir = external(UNDERSCORE_ON_WIN32 + 'wrmdir', [rffi.CWCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
@replace_os_function('unlink')
@specialize.argtype(0)
@@ -1238,11 +1247,11 @@
handle_posix_error('rmdir', c_rmdir(_as_bytes0(path)))
c_chmod = external('chmod', [rffi.CCHARP, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_fchmod = external('fchmod', [rffi.INT, rffi.MODE_T], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO,)
c_rename = external('rename', [rffi.CCHARP, rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
@replace_os_function('chmod')
@specialize.argtype(0)
@@ -1299,10 +1308,11 @@
#___________________________________________________________________
c_mkfifo = external('mkfifo', [rffi.CCHARP, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_mknod = external('mknod', [rffi.CCHARP, rffi.MODE_T, rffi.INT], rffi.INT,
# # xxx: actually ^^^ dev_t
- macro=_MACRO_ON_POSIX, save_err=rffi.RFFI_SAVE_ERRNO)
+ macro=_MACRO_ON_POSIX, save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
@replace_os_function('mkfifo')
@specialize.argtype(0)
@@ -1391,9 +1401,9 @@
lltype.free(filedes, flavor='raw')
c_link = external('link', [rffi.CCHARP, rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO,)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_symlink = external('symlink', [rffi.CCHARP, rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
#___________________________________________________________________
@@ -1426,9 +1436,9 @@
return widen(c_umask(newmask))
c_chown = external('chown', [rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_lchown = external('lchown', [rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_fchown = external('fchown', [rffi.INT, rffi.INT, rffi.INT], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO)
@@ -1686,12 +1696,14 @@
c_ctermid = external('ctermid', [rffi.CCHARP], rffi.CCHARP)
+@sandbox_review(reviewed=True)
@replace_os_function('ctermid')
def ctermid():
return rffi.charp2str(c_ctermid(lltype.nullptr(rffi.CCHARP.TO)))
c_tmpnam = external('tmpnam', [rffi.CCHARP], rffi.CCHARP)
+@sandbox_review(reviewed=True)
@replace_os_function('tmpnam')
def tmpnam():
return rffi.charp2str(c_tmpnam(lltype.nullptr(rffi.CCHARP.TO)))
@@ -1743,8 +1755,10 @@
c_setgroups = external('setgroups', [rffi.SIZE_T, GID_GROUPS_T], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO)
c_initgroups = external('initgroups', [rffi.CCHARP, GID_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ sandboxsafe="nowrite")
+@sandbox_review(reviewed=True)
@replace_os_function('getgroups')
def getgroups():
n = handle_posix_error('getgroups',
@@ -1962,6 +1976,7 @@
c_chroot = external('chroot', [rffi.CCHARP], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO,
macro=_MACRO_ON_POSIX,
+ sandboxsafe="nowrite",
compilation_info=ExternalCompilationInfo(includes=['unistd.h']))
@replace_os_function('chroot')
@@ -1987,6 +2002,7 @@
compilation_info=CConfig._compilation_info_,
save_err=rffi.RFFI_SAVE_ERRNO)
+@sandbox_review(reviewed=True)
@replace_os_function('uname')
def uname():
l_utsbuf = lltype.malloc(UTSNAMEP.TO, flavor='raw')
@@ -2030,7 +2046,8 @@
c_fpathconf = external('fpathconf', [rffi.INT, rffi.INT], rffi.LONG,
save_err=rffi.RFFI_FULL_ERRNO_ZERO)
c_pathconf = external('pathconf', [rffi.CCHARP, rffi.INT], rffi.LONG,
- save_err=rffi.RFFI_FULL_ERRNO_ZERO)
+ save_err=rffi.RFFI_FULL_ERRNO_ZERO,
+ sandboxsafe="nowrite")
c_confstr = external('confstr',
[rffi.INT, rffi.CCHARP, rffi.SIZE_T], rffi.SIZE_T,
save_err=rffi.RFFI_FULL_ERRNO_ZERO)
@@ -2062,6 +2079,7 @@
raise OSError(errno, "pathconf failed")
return res
+@sandbox_review(reviewed=True)
@replace_os_function('confstr')
def confstr(value):
n = intmask(c_confstr(value, lltype.nullptr(rffi.CCHARP.TO), 0))
@@ -2135,7 +2153,8 @@
if HAVE_FACCESSAT:
c_faccessat = external('faccessat',
- [rffi.INT, rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT)
+ [rffi.INT, rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT,
+ sandboxsafe="nowrite")
def faccessat(pathname, mode, dir_fd=AT_FDCWD,
effective_ids=False, follow_symlinks=True):
@@ -2153,7 +2172,7 @@
if HAVE_FCHMODAT:
c_fchmodat = external('fchmodat',
[rffi.INT, rffi.CCHARP, rffi.INT, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO,)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def fchmodat(path, mode, dir_fd=AT_FDCWD, follow_symlinks=True):
if follow_symlinks:
@@ -2166,7 +2185,7 @@
if HAVE_FCHOWNAT:
c_fchownat = external('fchownat',
[rffi.INT, rffi.CCHARP, rffi.INT, rffi.INT, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO,)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def fchownat(path, owner, group, dir_fd=AT_FDCWD,
follow_symlinks=True, empty_path=False):
@@ -2181,7 +2200,7 @@
if HAVE_FEXECVE:
c_fexecve = external('fexecve',
[rffi.INT, rffi.CCHARPP, rffi.CCHARPP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def fexecve(fd, args, env):
envstrs = []
@@ -2202,7 +2221,7 @@
c_linkat = external(
'linkat',
[rffi.INT, rffi.CCHARP, rffi.INT, rffi.CCHARP, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def linkat(src, dst, src_dir_fd=AT_FDCWD, dst_dir_fd=AT_FDCWD,
follow_symlinks=True):
@@ -2296,7 +2315,7 @@
if HAVE_MKDIRAT:
c_mkdirat = external('mkdirat',
[rffi.INT, rffi.CCHARP, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def mkdirat(pathname, mode, dir_fd=AT_FDCWD):
error = c_mkdirat(dir_fd, pathname, mode)
@@ -2305,7 +2324,7 @@
if HAVE_UNLINKAT:
c_unlinkat = external('unlinkat',
[rffi.INT, rffi.CCHARP, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def unlinkat(pathname, dir_fd=AT_FDCWD, removedir=False):
flag = AT_REMOVEDIR if removedir else 0
@@ -2343,7 +2362,7 @@
c_renameat = external(
'renameat',
[rffi.INT, rffi.CCHARP, rffi.INT, rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def renameat(src, dst, src_dir_fd=AT_FDCWD, dst_dir_fd=AT_FDCWD):
error = c_renameat(src_dir_fd, src, dst_dir_fd, dst)
@@ -2353,7 +2372,7 @@
if HAVE_SYMLINKAT:
c_symlinkat = external('symlinkat',
[rffi.CCHARP, rffi.INT, rffi.CCHARP], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def symlinkat(src, dst, dir_fd=AT_FDCWD):
error = c_symlinkat(src, dir_fd, dst)
@@ -2362,7 +2381,7 @@
if HAVE_OPENAT:
c_openat = external('openat',
[rffi.INT, rffi.CCHARP, rffi.INT, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
@enforceargs(s_Str0, int, int, int, typecheck=False)
def openat(path, flags, mode, dir_fd=AT_FDCWD):
@@ -2372,7 +2391,7 @@
if HAVE_MKFIFOAT:
c_mkfifoat = external('mkfifoat',
[rffi.INT, rffi.CCHARP, rffi.MODE_T], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def mkfifoat(path, mode, dir_fd=AT_FDCWD):
error = c_mkfifoat(dir_fd, path, mode)
@@ -2381,7 +2400,7 @@
if HAVE_MKNODAT:
c_mknodat = external('mknodat',
[rffi.INT, rffi.CCHARP, rffi.MODE_T, rffi.INT], rffi.INT,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
def mknodat(path, mode, device, dir_fd=AT_FDCWD):
error = c_mknodat(dir_fd, path, mode, device)
@@ -2693,29 +2712,29 @@
[rffi.INT, rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T, rffi.INT],
rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_setxattr = external('setxattr',
[rffi.CCHARP, rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T, rffi.INT],
rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_lsetxattr = external('lsetxattr',
[rffi.CCHARP, rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T, rffi.INT],
rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_fremovexattr = external('fremovexattr',
[rffi.INT, rffi.CCHARP], rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_removexattr = external('removexattr',
[rffi.CCHARP, rffi.CCHARP], rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_lremovexattr = external('lremovexattr',
[rffi.CCHARP, rffi.CCHARP], rffi.INT,
compilation_info=CConfig._compilation_info_,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ save_err=rffi.RFFI_SAVE_ERRNO, sandboxsafe="nowrite")
c_flistxattr = external('flistxattr',
[rffi.INT, rffi.CCHARP, rffi.SIZE_T], rffi.SSIZE_T,
compilation_info=CConfig._compilation_info_,
@@ -2730,6 +2749,7 @@
save_err=rffi.RFFI_SAVE_ERRNO)
buf_sizes = [256, XATTR_SIZE_MAX]
+ @sandbox_review(reviewed=True)
def fgetxattr(fd, name):
for size in buf_sizes:
with rffi.scoped_alloc_buffer(size) as buf:
@@ -2744,6 +2764,7 @@
else:
raise OSError(errno.ERANGE, 'fgetxattr failed')
+ @sandbox_review(reviewed=True)
def getxattr(path, name, follow_symlinks=True):
for size in buf_sizes:
with rffi.scoped_alloc_buffer(size) as buf:
@@ -2789,6 +2810,7 @@
del result[-1]
return result
+ @sandbox_review(reviewed=True)
def flistxattr(fd):
for size in buf_sizes:
with rffi.scoped_alloc_buffer(size) as buf:
@@ -2802,6 +2824,7 @@
else:
raise OSError(errno.ERANGE, 'flistxattr failed')
+ @sandbox_review(reviewed=True)
def listxattr(path, follow_symlinks=True):
for size in buf_sizes:
with rffi.scoped_alloc_buffer(size) as buf:
diff --git a/rpython/rlib/rposix_environ.py b/rpython/rlib/rposix_environ.py
--- a/rpython/rlib/rposix_environ.py
+++ b/rpython/rlib/rposix_environ.py
@@ -198,6 +198,7 @@
os_unsetenv = llexternal('unsetenv', [rffi.CCHARP], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO)
+ @sandbox_review(reviewed=True)
def r_unsetenv(name):
with rffi.scoped_str2charp(name) as l_name:
error = rffi.cast(lltype.Signed, os_unsetenv(l_name))
diff --git a/rpython/rlib/rposix_stat.py b/rpython/rlib/rposix_stat.py
--- a/rpython/rlib/rposix_stat.py
+++ b/rpython/rlib/rposix_stat.py
@@ -535,6 +535,7 @@
compilation_info=compilation_info,
save_err=rffi.RFFI_SAVE_ERRNO)
+@sandbox_review(reviewed=True)
@replace_os_function('fstat')
def fstat(fd):
if not _WIN32:
@@ -642,12 +643,14 @@
handle_posix_error('fstatat', error)
return build_stat_result(stresult)
+@sandbox_review(reviewed=True)
@replace_os_function('fstatvfs')
def fstatvfs(fd):
with lltype.scoped_alloc(STATVFS_STRUCT.TO) as stresult:
handle_posix_error('fstatvfs', c_fstatvfs(fd, stresult))
return build_statvfs_result(stresult)
+@sandbox_review(reviewed=True)
@replace_os_function('statvfs')
@specialize.argtype(0)
def statvfs(path):
diff --git a/rpython/rlib/rtime.py b/rpython/rlib/rtime.py
--- a/rpython/rlib/rtime.py
+++ b/rpython/rlib/rtime.py
@@ -236,6 +236,7 @@
diff = a[0] - state.counter_start
return float(diff) / state.divisor
+@sandbox_review(reviewed=True)
@replace_time_function('clock')
def clock():
if _WIN32:
diff --git a/rpython/rtyper/lltypesystem/rffi.py
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -102,7 +102,13 @@
is sandboxed. If False, it will turn into a stdin/stdout
communication with the parent process. If "check_caller",
it is like True but we call @sandbox_review(check_caller=True)
- which means that we need to also check the callers.
+ which means that we need to also check the callers. If
+ "nowrite", we don't need to check the callers. The default
+ of False either implies "check_caller" or "nowrite"
+ depending on whether the function takes and returns pointer
+ arguments or not. Use "nowrite" only if the external
+ function call will only *read* from 'char *' or other data
+ structures passed in.
calling_conv: if 'unknown' or 'win', the C function is not directly seen
by the JIT. If 'c', it can be seen (depending on
@@ -344,6 +350,8 @@
wrapper = sandbox_review(check_caller=True)(wrapper)
elif sandboxsafe == 'abort':
wrapper = sandbox_review(abort=True)(wrapper)
+ elif sandboxsafe == 'nowrite':
+ wrapper = sandbox_review(reviewed=True)(wrapper)
else:
assert isinstance(sandboxsafe, bool)
if sandboxsafe or (all(_sandbox_type_safe(ARG) for ARG in args) and
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit