bin/51519: newsyslog handles bzip2-compressed files incorrectly

Lukas Ertl l.ertl at univie.ac.at
Thu May 1 10:40:18 PDT 2003


The following reply was made to PR bin/51519; it has been noted by GNATS.

From: Lukas Ertl <l.ertl at univie.ac.at>
To: freebsd-gnats-submit at FreeBSD.org, peter at tesseract.demon.co.uk
Cc:  
Subject: Re: bin/51519: newsyslog handles bzip2-compressed files incorrectly
Date: Thu, 1 May 2003 19:36:28 +0200 (CEST)

 Hi Peter,
 
 could you try this patch? It is against rev. 1.67 of newsyslog.c.
 
 --- newsyslog.c.diff begins here ---
 Index: usr.sbin/newsyslog/newsyslog.c
 ===================================================================
 RCS file: /u/cvs/cvs/src/usr.sbin/newsyslog/newsyslog.c,v
 retrieving revision 1.67
 diff -u -r1.67 newsyslog.c
 --- usr.sbin/newsyslog/newsyslog.c	27 Apr 2003 23:37:31 -0000	1.67
 +++ usr.sbin/newsyslog/newsyslog.c	1 May 2003 17:30:25 -0000
 @@ -143,7 +143,7 @@
  static void compress_log(char *log, int dowait);
  static void bzcompress_log(char *log, int dowait);
  static int sizefile(char *file);
 -static int age_old_log(char *file);
 +static int age_old_log(char *file, int flags);
  static int send_signal(const struct conf_entry *ent);
  static time_t parse8601(char *s, char *errline);
  static void movefile(char *from, char *to, int perm, uid_t owner_uid,
 @@ -301,7 +301,7 @@
  			printf("%s <%d>: ", ent->log, ent->numlogs);
  	}
  	size = sizefile(ent->log);
 -	modtime = age_old_log(ent->log);
 +	modtime = age_old_log(ent->log, ent->flags);
  	ent->rotate = 0;
  	ent->firstcreate = 0;
  	if (size < 0) {
 @@ -1461,40 +1461,53 @@
  
  /* Return the age of old log file (file.0) */
  static int
 -age_old_log(char *file)
 +age_old_log(char *file, int flags)
  {
  	struct stat sb;
 -	char tmp[MAXPATHLEN + sizeof(".0") + sizeof(COMPRESS_POSTFIX) + 1];
 +	char *suffix, *tmp;
 +	int size;
 +
 +	if (flags & CE_COMPACT)
 +		suffix = COMPRESS_POSTFIX;
 +	else if (flags & CE_BZCOMPACT)
 +		suffix = BZCOMPRESS_POSTFIX;
 +	else
 +		suffix = "";
 +
 +	size = MAXPATHLEN + sizeof(".0") + sizeof(suffix) + 1;
 +
 +	if ((tmp = (char *) malloc(size)) == NULL)
 +		err(1, "malloc failed");
  
  	if (archtodir) {
  		char *p;
  
  		/* build name of archive directory into tmp */
  		if (*archdirname == '/') {	/* absolute */
 -			strlcpy(tmp, archdirname, sizeof(tmp));
 +			strlcpy(tmp, archdirname, size);
  		} else {	/* relative */
  			/* get directory part of logfile */
 -			strlcpy(tmp, file, sizeof(tmp));
 +			strlcpy(tmp, file, size);
  			if ((p = rindex(tmp, '/')) == NULL)
  				tmp[0] = '\0';
  			else
  				*(p + 1) = '\0';
 -			strlcat(tmp, archdirname, sizeof(tmp));
 +			strlcat(tmp, archdirname, size);
  		}
  
 -		strlcat(tmp, "/", sizeof(tmp));
 +		strlcat(tmp, "/", size);
  
  		/* get filename part of logfile */
  		if ((p = rindex(file, '/')) == NULL)
 -			strlcat(tmp, file, sizeof(tmp));
 +			strlcat(tmp, file, size);
  		else
 -			strlcat(tmp, p + 1, sizeof(tmp));
 +			strlcat(tmp, p + 1, size);
  	} else {
 -		(void) strlcpy(tmp, file, sizeof(tmp));
 +		(void) strlcpy(tmp, file, size);
  	}
  
  	if (stat(strcat(tmp, ".0"), &sb) < 0)
 -		if (stat(strcat(tmp, COMPRESS_POSTFIX), &sb) < 0)
 +		if (stat(strcat(tmp, suffix), &sb) < 0)
  			return (-1);
  	return ((int)(timenow - sb.st_mtime + 1800) / 3600);
  }
 --- newsyslog.c.diff ends here ---
 


More information about the freebsd-bugs mailing list