dgaudet 99/05/01 10:02:30
Modified: src CHANGES src/main http_main.c src/modules/proxy proxy_ftp.c proxy_http.c proxy_util.c Log: *) Fix intermittent SEGV in ap_proxy_cache_error() in src/modules/proxy_util.c where a NULL filepointer and temporary filename were closed and unlinked. *) Fix inconsistant error messages reported by mod_proxy PR: 3178 Submitted by: Graham Leggett <[EMAIL PROTECTED]> Revision Changes Path 1.1337 +8 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1336 retrieving revision 1.1337 diff -u -r1.1336 -r1.1337 --- CHANGES 1999/05/01 13:42:07 1.1336 +++ CHANGES 1999/05/01 17:02:24 1.1337 @@ -1,5 +1,13 @@ Changes with Apache 1.3.7 + *) Fix intermittent SEGV in ap_proxy_cache_error() in + src/modules/proxy_util.c where a NULL filepointer and + temporary filename were closed and unlinked. + [Graham Leggett <[EMAIL PROTECTED]>] PR#3178 + + *) Fix inconsistant error messages reported by mod_proxy. + [Graham Leggett <[EMAIL PROTECTED]>] + *) OS/2: Fix terminating CGIs that aren't compiled by EMX GCC when a connection is aborted. [Brian Havard] 1.433 +2 -1 apache-1.3/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v retrieving revision 1.432 retrieving revision 1.433 diff -u -r1.432 -r1.433 --- http_main.c 1999/04/27 20:36:31 1.432 +++ http_main.c 1999/05/01 17:02:26 1.433 @@ -3678,6 +3678,7 @@ #endif #endif signal(SIGALRM, alrm_handler); + signal(SIGUSR2, alrm_handler); #ifdef TPF signal(SIGHUP, just_die); signal(SIGTERM, just_die); @@ -4241,7 +4242,7 @@ else if (ps->last_rtime + ss->timeout_len < now) { /* no progress, and the timeout length has been exceeded */ ss->timeout_len = 0; - kill(ps->pid, SIGALRM); + kill(ps->pid, SIGUSR2); } } #endif 1.75 +18 -5 apache-1.3/src/modules/proxy/proxy_ftp.c Index: proxy_ftp.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- proxy_ftp.c 1999/04/09 13:06:28 1.74 +++ proxy_ftp.c 1999/05/01 17:02:28 1.75 @@ -323,8 +323,11 @@ while (!con->aborted) { n = ap_bgets(buf, sizeof buf, f); if (n == -1) { /* input error */ - if (c != NULL) + if (c != NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error reading from %s", c->url); c = ap_proxy_cache_error(c); + } break; } if (n == 0) @@ -383,8 +386,11 @@ o = 0; total_bytes_sent += n; - if (c != NULL && c->fp && ap_bwrite(c->fp, buf, n) != n) + if (c != NULL && c->fp && ap_bwrite(c->fp, buf, n) != n) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing to %s", c->tempfile); c = ap_proxy_cache_error(c); + } while (n && !r->connection->aborted) { w = ap_bwrite(con->client, &buf[o], n); @@ -1196,8 +1202,11 @@ if (!r->assbackwards) ap_rvputs(r, "HTTP/1.0 ", r->status_line, CRLF, NULL); if (c != NULL && c->fp != NULL - && ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1) - c = ap_proxy_cache_error(c); + && ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing CRLF to %s", c->tempfile); + c = ap_proxy_cache_error(c); + } /* send headers */ tdo.req = r; @@ -1206,8 +1215,11 @@ if (!r->assbackwards) ap_rputs(CRLF, r); - if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1) + if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing CRLF to %s", c->tempfile); c = ap_proxy_cache_error(c); + } ap_bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; @@ -1226,6 +1238,7 @@ /* XXX: we checked for 125||150||226||250 above. This is redundant. */ if (rc != 226 && rc != 250) + /* XXX: we no longer log an "error writing to c->tempfile" - should we? */ c = ap_proxy_cache_error(c); } else { 1.64 +21 -7 apache-1.3/src/modules/proxy/proxy_http.c Index: proxy_http.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -r1.63 -r1.64 --- proxy_http.c 1999/03/08 15:44:03 1.63 +++ proxy_http.c 1999/05/01 17:02:29 1.64 @@ -364,14 +364,19 @@ ap_hard_timeout("proxy receive", r); len = ap_bgets(buffer, sizeof buffer - 1, f); - if (len == -1 || len == 0) { + if (len == -1) { ap_bclose(f); ap_kill_timeout(r); ap_log_rerror(APLOG_MARK, APLOG_ERR, r, - "ap_bgets() - proxy receive - Error reading from remote server %s", - proxyhost ? proxyhost : desthost); + "ap_bgets() - proxy receive - Error reading from remote server %s (length %d)", + proxyhost ? proxyhost : desthost, len); return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); + } else if (len == 0) { + ap_bclose(f); + ap_kill_timeout(r); + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Document contains no data"); } /* Is it an HTTP/1 response? This is buggy if we ever see an HTTP/1.10 */ @@ -480,8 +485,11 @@ if (!r->assbackwards) ap_rvputs(r, "HTTP/1.0 ", r->status_line, CRLF, NULL); if (c != NULL && c->fp != NULL && - ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1) - c = ap_proxy_cache_error(c); + ap_bvputs(c->fp, "HTTP/1.0 ", r->status_line, CRLF, NULL) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing status line to %s", c->tempfile); + c = ap_proxy_cache_error(c); + } /* send headers */ tdo.req = r; @@ -490,16 +498,22 @@ if (!r->assbackwards) ap_rputs(CRLF, r); - if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1) + if (c != NULL && c->fp != NULL && ap_bputs(CRLF, c->fp) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing CRLF to %s", c->tempfile); c = ap_proxy_cache_error(c); + } ap_bsetopt(r->connection->client, BO_BYTECT, &zero); r->sent_bodyct = 1; /* Is it an HTTP/0.9 respose? If so, send the extra data */ if (backasswards) { ap_bwrite(r->connection->client, buffer, len); - if (c != NULL && c->fp != NULL && ap_bwrite(c->fp, buffer, len) != len) + if (c != NULL && c->fp != NULL && ap_bwrite(c->fp, buffer, len) != len) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing extra data to %s", c->tempfile); c = ap_proxy_cache_error(c); + } } ap_kill_timeout(r); 1.79 +18 -8 apache-1.3/src/modules/proxy/proxy_util.c Index: proxy_util.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/proxy/proxy_util.c,v retrieving revision 1.78 retrieving revision 1.79 diff -u -r1.78 -r1.79 --- proxy_util.c 1999/03/10 17:42:46 1.78 +++ proxy_util.c 1999/05/01 17:02:29 1.79 @@ -553,8 +553,11 @@ ap_reset_timeout(r); if (n == -1) { /* input error */ - if (c != NULL) + if (c != NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error reading from %s", c->url); c = ap_proxy_cache_error(c); + } break; } if (n == 0) @@ -566,7 +569,9 @@ /*@@@ XXX FIXME: Assuming that writing the cache file won't time out?!!? */ if (c != NULL && c->fp != NULL) { if (ap_bwrite(c->fp, &buf[0], n) != n) { - c = ap_proxy_cache_error(c); + ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, + "proxy: error writing to %s", c->tempfile); + c = ap_proxy_cache_error(c); } else { c->written += n; } @@ -824,11 +829,13 @@ cache_req *ap_proxy_cache_error(cache_req *c) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, c->req, - "proxy: error writing to cache file %s", c->tempfile); - ap_pclosef(c->req->pool, c->fp->fd); - c->fp = NULL; - unlink(c->tempfile); + if (c != NULL) { + if (c->fp != NULL) { + ap_pclosef(c->req->pool, c->fp->fd); + c->fp = NULL; + } + if (c->tempfile) unlink(c->tempfile); + } return NULL; } @@ -1262,8 +1269,11 @@ if (!parm->req->assbackwards) ap_rvputs(parm->req, key, ": ", value, CRLF, NULL); if (parm->cache != NULL && parm->cache->fp != NULL && - ap_bvputs(parm->cache->fp, key, ": ", value, CRLF, NULL) == -1) + ap_bvputs(parm->cache->fp, key, ": ", value, CRLF, NULL) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, parm->cache->req, + "proxy: error writing header to %s", parm->cache->tempfile); parm->cache = ap_proxy_cache_error(parm->cache); + } return 1; /* tell ap_table_do() to continue calling us for more headers */ }