[LTP] [PATCH] syscalls/acct02: Improve logging

Petr Vorel pvorel@suse.cz
Fri Sep 13 22:53:28 CEST 2019


+ unify verification function.

Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
Hi,

added some debugging info.
Problem with s390 is caused by big endianess:
ac_version != 3 (131)

I suspect a bug in UNPACK(), but don't know how to fix it.

Failures on x86_64:
* various recent kernels 5.2.9 / 5.3, 4.20 on Debian, using v3:
acct02.c:222: INFO: Verifying using 'struct acct_v3'
acct02.c:174: INFO: == loop 1 ==
acct02.c:81: INFO: ac_comm != 'acct02_helper' ('acct02')
acct02.c:174: INFO: == loop 2 ==
acct02.c:81: INFO: ac_comm != 'acct02_helper' ('acct02')
acct02.c:132: INFO: ac_exitcode != 65280 (0)
acct02.c:140: INFO: ac_ppid != 18029 (18028)
acct02.c:174: INFO: == loop 3 ==
acct02.c:81: INFO: ac_comm != 'acct02_helper' ('acct02')
acct02.c:132: INFO: ac_exitcode != 65280 (0)
acct02.c:140: INFO: ac_ppid != 18029 (18028)
acct02.c:187: INFO: Number of accounting file entries tested: 2
acct02.c:191: FAIL: acct() wrote incorrect file contents!

* 3.10 on CentOS using v3:
acct02.c:82: INFO: ac_comm != 'acct02_helper' ('')
acct02.c:88: INFO: ac_btime < 1568406976 (0)
acct02.c:133: INFO: ac_exitcode != 32768 (0)
acct02.c:141: INFO: ac_ppid != 19863 (0)
acct02.c:147: INFO: ac_version != 3 (0)
acct02.c:152: INFO: ac_pid < 1 (0)
acct02.c:188: INFO: Number of accounting file entries tested: 0
=> this looks to be completely wrong.

Other distros using various kernels (both old and recent) using struct
acct_v3 works well, so the bug might be some specific kernel
configuration.

I also tested recent (4.20.0-rc2) kernel with struct acct, working well.

Kind regards,
Petr

 testcases/kernel/syscalls/acct/acct02.c | 136 ++++++++++++++++--------
 1 file changed, 92 insertions(+), 44 deletions(-)

diff --git a/testcases/kernel/syscalls/acct/acct02.c b/testcases/kernel/syscalls/acct/acct02.c
index c2c20668e..e9b669868 100644
--- a/testcases/kernel/syscalls/acct/acct02.c
+++ b/testcases/kernel/syscalls/acct/acct02.c
@@ -34,6 +34,8 @@
 #define OUTPUT_FILE	"acct_file"
 
 #define UNPACK(x) ((x & 0x1fff) << (((x >> 13) & 0x7) * 3))
+#define ACCT_MEMBER(x) (v3 ? ((struct acct_v3 *)acc)->x : ((struct acct *)acc)->x)
+#define ACCT_MEMBER_V3(x) (((struct acct_v3 *)acc)->x)
 
 static int fd;
 static int v3;
@@ -68,50 +70,95 @@ static void run_command(void)
 	rc = tst_run_cmd(cmd, NULL, NULL, 1) << 8;
 }
 
-static int verify_acct(struct acct *acc)
+static int verify_acct(void *acc, int elap_time)
 {
-	int sys_time  = UNPACK(acc->ac_stime);
-	int user_time = UNPACK(acc->ac_utime);
-	int elap_time = UNPACK(acc->ac_etime);
-
-	if (strcmp(acc->ac_comm, COMMAND) ||
-		acc->ac_btime < start_time ||
-		acc->ac_btime - start_time > 1 ||
-		acc->ac_uid != getuid() ||
-		acc->ac_gid != getgid() ||
-		user_time/clock_ticks > 1 ||
-		sys_time/clock_ticks  > 1 ||
-		elap_time/clock_ticks >= 2 ||
-		acc->ac_exitcode != rc)
-		return 0;
-	return 1;
-}
+	int sys_time  = UNPACK(ACCT_MEMBER(ac_stime));
+	int user_time = UNPACK(ACCT_MEMBER(ac_stime));
+	int ret = 0, tmp;
+	float tmp2;
+
+	if (strcmp(ACCT_MEMBER(ac_comm), COMMAND)) {
+		tst_res(TINFO, "ac_comm != '%s' ('%s')", COMMAND,
+			ACCT_MEMBER(ac_comm));
+		ret = 1;
+	}
 
-static int verify_acct_v3(struct acct_v3 *acc)
-{
-	int sys_time  = UNPACK(acc->ac_stime);
-	int user_time = UNPACK(acc->ac_utime);
-	int elap_time = acc->ac_etime;
-
-	if (strcmp(acc->ac_comm, COMMAND) ||
-		acc->ac_btime < start_time ||
-		acc->ac_btime - start_time > 1 ||
-		acc->ac_uid != getuid() ||
-		acc->ac_gid != getgid() ||
-		acc->ac_ppid != (uint32_t)getpid() ||
-		user_time/clock_ticks > 1 ||
-		sys_time/clock_ticks  > 1 ||
-		elap_time/clock_ticks >= 2 ||
-		acc->ac_exitcode != rc ||
-		acc->ac_version != 3 ||
-		acc->ac_pid < 1)
-		return 0;
-	return 1;
+	if (ACCT_MEMBER(ac_btime) < start_time) {
+		tst_res(TINFO, "ac_btime < %d (%d)", start_time,
+			ACCT_MEMBER(ac_btime));
+		ret = 1;
+	}
+
+	tmp = ACCT_MEMBER(ac_btime) - start_time;
+	if (tmp > 1) {
+		tst_res(TINFO, "ac_btime - %d > 1 (%d)", start_time, tmp);
+		ret = 1;
+	}
+
+	if (ACCT_MEMBER(ac_uid) != getuid()) {
+		tst_res(TINFO, "ac_uid != %d (%d)", getuid(),
+			ACCT_MEMBER(ac_uid));
+		ret = 1;
+	}
+
+	if (ACCT_MEMBER(ac_gid) != getgid()) {
+		tst_res(TINFO, "ac_gid != %d (%d)", getgid(),
+			ACCT_MEMBER(ac_gid));
+		ret = 1;
+	}
+
+	tmp2 = user_time/clock_ticks;
+	if (tmp2 > 1) {
+		tst_res(TINFO, "user_time/clock_ticks > 1 (%d/%d: %.2f)",
+			user_time, clock_ticks, tmp2);
+		ret = 1;
+	}
+
+	tmp2 = sys_time/clock_ticks;
+	if (tmp2 > 1) {
+		tst_res(TINFO, "sys_time/clock_ticks > 1 (%d/%d: %.2f)",
+			sys_time, clock_ticks, tmp2);
+		ret = 1;
+	}
+
+	tmp2 = elap_time/clock_ticks;
+	if (tmp2 >= 2) {
+		tst_res(TINFO, "elap_time/clock_ticks >= 2 (%d/%d: %.2f)",
+			elap_time, clock_ticks, tmp2);
+		ret = 1;
+	}
+
+	if (ACCT_MEMBER(ac_exitcode) != rc) {
+		tst_res(TINFO, "ac_exitcode != %d (%d)", rc,
+			ACCT_MEMBER(ac_exitcode));
+		ret = 1;
+	}
+	if (!v3)
+		return ret;
+
+	if (ACCT_MEMBER_V3(ac_ppid) != (uint32_t)getpid()) {
+		tst_res(TINFO, "ac_ppid != %d (%d)", (uint32_t)getpid(),
+			ACCT_MEMBER_V3(ac_ppid));
+		ret = 1;
+	}
+
+	if (ACCT_MEMBER_V3(ac_version) != 3) {
+		tst_res(TINFO, "ac_version != 3 (%d)",
+			ACCT_MEMBER_V3(ac_version));
+		ret = 1;
+	}
+
+	if (ACCT_MEMBER_V3(ac_pid) < 1) {
+		tst_res(TINFO, "ac_pid < 1 (%d)", ACCT_MEMBER_V3(ac_pid));
+		ret = 1;
+	}
+	return ret;
 }
 
 static void run(void)
 {
-	int read_bytes, ret, entry_count;
+	int read_bytes, ret;
+	int entry_count = 0, i = 0;
 
 	fd = SAFE_OPEN(OUTPUT_FILE, O_RDWR | O_CREAT, 0644);
 
@@ -123,26 +170,27 @@ static void run(void)
 	run_command();
 	acct(NULL);
 
-	entry_count = 0;
 	do {
+		tst_res(TINFO, "== loop %d ==", ++i);
+
 		read_bytes = SAFE_READ(0, fd, &acct_struct, acct_size);
 
 		if (v3)
-			ret = verify_acct_v3(&acct_struct.v3);
+			ret = verify_acct(&acct_struct.v3, acct_struct.v3.ac_etime);
 		else
-			ret = verify_acct(&acct_struct.v0);
+			ret = verify_acct(&acct_struct.v0, UNPACK(acct_struct.v0.ac_etime));
 
 		if (read_bytes)
 			entry_count++;
-	} while (read_bytes == acct_size && !ret);
+	} while (read_bytes == acct_size && ret);
 
 	tst_res(TINFO, "Number of accounting file entries tested: %d",
 			entry_count);
 
 	if (ret)
-		tst_res(TPASS, "acct() wrote correct file contents!");
-	else
 		tst_res(TFAIL, "acct() wrote incorrect file contents!");
+	else
+		tst_res(TPASS, "acct() wrote correct file contents!");
 
 	SAFE_CLOSE(fd);
 }
-- 
2.22.1



More information about the ltp mailing list