137bde0
From ebf9b232b012725d2be5e750876c7336cf1c37fd Mon Sep 17 00:00:00 2001
137bde0
From: David Kalnischkies <david@kalnischkies.de>
137bde0
Date: Wed, 24 Aug 2022 13:21:01 +0200
137bde0
Subject: [PATCH] useradd: Do not reset non-existent data in {last,fail}log
137bde0
137bde0
useradd does not create the files if they don't exist, but if they exist
137bde0
it will reset user data even if the data did not exist before creating
137bde0
a hole and an explicitly zero'd data point resulting (especially for
137bde0
high UIDs) in a lot of zeros ending up in containers and tarballs.
137bde0
---
137bde0
 src/useradd.c | 6 ++++--
137bde0
 1 file changed, 4 insertions(+), 2 deletions(-)
137bde0
137bde0
diff --git a/src/useradd.c b/src/useradd.c
137bde0
index 6eaeb533..39a744ee 100644
137bde0
--- a/src/useradd.c
137bde0
+++ b/src/useradd.c
137bde0
@@ -1996,8 +1996,9 @@ static void faillog_reset (uid_t uid)
137bde0
 	struct faillog fl;
137bde0
 	int fd;
137bde0
 	off_t offset_uid = (off_t) (sizeof fl) * uid;
137bde0
+	struct stat st;
137bde0
 
137bde0
-	if (access (FAILLOG_FILE, F_OK) != 0) {
137bde0
+	if (stat (FAILLOG_FILE, &st) != 0 || st.st_size <= offset_uid) {
137bde0
 		return;
137bde0
 	}
137bde0
 
137bde0
@@ -2033,8 +2034,9 @@ static void lastlog_reset (uid_t uid)
137bde0
 	int fd;
137bde0
 	off_t offset_uid = (off_t) (sizeof ll) * uid;
137bde0
 	uid_t max_uid;
137bde0
+	struct stat st;
137bde0
 
137bde0
-	if (access (LASTLOG_FILE, F_OK) != 0) {
137bde0
+	if (stat (LASTLOG_FILE, &st) != 0 || st.st_size <= offset_uid) {
137bde0
 		return;
137bde0
 	}
137bde0
 
137bde0
-- 
137bde0
2.37.3
137bde0