You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2003/02/27 13:33:08 UTC
cvs commit: httpd-2.0/modules/generators mod_cgi.c mod_cgid.c
trawick 2003/02/27 04:33:08
Modified: . Tag: APACHE_2_0_BRANCH CHANGES STATUS
modules/filters Tag: APACHE_2_0_BRANCH mod_ext_filter.c
modules/generators Tag: APACHE_2_0_BRANCH mod_cgi.c
mod_cgid.c
Log:
merge this fix into stable branch:
*) mod_cgi, mod_cgid, mod_ext_filter: Log errors when scripts cannot
be started on Unix because of such problems as bad permissions,
bad shebang line, etc. [Jeff Trawick]
Reviewed by: nd, stoddard
Revision Changes Path
No revision
No revision
1.988.2.50 +4 -0 httpd-2.0/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.988.2.49
retrieving revision 1.988.2.50
diff -u -r1.988.2.49 -r1.988.2.50
--- CHANGES 27 Feb 2003 11:57:31 -0000 1.988.2.49
+++ CHANGES 27 Feb 2003 12:33:06 -0000 1.988.2.50
@@ -1,5 +1,9 @@
Changes with Apache 2.0.45
+ *) mod_cgi, mod_cgid, mod_ext_filter: Log errors when scripts cannot
+ be started on Unix because of such problems as bad permissions,
+ bad shebang line, etc. [Jeff Trawick]
+
*) Fix 64-bit problem in mod_ssl input logic.
[Madhusudan Mathihalli <ma...@hp.com>]
1.751.2.129 +1 -17 httpd-2.0/STATUS
Index: STATUS
===================================================================
RCS file: /home/cvs/httpd-2.0/STATUS,v
retrieving revision 1.751.2.128
retrieving revision 1.751.2.129
diff -u -r1.751.2.128 -r1.751.2.129
--- STATUS 27 Feb 2003 12:09:42 -0000 1.751.2.128
+++ STATUS 27 Feb 2003 12:33:06 -0000 1.751.2.129
@@ -109,22 +109,6 @@
[ This one is under review. Don't merge. ]
+1:
- * Better report problems with external scripts
- modules/filters/mod_ext_filter.c: r1.4
- modules/generators/mod_cgi.c: r1.151
- modules/generators/mod_cgid.c: r1.148
- +1: trawick, nd, stoddard
- nd: there's always the same function (foo_child_errfn), shouldn't it
- appear only once in util_script.c?
- trawick: The implementations are already different for mod_cgi
- vs. mod_cgid, and I fear that a fix to mod_cgid to
- use the right vhost-specific error log is going to
- make them even more different in the future.
- Meanwhile, there isn't enough commonality (LOC, not
- percentage) to spread the pieces over multiple files.
- nd: argh. Really overlooked the slightly differences...
- sounds right, however.
-
* Standardize mod_ldap and mod_auth_ldap SSL support across the various
LDAP SDKs. Isolate the SSL functionality to mod_ldap rather than
speading it across mod_auth_ldap and mod_ldap. Add LDAPTrustedCA
No revision
No revision
1.1.2.3 +23 -0 httpd-2.0/modules/filters/mod_ext_filter.c
Index: mod_ext_filter.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/filters/mod_ext_filter.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- mod_ext_filter.c 3 Feb 2003 17:31:38 -0000 1.1.2.2
+++ mod_ext_filter.c 27 Feb 2003 12:33:07 -0000 1.1.2.3
@@ -119,8 +119,11 @@
static apr_status_t ef_output_filter(ap_filter_t *, apr_bucket_brigade *);
#define DBGLVL_SHOWOPTIONS 1
+#define DBGLVL_ERRORCHECK 2
#define DBGLVL_GORY 9
+#define ERRFN_USERDATA_KEY "EXTFILTCHILDERRFN"
+
static void *create_ef_dir_conf(apr_pool_t *p, char *dummy)
{
ef_dir_t *dc = (ef_dir_t *)apr_pcalloc(p, sizeof(ef_dir_t));
@@ -420,6 +423,17 @@
return apr_file_close(vfile);
}
+static void child_errfn(apr_pool_t *p, apr_status_t err, const char *desc)
+{
+ request_rec *r;
+ void *vr;
+
+ apr_pool_userdata_get(&vr, ERRFN_USERDATA_KEY, p);
+ r = vr;
+
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, err, r, "%s", desc);
+}
+
/* init_ext_filter_process: get the external filter process going
* This is per-filter-instance (i.e., per-request) initialization.
*/
@@ -451,6 +465,15 @@
ap_assert(rc == APR_SUCCESS);
}
+ rc = apr_procattr_child_errfn_set(ctx->procattr, child_errfn);
+ ap_assert(rc == APR_SUCCESS);
+ apr_pool_userdata_set(f->r, ERRFN_USERDATA_KEY, apr_pool_cleanup_null, ctx->p);
+
+ if (dc->debug >= DBGLVL_ERRORCHECK) {
+ rc = apr_procattr_error_check_set(ctx->procattr, 1);
+ ap_assert(rc == APR_SUCCESS);
+ }
+
/* add standard CGI variables as well as DOCUMENT_URI, DOCUMENT_PATH_INFO,
* and QUERY_STRING_UNESCAPED
*/
No revision
No revision
1.148.2.3 +18 -1 httpd-2.0/modules/generators/mod_cgi.c
Index: mod_cgi.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgi.c,v
retrieving revision 1.148.2.2
retrieving revision 1.148.2.3
diff -u -r1.148.2.2 -r1.148.2.3
--- mod_cgi.c 3 Feb 2003 17:31:39 -0000 1.148.2.2
+++ mod_cgi.c 27 Feb 2003 12:33:07 -0000 1.148.2.3
@@ -122,6 +122,8 @@
#define DEFAULT_LOGBYTES 10385760
#define DEFAULT_BUFBYTES 1024
+#define ERRFN_USERDATA_KEY "CGICHILDERRFN"
+
typedef struct {
const char *logname;
long logbytes;
@@ -380,6 +382,18 @@
}
}
+static void cgi_child_errfn(apr_pool_t *pool, apr_status_t err,
+ const char *description)
+{
+ request_rec *r;
+ void *vr;
+
+ apr_pool_userdata_get(&vr, ERRFN_USERDATA_KEY, pool);
+ r = vr;
+
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, err, r, "%s", description);
+}
+
static apr_status_t run_cgi_child(apr_file_t **script_out,
apr_file_t **script_in,
apr_file_t **script_err,
@@ -452,12 +466,15 @@
e_info->cmd_type)) != APR_SUCCESS) ||
((rc = apr_procattr_detach_set(procattr,
- e_info->detached)) != APR_SUCCESS)) {
+ e_info->detached)) != APR_SUCCESS) ||
+ ((rc = apr_procattr_child_errfn_set(procattr, cgi_child_errfn)) != APR_SUCCESS)) {
/* Something bad happened, tell the world. */
ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r,
"couldn't set child process attributes: %s", r->filename);
}
else {
+ apr_pool_userdata_set(r, ERRFN_USERDATA_KEY, apr_pool_cleanup_null, p);
+
procnew = apr_pcalloc(p, sizeof(*procnew));
if (e_info->prog_type == RUN_AS_SSI) {
SPLIT_AND_PASS_PRETAG_BUCKETS(*(e_info->bb), e_info->ctx,
1.145.2.3 +25 -1 httpd-2.0/modules/generators/mod_cgid.c
Index: mod_cgid.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/generators/mod_cgid.c,v
retrieving revision 1.145.2.2
retrieving revision 1.145.2.3
diff -u -r1.145.2.2 -r1.145.2.3
--- mod_cgid.c 3 Feb 2003 17:31:39 -0000 1.145.2.2
+++ mod_cgid.c 27 Feb 2003 12:33:08 -0000 1.145.2.3
@@ -155,6 +155,8 @@
#define SSI_REQ 2
#define GETPID_REQ 3 /* get the pid of script created for prior request */
+#define ERRFN_USERDATA_KEY "CGIDCHILDERRFN"
+
/* DEFAULT_CGID_LISTENBACKLOG controls the max depth on the unix socket's
* pending connection queue. If a bunch of cgi requests arrive at about
* the same time, connections from httpd threads/processes will back up
@@ -202,6 +204,7 @@
apr_size_t uri_len;
apr_size_t args_len;
apr_size_t mod_userdir_user_len;
+ int loglevel; /* to stuff in server_rec */
} cgid_req_t;
/* This routine is called to create the argument list to be passed
@@ -349,6 +352,7 @@
if (stat != APR_SUCCESS) {
return stat;
}
+ r->server->loglevel = req->loglevel;
if (req->req_type == GETPID_REQ) {
/* no more data sent for this request */
return APR_SUCCESS;
@@ -480,6 +484,7 @@
if (user != NULL) {
req.mod_userdir_user_len = strlen(user);
}
+ req.loglevel = r->server->loglevel;
/* Write the request header */
if ((stat = sock_write(fd, &req, sizeof(req))) != APR_SUCCESS) {
@@ -565,6 +570,22 @@
}
}
+static void cgid_child_errfn(apr_pool_t *pool, apr_status_t err,
+ const char *description)
+{
+ request_rec *r;
+ void *vr;
+
+ apr_pool_userdata_get(&vr, ERRFN_USERDATA_KEY, pool);
+ r = vr;
+
+ /* sure we got r, but don't call ap_log_rerror() because we don't
+ * have r->headers_in and possibly other storage referenced by
+ * ap_log_rerror()
+ */
+ ap_log_error(APLOG_MARK, APLOG_ERR, err, r->server, "%s", description);
+}
+
static int cgid_server(void *data)
{
struct sockaddr_un unix_addr;
@@ -711,12 +732,15 @@
((rc = apr_procattr_child_out_set(procattr, inout, NULL)) != APR_SUCCESS) ||
((rc = apr_procattr_dir_set(procattr,
ap_make_dirstr_parent(r->pool, r->filename))) != APR_SUCCESS) ||
- ((rc = apr_procattr_cmdtype_set(procattr, cmd_type)) != APR_SUCCESS)) {
+ ((rc = apr_procattr_cmdtype_set(procattr, cmd_type)) != APR_SUCCESS) ||
+ ((rc = apr_procattr_child_errfn_set(procattr, cgid_child_errfn)) != APR_SUCCESS)) {
/* Something bad happened, tell the world. */
ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r,
"couldn't set child process attributes: %s", r->filename);
}
else {
+ apr_pool_userdata_set(r, ERRFN_USERDATA_KEY, apr_pool_cleanup_null, ptrans);
+
argv = (const char * const *)create_argv(r->pool, NULL, NULL, NULL, argv0, r->args);
/* We want to close sd2 for the new CGI process too.