You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Chuck Murcko <ch...@hyperreal.com> on 1996/06/07 22:54:19 UTC
cvs commit: apache/src mod_include.c
chuck 96/06/07 13:54:18
Modified: src mod_include.c
Log:
Reviewed by: The Group
Submitted by: Howard Fear <ho...@pageplus.com>
I've finally tracked down the persistant core dumps we were experiencing
on Linux. Attached is a patch for 1.0.5. I'll do one for 1.1 later
tonight.
The problem is in mod_include.c. The macro that reads the file
fcloses a pfopen'ed file. This results in closing the file twice,
once during the fclose and again during the resource cleanup.
This apparently sends the linux libc.5.3.x fclose into a SIGSEGV,
its not smart enough to realize that the fd has already been closed.
This happens for every page served through mod_include. This can be
a serious problem for sites that set up the include handler for
.html files.
Revision Changes Path
1.8 +16 -15 apache/src/mod_include.c
Index: mod_include.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_include.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C3 -r1.7 -r1.8
*** mod_include.c 1996/05/29 03:08:15 1.7
--- mod_include.c 1996/06/07 20:54:17 1.8
***************
*** 78,84 ****
static void decodehtml(char *s);
static char *get_tag(pool *p, FILE *in, char *tag, int tag_len, int dodecode);
! static int get_directive(FILE *in, char *d);
/* ------------------------ Environment function -------------------------- */
--- 78,84 ----
static void decodehtml(char *s);
static char *get_tag(pool *p, FILE *in, char *tag, int tag_len, int dodecode);
! static int get_directive(FILE *in, char *d, pool *p);
/* ------------------------ Environment function -------------------------- */
***************
*** 114,124 ****
}
}
! #define GET_CHAR(f,c,r) \
{ \
int i = getc(f); \
if(feof(f) || ferror(f) || (i == -1)) { \
! fclose(f); \
return r; \
} \
c = (char)i; \
--- 114,124 ----
}
}
! #define GET_CHAR(f,c,r,p) \
{ \
int i = getc(f); \
if(feof(f) || ferror(f) || (i == -1)) { \
! pfclose(p, f); \
return r; \
} \
c = (char)i; \
***************
*** 136,142 ****
p=0;
while(1) {
! GET_CHAR(in,c,1);
if(c == str[p]) {
if((++p) == l)
return 0;
--- 136,142 ----
p=0;
while(1) {
! GET_CHAR(in,c,1,r->pool);
if(c == str[p]) {
if((++p) == l)
return 0;
***************
*** 253,267 ****
n = 0;
do { /* skip whitespace */
! GET_CHAR(in,c,NULL);
} while (isspace(c));
/* tags can't start with - */
if(c == '-') {
! GET_CHAR(in,c,NULL);
if(c == '-') {
do {
! GET_CHAR(in,c,NULL);
} while (isspace(c));
if(c == '>') {
strcpy(tag,"done");
--- 253,267 ----
n = 0;
do { /* skip whitespace */
! GET_CHAR(in,c,NULL,p);
} while (isspace(c));
/* tags can't start with - */
if(c == '-') {
! GET_CHAR(in,c,NULL,p);
if(c == '-') {
do {
! GET_CHAR(in,c,NULL,p);
} while (isspace(c));
if(c == '>') {
strcpy(tag,"done");
***************
*** 279,295 ****
}
if(c == '=' || isspace(c)) break;
*(t++) = tolower(c);
! GET_CHAR(in,c,NULL);
}
*t++ = '\0';
tag_val = t;
! while (isspace(c)) GET_CHAR(in, c, NULL); /* space before = */
if (c != '=') return NULL;
do {
! GET_CHAR(in,c,NULL); /* space after = */
} while (isspace(c));
/* we should allow a 'name' as a value */
--- 279,295 ----
}
if(c == '=' || isspace(c)) break;
*(t++) = tolower(c);
! GET_CHAR(in,c,NULL,p);
}
*t++ = '\0';
tag_val = t;
! while (isspace(c)) GET_CHAR(in, c, NULL,p); /* space before = */
if (c != '=') return NULL;
do {
! GET_CHAR(in,c,NULL,p); /* space after = */
} while (isspace(c));
/* we should allow a 'name' as a value */
***************
*** 297,303 ****
if (c != '"' && c != '\'') return NULL;
term = c;
while(1) {
! GET_CHAR(in,c,NULL);
if(++n == tagbuf_len) {
t[tagbuf_len - 1] = '\0';
return NULL;
--- 297,303 ----
if (c != '"' && c != '\'') return NULL;
term = c;
while(1) {
! GET_CHAR(in,c,NULL,p);
if(++n == tagbuf_len) {
t[tagbuf_len - 1] = '\0';
return NULL;
***************
*** 310,329 ****
return pstrdup (p, tag_val);
}
static int
! get_directive(FILE *in, char *d) {
char c;
/* skip initial whitespace */
while(1) {
! GET_CHAR(in,c,1);
if(!isspace(c))
break;
}
/* now get directive */
while(1) {
*d++ = tolower(c);
! GET_CHAR(in,c,1);
if(isspace(c))
break;
}
--- 310,330 ----
return pstrdup (p, tag_val);
}
+ /* the pool is required to allow GET_CHAR to call pfclose */
static int
! get_directive(FILE *in, char *d, pool *p) {
char c;
/* skip initial whitespace */
while(1) {
! GET_CHAR(in,c,1,p);
if(!isspace(c))
break;
}
/* now get directive */
while(1) {
*d++ = tolower(c);
! GET_CHAR(in,c,1,p);
if(isspace(c))
break;
}
***************
*** 723,729 ****
while(1) {
if(!find_string(f,STARTING_SEQUENCE,r)) {
! if(get_directive(f,directive))
return;
if(!strcmp(directive,"exec")) {
if(noexec) {
--- 724,730 ----
while(1) {
if(!find_string(f,STARTING_SEQUENCE,r)) {
! if(get_directive(f,directive,r->pool))
return;
if(!strcmp(directive,"exec")) {
if(noexec) {