diff options
author | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-05-16 15:10:05 +0000 |
---|---|---|
committer | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-05-16 15:10:05 +0000 |
commit | d04758c48f32436304062e35b571ae9e6cc2dce0 (patch) | |
tree | 0d457b51edab3ea2701a5f19f42aa3f32439bfaf | |
parent | 7a51587c703cfc1f2d27970b5c3e4af29e924d98 (diff) | |
download | libapr-d04758c48f32436304062e35b571ae9e6cc2dce0.tar.gz |
Merge r170395 from trunk:
* threadproc/unix/proc.c (apr_procattr_child_in_set,
apr_procattr_child_out_set, apr_procattr_child_err_set): Add error
checking: fixes segfaults in applications when pipe() or dup2() fail
(e.g. due to ulimit settings).
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/0.9.x@170398 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | threadproc/unix/proc.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/threadproc/unix/proc.c b/threadproc/unix/proc.c index 324cee053..c88e97ddf 100644 --- a/threadproc/unix/proc.c +++ b/threadproc/unix/proc.c @@ -109,16 +109,18 @@ APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, apr_file_t *child_in, apr_file_t *parent_in) { - if (attr->child_in == NULL && attr->parent_in == NULL) - apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + apr_status_t rv = APR_SUCCESS; - if (child_in != NULL) - apr_file_dup2(attr->child_in, child_in, attr->pool); + if (attr->child_in == NULL && attr->parent_in == NULL) + rv = apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + + if (child_in != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_in, child_in, attr->pool); - if (parent_in != NULL) - apr_file_dup2(attr->parent_in, parent_in, attr->pool); + if (parent_in != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_in, parent_in, attr->pool); - return APR_SUCCESS; + return rv; } @@ -126,16 +128,18 @@ APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, apr_file_t *child_out, apr_file_t *parent_out) { + apr_status_t rv = APR_SUCCESS; + if (attr->child_out == NULL && attr->parent_out == NULL) - apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); + rv = apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); - if (child_out != NULL) - apr_file_dup2(attr->child_out, child_out, attr->pool); + if (child_out != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_out, child_out, attr->pool); - if (parent_out != NULL) - apr_file_dup2(attr->parent_out, parent_out, attr->pool); + if (parent_out != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_out, parent_out, attr->pool); - return APR_SUCCESS; + return rv; } @@ -143,16 +147,18 @@ APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, apr_file_t *child_err, apr_file_t *parent_err) { + apr_status_t rv = APR_SUCCESS; + if (attr->child_err == NULL && attr->parent_err == NULL) - apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); + rv = apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); - if (child_err != NULL) - apr_file_dup2(attr->child_err, child_err, attr->pool); + if (child_err != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_err, child_err, attr->pool); - if (parent_err != NULL) - apr_file_dup2(attr->parent_err, parent_err, attr->pool); + if (parent_err != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_err, parent_err, attr->pool); - return APR_SUCCESS; + return rv; } |