Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37538547
en ru br
Репозитории ALT
S:3.20.1-alt2
5.1: 3.7.9-alt0.M51.1
4.1: 3.6.2-alt4
4.0: 3.6.2-alt4
3.0: 3.6.2-alt3
www.altlinux.org/Changes

Группа :: Работа с файлами
Пакет: logrotate

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: logrotate-3.6.2-alt-taboo.patch
Скачать


--- logrotate-3.6.2.orig/config.c	Tue Jan 29 23:20:02 2002
+++ logrotate-3.6.2/config.c	Sat Mar 23 21:34:20 2002
@@ -24,7 +24,7 @@
 #endif
 
 static char * defTabooExts[] = { ".rpmsave", ".rpmorig", "~", ",v",
-				 ".rpmnew", ".swp" };
+				 ".rpmnew", ".swp", ".gz", ".bz2", ".#" };
 static int defTabooCount = sizeof(defTabooExts) / sizeof(char *);
 
 /* I shouldn't use globals here :-( */
@@ -126,33 +126,97 @@ static char * readAddress(const char * c
 	return NULL;
 }
 
+/*
+ *	Returns false if given name ending with on of taboo suffixes.
+ */
+static int
+valid_name(const char *name)
+{
+    int i;
+    unsigned n_len;
+
+    if (strchr(name, '\'')) {
+	message(MESS_DEBUG, "Ignoring %s, because of \"'\" symbol\n", name);
+	return 0;
+    }
+
+    n_len = strlen(name);
+    for (i = 0; i < tabooCount; ++i) {
+	const char *t = tabooExts[i];
+	unsigned t_len;
+
+	if (!t)
+	    continue;
+
+	t_len = strlen(t);
+	if (n_len < t_len)
+	    continue;
+
+	if (!memcmp(name + n_len - t_len, t, t_len)) {
+	    message(MESS_DEBUG,
+		    "Ignoring %s, because of \"%s\" ending\n", name, t);
+	    return 0;
+	}
+
+	if (!strcmp(t, ".#")) {	/* .# suffix means .number */
+	    const char *p = strrchr(name, '.');
+
+	    if (p) {
+		char *endp;
+		long suffix;
+
+		errno = 0;
+		suffix = strtol(p + 1, &endp, 10);
+		if (!errno && !*endp && (suffix > 0)) {
+		    message(MESS_DEBUG,
+			    "Ignoring %s, because of \"%s\" ending\n",
+			    name, p);
+		    return 0;
+		}
+	    }
+	}
+    }
+
+    return 1;
+}
+
+/*
+ *	Returns false if given logfile name isn't allowed to rotate.
+ */
+static int
+valid_logname(const char *name)
+{
+    struct stat stb;
+
+    if (lstat(name, &stb) < 0) {
+	message(MESS_DEBUG, "Ignoring missing %s: %s\n",
+		name, strerror(errno));
+	return 0;
+    }
+    if (!S_ISREG(stb.st_mode)) {
+	message(MESS_DEBUG,
+		"Ignoring %s, because of wrong file type %#x\n",
+		name, stb.st_mode);
+	return 0;
+    }
+    return valid_name(name);
+}
+
 /** This function will be called as the 'select' method in the scandir(3)
     function-call. */
 static int
 checkFilelist(struct dirent const *ent)
 {
-    size_t	i;
-    assert(ent!=0);
+    /* Check entry for validity. */
+    if (!ent || !ent->d_name)
+        return 0;
 
     /* Check if ent->d_name is '.' or '..'; if so, return false */
     if (ent->d_name[0] == '.' &&
 	(!ent->d_name[1] || (ent->d_name[1] == '.' && !ent->d_name[2])))
         return 0;
 
-    /* Check if ent->d_name is ending in a taboo-extension; if so, return
-       false */
-    for (i = 0; i < tabooCount; i++) {
-        if (!strcmp(ent->d_name + strlen(ent->d_name) -
-		    strlen(tabooExts[i]), tabooExts[i])) {
-	    message(MESS_DEBUG, "Ignoring %s, because of %s "
-		    "ending\n", ent->d_name, tabooExts[i]);
-
-	    return 0;
-	}
-    }
-
-      /* All checks have been passed; return true */
-    return 1;
+    return valid_name (ent->d_name);
 }
 
 int readConfigPath(const char * path, logInfo * defConfig, 
@@ -267,9 +331,10 @@ static int readConfigFile(const char * c
 	close(fd);
 	return 1;
     }
+
     if (!S_ISREG(sb.st_mode)) {
-	message(MESS_DEBUG, "Ignoring %s because it's not a regular file.\n",
-		configFile);
+	message(MESS_DEBUG, "Ignoring %s, because of wrong file type %#x\n",
+		configFile, sb.st_mode);
 	close(fd);
 	return 0;
     }
@@ -788,8 +853,7 @@ static int readConfigFile(const char * c
 
 		for (i = 0; i < globResult.gl_pathc; i++) {
 		    /* if we glob directories we can get false matches */
-		    if (!lstat(globResult.gl_pathv[i], &sb) && 
-				    S_ISDIR(sb.st_mode)) 
+		    if ( !valid_logname( globResult.gl_pathv[i] ) ) 
 			continue;
 
 		    for (j = 0; j < *numLogsPtr - 1; j++) {
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin