Author: Ronan Lamy <ronan.l...@gmail.com> Branch: follow_symlinks Changeset: r83505:9dc07d8a2654 Date: 2016-04-01 20:35 +0100 http://bitbucket.org/pypy/pypy/changeset/9dc07d8a2654/
Log: Separate implementations of execv() and execve() since their signature and validation logic differ 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 @@ -1151,7 +1151,23 @@ path: path of executable file args: iterable of strings """ - execve(space, w_path, w_args, None) + command = space.fsencode_w(w_path) + try: + args_w = space.unpackiterable(w_args) + if len(args_w) < 1: + raise oefmt(space.w_ValueError, + "execv() arg 2 must not be empty") + args = [space.fsencode_w(w_arg) for w_arg in args_w] + except OperationError, e: + if not e.match(space, space.w_TypeError): + raise + raise oefmt(space.w_TypeError, + "execv() arg 2 must be an iterable of strings") + try: + os.execv(command, args) + except OSError as e: + raise wrap_oserror(space, e) + def _env2interp(space, w_env): env = {} @@ -1161,7 +1177,8 @@ env[space.fsencode_w(w_key)] = space.fsencode_w(w_value) return env -def execve(space, w_path, w_args, w_env): + +def execve(space, w_path, w_argv, w_environment): """execve(path, args, env) Execute a path with arguments and environment, replacing current process. @@ -1175,29 +1192,16 @@ If this functionality is unavailable, using it raises NotImplementedError. """ command = space.fsencode_w(w_path) + if not (space.isinstance_w(w_argv, space.w_list) + or space.isinstance_w(w_argv, space.w_tuple)): + raise oefmt(space.w_TypeError, + "execve: argv must be a tuple or a list") + args = [space.fsencode_w(w_arg) for w_arg in space.unpackiterable(w_argv)] + env = _env2interp(space, w_environment) try: - args_w = space.unpackiterable(w_args) - if len(args_w) < 1: - w_msg = space.wrap("execv() must have at least one argument") - raise OperationError(space.w_ValueError, w_msg) - args = [space.fsencode_w(w_arg) for w_arg in args_w] - except OperationError, e: - if not e.match(space, space.w_TypeError): - raise - msg = "execv() arg 2 must be an iterable of strings" - raise OperationError(space.w_TypeError, space.wrap(str(msg))) - # - if w_env is None: # when called via execv() above - try: - os.execv(command, args) - except OSError, e: - raise wrap_oserror(space, e) - else: - env = _env2interp(space, w_env) - try: - os.execve(command, args, env) - except OSError, e: - raise wrap_oserror(space, e) + os.execve(command, args, env) + except OSError, e: + raise wrap_oserror(space, e) @unwrap_spec(mode=int, path='fsencode') def spawnv(space, mode, path, w_args): 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 @@ -415,7 +415,6 @@ def test_execv_no_args(self): os = self.posix raises(ValueError, os.execv, "notepad", []) - raises(ValueError, os.execve, "notepad", [], {}) def test_execv_raising2(self): os = self.posix _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit