Skip to content

Commit 3db43ac

Browse files
author
Nick Kew
committed
mod_cgid: backport fix for segfault on (older) Solaris.
r729579, r731963, r731965 PR 39332 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@732067 13f79535-47bb-0310-9956-ffa450edef68
1 parent 02e7d02 commit 3db43ac

3 files changed

Lines changed: 46 additions & 24 deletions

File tree

CHANGES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
-*- coding: utf-8 -*-
22
Changes with Apache 2.2.12
33

4+
*) mod_cgid: fix segfault problem on solaris.
5+
PR 39332 [Masaoki Kobayashi <masaoki techfirm.co.jp>, Jeff Trawick]
6+
47
*) mod_ldap: Avoid a segfault when result->rc is checked in uldap_connection_init
58
when result is NULL. This could happen if LDAP initialization failed.
69
PR 45994. [Dan Poirier <poirier pobox.com>]

STATUS

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,6 @@ PATCHES PROPOSED TO BACKPORT FROM TRUNK:
110110
http://svn.apache.org/viewvc?view=rev&revision=730274
111111
+1: niq, rpluem
112112

113-
* mod_cgid: fix for segfault problem on solaris
114-
PR 39332
115-
http://svn.apache.org/viewvc?view=rev&revision=729579
116-
+1: niq, rpluem
117-
+1 with r731963 + r731965: trawick
118-
(http://svn.apache.org/viewvc?view=rev&revision=731963,
119-
http://svn.apache.org/viewvc?view=rev&revision=731965)
120-
121113
* util_script (CGI): return 504 (Gateway timeout) rather than 500
122114
when a script times out before returning status line/headers.
123115
PR 42190

modules/generators/mod_cgid.c

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,33 @@ static apr_status_t sock_write(int fd, const void *buf, size_t buf_size)
344344
return APR_SUCCESS;
345345
}
346346

347+
static apr_status_t sock_writev(int fd, request_rec *r, int count, ...)
348+
{
349+
va_list ap;
350+
int rc;
351+
struct iovec *vec;
352+
int i;
353+
int total_bytes = 0;
354+
355+
vec = (struct iovec *)apr_palloc(r->pool, count * sizeof(struct iovec));
356+
va_start(ap, count);
357+
for(i = 0; i < count; i++) {
358+
vec[i].iov_base = va_arg(ap, caddr_t);
359+
vec[i].iov_len = va_arg(ap, apr_size_t);
360+
total_bytes += vec[i].iov_len;
361+
}
362+
va_end(ap);
363+
364+
do {
365+
rc = writev(fd, vec, count);
366+
} while (rc < 0 && errno == EINTR);
367+
if (rc < 0) {
368+
return errno;
369+
}
370+
371+
return APR_SUCCESS;
372+
}
373+
347374
static apr_status_t get_req(int fd, request_rec *r, char **argv0, char ***env,
348375
cgid_req_t *req)
349376
{
@@ -472,31 +499,31 @@ static apr_status_t send_req(int fd, request_rec *r, char *argv0, char **env,
472499
req.loglevel = r->server->loglevel;
473500

474501
/* Write the request header */
475-
if ((stat = sock_write(fd, &req, sizeof(req))) != APR_SUCCESS) {
476-
return stat;
502+
if (req.args_len) {
503+
stat = sock_writev(fd, r, 5,
504+
&req, sizeof(req),
505+
r->filename, req.filename_len,
506+
argv0, req.argv0_len,
507+
r->uri, req.uri_len,
508+
r->args, req.args_len);
509+
} else {
510+
stat = sock_writev(fd, r, 4,
511+
&req, sizeof(req),
512+
r->filename, req.filename_len,
513+
argv0, req.argv0_len,
514+
r->uri, req.uri_len);
477515
}
478516

479-
/* Write filename, argv0, uri, and args */
480-
if ((stat = sock_write(fd, r->filename, req.filename_len)) != APR_SUCCESS ||
481-
(stat = sock_write(fd, argv0, req.argv0_len)) != APR_SUCCESS ||
482-
(stat = sock_write(fd, r->uri, req.uri_len)) != APR_SUCCESS) {
517+
if (stat != APR_SUCCESS) {
483518
return stat;
484519
}
485-
if (req.args_len) {
486-
if ((stat = sock_write(fd, r->args, req.args_len)) != APR_SUCCESS) {
487-
return stat;
488-
}
489-
}
490520

491521
/* write the environment variables */
492522
for (i = 0; i < req.env_count; i++) {
493523
apr_size_t curlen = strlen(env[i]);
494524

495-
if ((stat = sock_write(fd, &curlen, sizeof(curlen))) != APR_SUCCESS) {
496-
return stat;
497-
}
498-
499-
if ((stat = sock_write(fd, env[i], curlen)) != APR_SUCCESS) {
525+
if ((stat = sock_writev(fd, r, 2, &curlen, sizeof(curlen),
526+
env[i], curlen)) != APR_SUCCESS) {
500527
return stat;
501528
}
502529
}

0 commit comments

Comments
 (0)