Without this patch, auditd coredumps on 32bit when compiled with -D_TIME_BITS=64:
Thread 1 "auditd" received signal SIGSEGV, Segmentation fault. 0xb7c7528f in strlen () from /lib/libc.so.6 (gdb) where #0 0xb7c7528f in strlen () from /lib/libc.so.6 #1 0xb7cbe3c9 in __vfprintf_internal () from /lib/libc.so.6 #2 0xb7cce3a5 in __vsnprintf_internal () from /lib/libc.so.6 #3 0xb7d72180 in __snprintf_chk () from /lib/libc.so.6 #4 0x0040b3b5 in send_audit_event () #5 0x004047ff in main () diff -up ./src/auditd-event.c.t64 ./src/auditd-event.c --- ./src/auditd-event.c.t64 2022-01-24 04:36:56.000000000 +0900 +++ ./src/auditd-event.c 2022-10-28 22:43:32.103854794 +0900 @@ -104,7 +104,7 @@ void write_logging_state(FILE *f) int rc; struct statfs buf; - fprintf(f, "current log size = %lu KB\n", log_size/1024); + fprintf(f, "current log size = %llu KB\n", (unsigned long long)log_size/1024); fprintf(f, "max log size = %lu KB\n", config->max_log_size * (MEGABYTE/1024)); fprintf(f,"logs detected last rotate/shift = %u\n", known_logs); @@ -112,8 +112,8 @@ void write_logging_state(FILE *f) fs_space_left ? "yes" : "no"); rc = fstatfs(log_fd, &buf); if (rc == 0) { - fprintf(f, "Logging partition free space %lu MB\n", - (buf.f_bavail * buf.f_bsize)/MEGABYTE); + fprintf(f, "Logging partition free space %llu MB\n", + (unsigned long long)(buf.f_bavail * buf.f_bsize)/MEGABYTE); fprintf(f, "space_left setting %lu MB\n", config->space_left); fprintf(f, "admin_space_left setting %lu MB\n", @@ -1632,7 +1632,7 @@ static void reconfigure(struct auditd_ev srand(time(NULL)); seq_num = rand()%10000; if (gettimeofday(&tv, NULL) == 0) { - snprintf(date, sizeof(date), "audit(%lu.%03u:%u)", tv.tv_sec, + snprintf(date, sizeof(date), "audit(%llu.%03u:%u)", (unsigned long long)tv.tv_sec, (unsigned)(tv.tv_usec/1000), seq_num); } else { snprintf(date, sizeof(date), diff -up ./src/auditd.c.t64 ./src/auditd.c --- ./src/auditd.c.t64 2022-01-24 04:36:56.000000000 +0900 +++ ./src/auditd.c 2022-10-28 22:38:40.817495792 +0900 @@ -312,12 +312,12 @@ int send_audit_event(int type, const cha // Write event into netlink area like normal events if (gettimeofday(&tv, NULL) == 0) { e->reply.len = snprintf((char *)e->reply.msg.data, - DMSG_SIZE, "audit(%lu.%03u:%u): %s", - tv.tv_sec, (unsigned)(tv.tv_usec/1000), seq_num, str); + DMSG_SIZE, "audit(%llu.%03u:%u): %s", + (long long)tv.tv_sec, (unsigned)(tv.tv_usec/1000), seq_num, str); } else { e->reply.len = snprintf((char *)e->reply.msg.data, - DMSG_SIZE, "audit(%lu.%03d:%u): %s", - (unsigned long)time(NULL), 0, seq_num, str); + DMSG_SIZE, "audit(%llu.%03d:%u): %s", + (long long)time(NULL), 0, seq_num, str); } // Point message at the netlink buffer like normal events e->reply.message = e->reply.msg.data; diff -up ./src/ausearch-checkpt.c.t64 ./src/ausearch-checkpt.c --- ./src/ausearch-checkpt.c.t64 2022-01-24 04:36:56.000000000 +0900 +++ ./src/ausearch-checkpt.c 2022-10-28 22:50:20.558201108 +0900 @@ -147,6 +147,7 @@ void save_ChkPt(const char *fn) static int parse_checkpt_event(char *lbuf, int ndix, event *e) { char *rest; + unsigned long long t; /* * Find the space after the node, then make it '\0' so @@ -173,13 +174,14 @@ static int parse_checkpt_event(char *lbu return 1; } } - if (sscanf(rest, "%lu.%03u:%lu 0x%X", &e->sec, &e->milli, + if (sscanf(rest, "%llu.%03u:%lu 0x%X", &t, &e->milli, &e->serial, &e->type) != 4) { fprintf(stderr, "Malformed output/event checkpoint line " "after node - [%s]\n", lbuf); checkpt_failure |= CP_STATUSBAD; return 1; } + e->sec = t; return 0; } diff -up ./src/ausearch.c.t64 ./src/ausearch.c --- ./src/ausearch.c.t64 2022-01-24 04:36:56.000000000 +0900 +++ ./src/ausearch.c 2022-10-28 22:48:03.676082763 +0900 @@ -472,10 +472,10 @@ static int process_log_fd(void) output_event(entries); } else if (do_output == 3) { fprintf(stderr, - "Corrupted checkpoint file. Inode match, but newer complete event (%lu.%03u:%lu) found before loaded checkpoint %lu.%03u:%lu\n", - entries->e.sec, entries->e.milli, + "Corrupted checkpoint file. Inode match, but newer complete event (%llu.%03u:%lu) found before loaded checkpoint %llu.%03u:%lu\n", + (unsigned long long)entries->e.sec, entries->e.milli, entries->e.serial, - chkpt_input_levent.sec, + (unsigned long long)chkpt_input_levent.sec, chkpt_input_levent.milli, chkpt_input_levent.serial); checkpt_failure |= CP_CORRUPTED; diff -up ./tools/auvirt/auvirt.c.t64 ./tools/auvirt/auvirt.c --- ./tools/auvirt/auvirt.c.t64 2022-01-24 04:36:56.000000000 +0900 +++ ./tools/auvirt/auvirt.c 2022-10-28 22:52:31.081335459 +0900 @@ -340,8 +340,8 @@ static int extract_virt_fields(auparse_s error: if (debug) { fprintf(stderr, "Failed to get field \"%s\" for record " - "%ld.%03u:%lu\n", field, - auparse_get_time(au), + "%lld.%03u:%lu\n", field, + (long long)auparse_get_time(au), auparse_get_milli(au), auparse_get_serial(au)); } -- Linux-audit mailing list Linux-audit@redhat.com https://listman.redhat.com/mailman/listinfo/linux-audit