httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Roy Fielding <field...@hyperreal.org>
Subject cvs commit: apachen/src/main http_log.c http_log.h http_main.c
Date Sun, 05 Oct 1997 07:47:50 GMT
fielding    97/10/05 00:47:48

  Modified:    src      CHANGES
               src/main http_log.c http_log.h http_main.c
  Log:
  Reduce what is written by aplog_error() by excluding filename if it
  is NULL, line number if it is "-", and errno if the new APLOG_NOERRNO bit
  is set in level parameter.  Do it all with a lot less string copying --
  use snprintf incrementally to build up the entire buffer.
  When server_conf is NULL use stderr, since that is necessary to do some
  things during startup and other odd cases (i.e. SEGV).
  Fixed a buffer overflow with syslog stuff using sprintf().
  
  Submitted by:	Ken Coar and Dean Gaudet
  Reviewed by:	Roy Fielding
  
  Revision  Changes    Path
  1.457     +3 -0      apachen/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/CHANGES,v
  retrieving revision 1.456
  retrieving revision 1.457
  diff -u -r1.456 -r1.457
  --- CHANGES	1997/10/05 02:22:22	1.456
  +++ CHANGES	1997/10/05 07:47:41	1.457
  @@ -168,6 +168,9 @@
        on a per-server basis using the LogLevel directive. Conversion
        of log_*() in progress. [Randy Terbush]
   
  +  *) Further enhance aplog_error() to not log filename, line number, and
  +     errno information when it isn't applicable. [Ken Coar, Dean Gaudet]
  +
     *) Canonicalise filenames under Win32. Short filenames are
        converted to long ones. Backslashes are converted to forward
        slashes. Case is converted to lower. Parts of URLs that do not
  
  
  
  1.36      +37 -29    apachen/src/main/http_log.c
  
  Index: http_log.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_log.c,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- http_log.c	1997/10/02 05:10:34	1.35
  +++ http_log.c	1997/10/05 07:47:45	1.36
  @@ -280,48 +280,56 @@
       va_list args;
       char errstr[MAX_STRING_LEN];
       static TRANS *pname = priorities;
  -    
  +    size_t len;
  +    int save_errno = errno;
  +    FILE *logf;
   
  -    if (level > s->loglevel)
  +    if (s && (level & APLOG_LEVELMASK) > s->loglevel)
   	return;
   
  -    switch (s->loglevel) {
  -    case APLOG_DEBUG:
  -	ap_snprintf(errstr, sizeof(errstr), "[%s] %d: %s: %s: %d: ",
  -		    pname[level].t_name, errno, strerror(errno), file, line);
  -	break;
  -    case APLOG_EMERG:
  -    case APLOG_CRIT:
  -    case APLOG_ALERT:
  -	ap_snprintf(errstr, sizeof(errstr), "[%s] %d: %s: ",
  -		    pname[level].t_name, errno, strerror(errno));
  -	break;
  -    case APLOG_INFO:
  -    case APLOG_ERR:
  -    case APLOG_WARNING:
  -    case APLOG_NOTICE:
  -	ap_snprintf(errstr, sizeof(errstr), "[%s] ", pname[level].t_name);
  -	break;
  +    if (!s) {
  +	logf = stderr;
  +    } else if (s && s->error_log) {
  +	logf = s->error_log;
  +    } else {
  +	logf = NULL;
  +    }
  +
  +    if (logf) {
  +	len = ap_snprintf(errstr, sizeof(errstr), "[%s] ", get_time());
  +    } else {
  +	len = 0;
  +    }
  +
  +    len += ap_snprintf(errstr + len, sizeof(errstr) - len,
  +	    "[%s] ", pname[level & APLOG_LEVELMASK].t_name);
  +
  +    if (!(level & APLOG_NOERRNO)) {
  +	len += ap_snprintf(errstr + len, sizeof(errstr) - len,
  +		"%d: %s: ", save_errno, strerror(save_errno));
       }
  -	
  +    if (file && (level & APLOG_LEVELMASK) == APLOG_DEBUG) {
  +	len += ap_snprintf(errstr + len, sizeof(errstr) - len,
  +		"%s: %d: ", file, line);
  +    }
  +
       va_start(args, fmt);
  +    len += ap_vsnprintf(errstr + len, sizeof(errstr) - len, fmt, args);
  +    va_end(args);
   
       /* NULL if we are logging to syslog */
  -    if (s->error_log) {
  -	fprintf(s->error_log, "[%s] %s", get_time(), errstr);
  -	vfprintf(s->error_log, fmt, args);
  -	fprintf(s->error_log, "\n");
  -	fflush(s->error_log);
  +    if (logf) {
  +	fputs(errstr, logf);
  +	fputc('\n', logf);
  +	fflush(logf);
       }
   #ifdef HAVE_SYSLOG
       else {
  -	vsprintf(errstr + strlen(errstr), fmt, args);
  -	syslog(level, "%s", errstr);
  +	syslog(level & APLOG_LEVELMASK, "%s", errstr);
       }
   #endif
  -    
  -    va_end(args);
   }
  +    
   
   void log_pid (pool *p, char *pid_fname)
   {
  
  
  
  1.14      +2 -0      apachen/src/main/http_log.h
  
  Index: http_log.h
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_log.h,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- http_log.h	1997/09/12 20:13:08	1.13
  +++ http_log.h	1997/10/05 07:47:45	1.14
  @@ -59,6 +59,8 @@
   #define	APLOG_INFO	6	/* informational */
   #define	APLOG_DEBUG	7	/* debug-level messages */
   #define DEFAULT_LOGLEVEL	APLOG_ERR
  +#define APLOG_LEVELMASK 15	/* mask off the level value */
  +#define APLOG_NOERRNO	16
   #define APLOG_MARK	__FILE__,__LINE__
   
   typedef struct _trans {
  
  
  
  1.231     +34 -38    apachen/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apachen/src/main/http_main.c,v
  retrieving revision 1.230
  retrieving revision 1.231
  diff -u -r1.230 -r1.231
  --- http_main.c	1997/10/05 02:06:37	1.230
  +++ http_main.c	1997/10/05 07:47:46	1.231
  @@ -719,7 +719,8 @@
       }
   
       if (!current_conn->keptalive)
  -	aplog_error(APLOG_MARK, APLOG_DEBUG, current_conn->server, errstr);
  +	aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG,
  +		    current_conn->server, errstr);
   
       if (timeout_req) {
   	/* Someone has asked for this transaction to just be aborted
  @@ -1336,7 +1337,6 @@
   
   static void setup_shared_mem(void)
   {
  -    char errstr[MAX_STRING_LEN];
       struct shmid_ds shmbuf;
   #ifdef MOVEBREAK
       char *obrk;
  @@ -1345,18 +1345,18 @@
       if ((shmid = shmget(shmkey, SCOREBOARD_SIZE, IPC_CREAT | SHM_R | SHM_W)) == -1) {
   #ifdef LINUX
   	if (errno == ENOSYS) {
  -	    fprintf(stderr,
  +	    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, server_conf,
   		    "httpd: Your kernel was built without CONFIG_SYSVIPC\n"
   		    "httpd: please consult the Apache FAQ for details\n");
   	}
   #endif
  -	perror("shmget");
  -	fprintf(stderr, "httpd: Could not call shmget\n");
  +	aplog_error(APLOG_MARK, APLOG_EMERG, server_conf,
  +		    "could not call shmget");
   	exit(1);
       }
   
  -    ap_snprintf(errstr, sizeof(errstr), "created shared memory segment #%d", shmid);
  -    aplog_error(APLOG_MARK, APLOG_INFO, server_conf, errstr);
  +    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf,
  +		"created shared memory segment #%d", shmid);
   
   #ifdef MOVEBREAK
       /*
  @@ -1369,30 +1369,29 @@
        * attach the segment and then move break back down. Ugly
        */
       if ((obrk = sbrk(MOVEBREAK)) == (char *) -1) {
  -	perror("sbrk");
  -	fprintf(stderr, "httpd: Could not move break\n");
  +	aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +	    "sbrk() could not move break");
       }
   #endif
   
   #define BADSHMAT	((scoreboard *)(-1))
       if ((scoreboard_image = (scoreboard *) shmat(shmid, 0, 0)) == BADSHMAT) {
  -	perror("shmat");
  -	fprintf(stderr, "httpd: Could not call shmat\n");
  +	aplog_error(APLOG_MARK, APLOG_EMERG, server_conf, "shmat error");
   	/*
   	 * We exit below, after we try to remove the segment
   	 */
       }
       else {			/* only worry about permissions if we attached the segment */
   	if (shmctl(shmid, IPC_STAT, &shmbuf) != 0) {
  -	    perror("shmctl");
  -	    fprintf(stderr, "httpd: Could not stat segment #%d\n", shmid);
  +	    aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		"shmctl() could not stat segment #%d", shmid);
   	}
   	else {
   	    shmbuf.shm_perm.uid = user_id;
   	    shmbuf.shm_perm.gid = group_id;
   	    if (shmctl(shmid, IPC_SET, &shmbuf) != 0) {
  -		perror("shmctl");
  -		fprintf(stderr, "httpd: Could not set segment #%d\n", shmid);
  +		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		    "shmctl() could not set segment #%d", shmid);
   	    }
   	}
       }
  @@ -1401,12 +1400,9 @@
        * (small) tables.
        */
       if (shmctl(shmid, IPC_RMID, NULL) != 0) {
  -	perror("shmctl");
  -	fprintf(stderr, "httpd: Could not delete segment #%d\n", shmid);
  -	ap_snprintf(errstr, sizeof(errstr),
  -		    "could not remove shared memory segment #%d", shmid);
   	aplog_error(APLOG_MARK, APLOG_WARNING, server_conf,
  -		    "shmctl: IPC_RMID: %s", errstr);
  +		"shmctl: IPC_RMID: could not remove shared memory segment #%d",
  +		shmid);
       }
       if (scoreboard_image == BADSHMAT)	/* now bailout */
   	exit(1);
  @@ -1415,8 +1411,8 @@
       if (obrk == (char *) -1)
   	return;			/* nothing else to do */
       if (sbrk(-(MOVEBREAK)) == (char *) -1) {
  -	perror("sbrk");
  -	fprintf(stderr, "httpd: Could not move break back\n");
  +	aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +	    "sbrk() could not move break back");
       }
   #endif
       scoreboard_image->global.exit_generation = 0;
  @@ -1757,21 +1753,21 @@
   	    switch (tries) {
   	    case 1:
   		/* perhaps it missed the SIGHUP, lets try again */
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   		    "child process %d did not exit, sending another SIGHUP",
   			    pid);
   		kill(pid, SIGHUP);
   		break;
   	    case 2:
   		/* ok, now it's being annoying */
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   		   "child process %d still did not exit, sending a SIGTERM",
   			    pid);
   		kill(pid, SIGTERM);
   		break;
   	    case 3:
   		/* die child scum */
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   		   "child process %d still did not exit, sending a SIGKILL",
   			    pid);
   		kill(pid, SIGKILL);
  @@ -1782,7 +1778,7 @@
   		 * exited, we will likely fail to bind to the port
   		 * after the restart.
   		 */
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   			    "could not make child process %d exit, "
   			    "attempting to continue anyway", pid);
   		break;
  @@ -1952,7 +1948,7 @@
       ap_snprintf(emsg, sizeof(emsg),
   		"httpd: caught %s, attempting to dump core in %s",
   		s, coredump_dir);
  -    aplog_error(APLOG_MARK, APLOG_INFO, server_conf, emsg);
  +    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf, emsg);
       chdir(coredump_dir);
       abort();
       exit(1);
  @@ -2325,7 +2321,7 @@
       }
       p += ap_snprintf(p, sizeof(buf) - (p - buf), " %ux%u",
   		     total, count[VHASH_TABLE_SIZE - 1]);
  -    aplog_error(APLOG_MARK, APLOG_DEBUG, server_conf, buf);
  +    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, server_conf, buf);
   }
   #endif
   
  @@ -2930,7 +2926,7 @@
   #ifdef LINUX
   		    if (errno == EFAULT) {
   			aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  -				    "select: (listen) fatal, exiting");
  +				    "select: (listen) fatal, child exiting");
   			child_exit_modules(pconf, server_conf);
   			destroy_pool(pconf);
   			exit(1);
  @@ -3309,7 +3305,7 @@
   	    static int reported = 0;
   
   	    if (!reported) {
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   			    "server reached MaxClients setting, consider"
   			    " raising the MaxClients setting");
   		reported = 1;
  @@ -3318,7 +3314,7 @@
   	}
   	else {
   	    if (idle_spawn_rate >= 4) {
  -		aplog_error(APLOG_MARK, APLOG_ERR, server_conf,
  +		aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
   		    "server seems busy, spawning %d children (you may need "
   			"to increase StartServers, or Min/MaxSpareServers)",
   			    idle_spawn_rate);
  @@ -3423,11 +3419,11 @@
   	    hold_off_on_exponential_spawning = 10;
   	}
   
  -	aplog_error(APLOG_MARK, APLOG_INFO, server_conf,
  +	aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf,
   		    "Apache HTTP Server version: %s", SERVER_VERSION);
  -	aplog_error(APLOG_MARK, APLOG_INFO, server_conf,
  +	aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf,
   		    "Server built: %s", SERVER_BUILT);
  -	aplog_error(APLOG_MARK, APLOG_INFO, server_conf,
  +	aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, server_conf,
   		    "Server configured -- resuming normal operations");
   	restart_pending = shutdown_pending = 0;
   
  @@ -3467,7 +3463,7 @@
   		     * scoreboard.  Somehow we don't know about this
   		     * child.
   		     */
  -		    aplog_error(APLOG_MARK, APLOG_WARNING, server_conf,
  +		    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, server_conf,
   				"long lost child came home! (pid %d)", pid);
   		}
   		/* Don't perform idle maintenance when a child dies,
  @@ -3502,7 +3498,7 @@
   		aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg SIGTERM");
   	    }
   	    reclaim_child_processes(2);		/* Start with SIGTERM */
  -	    aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf,
  +	    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
   			"httpd: caught SIGTERM, shutting down");
   
   	    /* Clear the pool - including any registered cleanups */
  @@ -3532,7 +3528,7 @@
   	    scoreboard_image->global.exit_generation = generation;
   	    update_scoreboard_global();
   
  -	    aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf,
  +	    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
   			"SIGUSR1 received.  Doing graceful restart");
   
   	    /* kill off the idle ones */
  @@ -3559,7 +3555,7 @@
   		aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg SIGHUP");
   	    }
   	    reclaim_child_processes(1);		/* Not when just starting up */
  -	    aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf,
  +	    aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
   			"SIGHUP received.  Attempting to restart");
   	}
   	++generation;
  
  
  

Mime
View raw message