You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ni...@apache.org on 2009/01/06 20:20:58 UTC
svn commit: r732067 - in /httpd/httpd/branches/2.2.x: CHANGES STATUS
modules/generators/mod_cgid.c
Author: niq
Date: Tue Jan 6 11:20:58 2009
New Revision: 732067
URL: http://svn.apache.org/viewvc?rev=732067&view=rev
Log:
mod_cgid: backport fix for segfault on (older) Solaris.
r729579, r731963, r731965
PR 39332
Modified:
httpd/httpd/branches/2.2.x/CHANGES
httpd/httpd/branches/2.2.x/STATUS
httpd/httpd/branches/2.2.x/modules/generators/mod_cgid.c
Modified: httpd/httpd/branches/2.2.x/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/CHANGES?rev=732067&r1=732066&r2=732067&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/CHANGES [utf-8] (original)
+++ httpd/httpd/branches/2.2.x/CHANGES [utf-8] Tue Jan 6 11:20:58 2009
@@ -1,6 +1,9 @@
-*- coding: utf-8 -*-
Changes with Apache 2.2.12
+ *) mod_cgid: fix segfault problem on solaris.
+ PR 39332 [Masaoki Kobayashi <masaoki techfirm.co.jp>, Jeff Trawick]
+
*) mod_ldap: Avoid a segfault when result->rc is checked in uldap_connection_init
when result is NULL. This could happen if LDAP initialization failed.
PR 45994. [Dan Poirier <poirier pobox.com>]
Modified: httpd/httpd/branches/2.2.x/STATUS
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/STATUS?rev=732067&r1=732066&r2=732067&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/STATUS (original)
+++ httpd/httpd/branches/2.2.x/STATUS Tue Jan 6 11:20:58 2009
@@ -110,14 +110,6 @@
http://svn.apache.org/viewvc?view=rev&revision=730274
+1: niq, rpluem
- * mod_cgid: fix for segfault problem on solaris
- PR 39332
- http://svn.apache.org/viewvc?view=rev&revision=729579
- +1: niq, rpluem
- +1 with r731963 + r731965: trawick
- (http://svn.apache.org/viewvc?view=rev&revision=731963,
- http://svn.apache.org/viewvc?view=rev&revision=731965)
-
* util_script (CGI): return 504 (Gateway timeout) rather than 500
when a script times out before returning status line/headers.
PR 42190
Modified: httpd/httpd/branches/2.2.x/modules/generators/mod_cgid.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/generators/mod_cgid.c?rev=732067&r1=732066&r2=732067&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/generators/mod_cgid.c (original)
+++ httpd/httpd/branches/2.2.x/modules/generators/mod_cgid.c Tue Jan 6 11:20:58 2009
@@ -344,6 +344,33 @@
return APR_SUCCESS;
}
+static apr_status_t sock_writev(int fd, request_rec *r, int count, ...)
+{
+ va_list ap;
+ int rc;
+ struct iovec *vec;
+ int i;
+ int total_bytes = 0;
+
+ vec = (struct iovec *)apr_palloc(r->pool, count * sizeof(struct iovec));
+ va_start(ap, count);
+ for(i = 0; i < count; i++) {
+ vec[i].iov_base = va_arg(ap, caddr_t);
+ vec[i].iov_len = va_arg(ap, apr_size_t);
+ total_bytes += vec[i].iov_len;
+ }
+ va_end(ap);
+
+ do {
+ rc = writev(fd, vec, count);
+ } while (rc < 0 && errno == EINTR);
+ if (rc < 0) {
+ return errno;
+ }
+
+ return APR_SUCCESS;
+}
+
static apr_status_t get_req(int fd, request_rec *r, char **argv0, char ***env,
cgid_req_t *req)
{
@@ -472,31 +499,31 @@
req.loglevel = r->server->loglevel;
/* Write the request header */
- if ((stat = sock_write(fd, &req, sizeof(req))) != APR_SUCCESS) {
- return stat;
+ if (req.args_len) {
+ stat = sock_writev(fd, r, 5,
+ &req, sizeof(req),
+ r->filename, req.filename_len,
+ argv0, req.argv0_len,
+ r->uri, req.uri_len,
+ r->args, req.args_len);
+ } else {
+ stat = sock_writev(fd, r, 4,
+ &req, sizeof(req),
+ r->filename, req.filename_len,
+ argv0, req.argv0_len,
+ r->uri, req.uri_len);
}
- /* Write filename, argv0, uri, and args */
- if ((stat = sock_write(fd, r->filename, req.filename_len)) != APR_SUCCESS ||
- (stat = sock_write(fd, argv0, req.argv0_len)) != APR_SUCCESS ||
- (stat = sock_write(fd, r->uri, req.uri_len)) != APR_SUCCESS) {
+ if (stat != APR_SUCCESS) {
return stat;
}
- if (req.args_len) {
- if ((stat = sock_write(fd, r->args, req.args_len)) != APR_SUCCESS) {
- return stat;
- }
- }
/* write the environment variables */
for (i = 0; i < req.env_count; i++) {
apr_size_t curlen = strlen(env[i]);
- if ((stat = sock_write(fd, &curlen, sizeof(curlen))) != APR_SUCCESS) {
- return stat;
- }
-
- if ((stat = sock_write(fd, env[i], curlen)) != APR_SUCCESS) {
+ if ((stat = sock_writev(fd, r, 2, &curlen, sizeof(curlen),
+ env[i], curlen)) != APR_SUCCESS) {
return stat;
}
}