~ubuntu-branches/ubuntu/natty/python3.2/natty-security

« back to all changes in this revision

Viewing changes to Modules/_posixsubprocess.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2010-12-06 12:19:09 UTC
  • mfrom: (1.1.3 upstream) (7.1.2 experimental)
  • Revision ID: james.westby@ubuntu.com-20101206121909-c40vnqniur1fq5lx
Tags: 3.2~b1-1
* Python 3.2 beta1 release.
* Configure with --enable-loadable-sqlite-extensions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
                       int errread, int errwrite,
43
43
                       int errpipe_read, int errpipe_write,
44
44
                       int close_fds, int restore_signals,
45
 
                       int call_setsid,
 
45
                       int call_setsid, Py_ssize_t num_fds_to_keep,
 
46
                       PyObject *py_fds_to_keep,
46
47
                       PyObject *preexec_fn,
47
48
                       PyObject *preexec_fn_args_tuple)
48
49
{
91
92
    /* close() is intentionally not checked for errors here as we are closing */
92
93
    /* a large range of fds, some of which may be invalid. */
93
94
    if (close_fds) {
94
 
        for (fd_num = 3; fd_num < errpipe_write; ++fd_num) {
95
 
            close(fd_num);
 
95
        Py_ssize_t keep_seq_idx;
 
96
        int start_fd = 3;
 
97
        for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
 
98
            PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep,
 
99
                                                            keep_seq_idx);
 
100
            int keep_fd = PyLong_AsLong(py_keep_fd);
 
101
            if (keep_fd < 0) {  /* Negative number, overflow or not a Long. */
 
102
                err_msg = "bad value in fds_to_keep.";
 
103
                errno = 0;  /* We don't want to report an OSError. */
 
104
                goto error;
 
105
            }
 
106
            if (keep_fd <= start_fd)
 
107
                continue;
 
108
            for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
 
109
                close(fd_num);
 
110
            }
 
111
            start_fd = keep_fd + 1;
96
112
        }
97
 
        for (fd_num = errpipe_write+1; fd_num < max_fd; ++fd_num) {
98
 
            close(fd_num);
 
113
        if (start_fd <= max_fd) {
 
114
            for (fd_num = start_fd; fd_num < max_fd; ++fd_num) {
 
115
                close(fd_num);
 
116
            }
99
117
        }
100
118
    }
101
119
 
170
188
subprocess_fork_exec(PyObject* self, PyObject *args)
171
189
{
172
190
    PyObject *gc_module = NULL;
173
 
    PyObject *executable_list, *py_close_fds;
 
191
    PyObject *executable_list, *py_close_fds, *py_fds_to_keep;
174
192
    PyObject *env_list, *preexec_fn;
175
193
    PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
176
194
    PyObject *preexec_fn_args_tuple = NULL;
182
200
    pid_t pid;
183
201
    int need_to_reenable_gc = 0;
184
202
    char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
185
 
    Py_ssize_t arg_num;
 
203
    Py_ssize_t arg_num, num_fds_to_keep;
186
204
 
187
205
    if (!PyArg_ParseTuple(
188
 
            args, "OOOOOiiiiiiiiiiO:fork_exec",
189
 
            &process_args, &executable_list, &py_close_fds,
 
206
            args, "OOOOOOiiiiiiiiiiO:fork_exec",
 
207
            &process_args, &executable_list, &py_close_fds, &py_fds_to_keep,
190
208
            &cwd_obj, &env_list,
191
209
            &p2cread, &p2cwrite, &c2pread, &c2pwrite,
192
210
            &errread, &errwrite, &errpipe_read, &errpipe_write,
198
216
        PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
199
217
        return NULL;
200
218
    }
 
219
    num_fds_to_keep = PySequence_Length(py_fds_to_keep);
 
220
    if (num_fds_to_keep < 0) {
 
221
        PyErr_SetString(PyExc_ValueError, "bad fds_to_keep");
 
222
        return NULL;
 
223
    }
201
224
 
202
225
    /* We need to call gc.disable() when we'll be calling preexec_fn */
203
226
    if (preexec_fn != Py_None) {
298
321
                   p2cread, p2cwrite, c2pread, c2pwrite,
299
322
                   errread, errwrite, errpipe_read, errpipe_write,
300
323
                   close_fds, restore_signals, call_setsid,
 
324
                   num_fds_to_keep, py_fds_to_keep,
301
325
                   preexec_fn, preexec_fn_args_tuple);
302
326
        _exit(255);
303
327
        return NULL;  /* Dead code to avoid a potential compiler warning. */