Subject: bin/27315: acct file should be aligned
To: None <gnats-bugs@gnats.NetBSD.org>
From: None <dlagno@smtp.ru>
List: netbsd-bugs
Date: 10/22/2004 01:01:58
>Number: 27315
>Category: bin
>Synopsis: acct file should be explicitly aligned
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: bin-bug-people
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Fri Oct 22 08:47:02 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator: Denis Lagno
>Release: NetBSD 2.99.10
>Organization:
Brigada
>Environment:
System: NetBSD flam.gado 2.99.10 NetBSD 2.99.10 (FLAM) #0: Wed Oct 20 06:40:24 MSD 2004 dina@flam.gado:/volatile/worksrc/netbsd-current/src/sys/arch/i386/compile/FLAM i386
Architecture: i386
Machine: i386
>Description:
Recently I discovered that starting 5 days back, surviving several reboots,
lastcomm reports some insane records:
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 - root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
? -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -SCD root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0? - root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
? -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -SCD root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
.0 -FC root ?? 390.02 secs Thu Jan 1 03:05 (0:00:00.00)
==600000+ lines snipped==
ck -F root ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
ck+ -F 46137344 ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
ck? -F 12582912 ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
ck? -F 12582912 ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
ck -F 25165824 ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
? -F 16777216 ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
? -SCD root ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
? -SFC root ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root ?? 368.00 secs Thu Jan 1 03:00 (0:00:00.00)
? -SFCD root ?? 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
? - root console 0.00 secs Thu Jan 1 03:00 (0:00:00.00)
ksh -F dina ttytb 0.00 secs Sat Oct 16 09:17 (0:00:00.00)
date - dina ttytb 0.00 secs Sat Oct 16 09:17 (0:00:00.02)
sed - dina ttytb 0.00 secs Sat Oct 16 09:17 (0:00:00.02)
tty - dina ttytb 0.00 secs Sat Oct 16 09:17 (0:00:00.02)
hostname - dina ttytb 0.00 secs Sat Oct 16 09:17 (0:00:00.00)
investigation discovered that size of acct file was 27281992 -- not multiple
of 40 == sizeof( struct acct ) on my machine.
Apparently during some crash and subsequent fsck accounting file was truncated
to sector boundary.
So it is desirable to align accounting file on startup.
>How-To-Repeat:
>Fix:
fix probably should go to etc/rc.d/accounting but it is pain to
discover sizeof(struct acct) in shell script.
fixing acct(2) is arguably too low level.
So I fixed accton(8):
--- usr.sbin/accton/accton.c.1.9 2003-08-07 15:25:11.000000000 +0400
+++ usr.sbin/accton/accton.c 2004-10-21 00:37:55.000000000 +0400
@@ -44,6 +44,8 @@
#endif /* not lint */
#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/acct.h>
#include <err.h>
#include <errno.h>
#include <unistd.h>
@@ -76,6 +78,20 @@
err(1, "acct");
break;
case 1:
+ /* first trying to align accounting file */
+ if (!acct(NULL)) {
+ struct stat sb;
+ int n;
+ FILE *fs;
+ if (!stat(*argv, &sb))
+ if ((n = sb.st_size % sizeof(struct acct)))
+ if ((fs = fopen(*argv, "ab"))) {
+ for (n = sizeof(struct acct) - n; n--; )
+ fputc(0, fs);
+ fclose(fs);
+ }
+ }
+ /* then calling low-level func */
if (acct(*argv))
err(1, "acct `%s'", *argv);
break;
>Release-Note:
>Audit-Trail:
>Unformatted: