Blob Blame History Raw
diff -up logrotate-3.7.6/logrotate.c.selinux logrotate-3.7.6/logrotate.c
--- logrotate-3.7.6/logrotate.c.selinux	2007-08-07 09:14:35.000000000 +0200
+++ logrotate-3.7.6/logrotate.c	2008-01-21 09:32:56.000000000 +0100
@@ -409,15 +409,17 @@ static int copyTruncate(char *currLog, c
 	}
 #ifdef WITH_SELINUX
 	if (selinux_enabled) {
-	    security_context_t oldContext;
+	    security_context_t oldContext = NULL;
 	    if (fgetfilecon_raw(fdcurr, &oldContext) >= 0) {
 		if (getfscreatecon_raw(&prev_context) < 0) {
 		    message(MESS_ERROR,
 			    "getting default context: %s\n",
 			    strerror(errno));
 		    if (selinux_enforce) {
-			freecon(oldContext);
-			return 1;
+				if (oldContext != NULL) {
+					freecon(oldContext);
+				}
+				return 1;
 		    }
 		}
 		if (setfscreatecon_raw(oldContext) < 0) {
@@ -425,11 +427,15 @@ static int copyTruncate(char *currLog, c
 			    "setting file context %s to %s: %s\n",
 			    saveLog, oldContext, strerror(errno));
 		    if (selinux_enforce) {
-			freecon(oldContext);
-			return 1;
+				if (oldContext != NULL) {
+					freecon(oldContext);
+				}
+				return 1;
 		    }
 		}
-		freecon(oldContext);
+		if (oldContext != NULL) {
+			freecon(oldContext);
+		}
 	    } else {
 		    if (errno != ENOTSUP) {
 			    message(MESS_ERROR, "getting file context %s: %s\n",
@@ -899,6 +905,9 @@ int rotateSingleLog(logInfo * log, int l
     int hasErrors = 0;
     struct stat sb;
     int fd;
+#ifdef WITH_SELINUX
+	security_context_t savedContext = NULL;
+#endif
 
     if (!state->doRotate)
 	return 0;
@@ -906,7 +915,57 @@ int rotateSingleLog(logInfo * log, int l
     if (!hasErrors) {
 
 	if (!(log->flags & (LOG_FLAG_COPYTRUNCATE | LOG_FLAG_COPY))) {
-	    message(MESS_DEBUG, "renaming %s to %s\n", log->files[logNum],
+#ifdef WITH_SELINUX
+		if (selinux_enabled) {
+			security_context_t oldContext = NULL;
+			int fdcurr = -1;
+
+			if ((fdcurr = open(log->files[logNum], O_RDWR)) < 0) {
+				message(MESS_ERROR, "error opening %s: %s\n",
+						log->files[logNum],
+					strerror(errno));
+				return 1;
+			}
+			if (fgetfilecon_raw(fdcurr, &oldContext) >= 0) {
+				if (getfscreatecon_raw(&savedContext) < 0) {
+					message(MESS_ERROR,
+						"getting default context: %s\n",
+						strerror(errno));
+					if (selinux_enforce) {
+						if (oldContext != NULL) {
+							freecon(oldContext);
+						}
+						return 1;
+					}
+				}
+				if (setfscreatecon_raw(oldContext) < 0) {
+					message(MESS_ERROR,
+						"setting file context %s to %s: %s\n",
+						log->files[logNum], oldContext, strerror(errno));
+					if (selinux_enforce) {
+						if (oldContext != NULL) {
+							freecon(oldContext);
+						}
+						return 1;
+					}
+				}
+				message(MESS_DEBUG, "fscreate context set to %s\n",
+						oldContext);
+				if (oldContext != NULL) {
+					freecon(oldContext);
+				}
+			} else {
+				if (errno != ENOTSUP) {
+					message(MESS_ERROR, "getting file context %s: %s\n",
+						log->files[logNum], strerror(errno));
+					if (selinux_enforce) {
+						return 1;
+					}
+				}
+			}
+		}
+#endif
+		message(MESS_DEBUG, "renaming %s to %s\n", log->files[logNum],
 		    rotNames->finalName);
 
 	    if (!debug && !hasErrors &&
@@ -961,6 +1020,15 @@ int rotateSingleLog(logInfo * log, int l
                     close(fd);
 	    }
 	}
+#ifdef WITH_SELINUX
+	if (selinux_enabled) {
+	    setfscreatecon_raw(savedContext);
+	    if (savedContext != NULL) {
+			freecon(savedContext);
+			savedContext = NULL;
+	    }
+	}
+#endif
 
 	if (!hasErrors
 	    && log->flags & (LOG_FLAG_COPYTRUNCATE | LOG_FLAG_COPY))