On Mon, Dec 18, 2023 at 06:38:47PM +0100, Alexander Bluhm wrote: > Hi, > > for some days or weeks I see crashes of ntpd in accounting log on > my laptop. > > Program terminated with signal SIGSEGV, Segmentation fault. > #0 log_sockaddr (sa=0x8) at /usr/src/usr.sbin/ntpd/util.c:159 > 159 if (getnameinfo(sa, SA_LEN(sa), buf, sizeof(buf), NULL, 0, > (gdb) bt > #0 log_sockaddr (sa=0x8) at /usr/src/usr.sbin/ntpd/util.c:159 > #1 0x00000b02fb57fc32 in constraint_msg_close (id=<optimized out>, > data=0xb058f8f3770 "\001", len=4) > at /usr/src/usr.sbin/ntpd/constraint.c:714 > #2 0x00000b02fb575f8a in ntp_dispatch_imsg () > at /usr/src/usr.sbin/ntpd/ntp.c:516 > #3 0x00000b02fb5758b8 in ntp_main (nconf=<optimized out>, pw=<optimized out>, > argc=<optimized out>, argv=<optimized out>) > at /usr/src/usr.sbin/ntpd/ntp.c:378 > #4 0x00000b02fb57304a in main (argc=<optimized out>, argv=<optimized out>) > at /usr/src/usr.sbin/ntpd/ntpd.c:224 > > (gdb) frame 1 > #1 0x00000b02fb57fc32 in constraint_msg_close (id=<optimized out>, > data=0xb058f8f3770 "\001", len=4) > at /usr/src/usr.sbin/ntpd/constraint.c:714 > 714 log_sockaddr((struct sockaddr *) > (gdb) print cstr > $2 = (struct constraint *) 0xb05b96ac000 > (gdb) print cstr->addr > $3 = (struct ntp_addr *) 0x0 > > Logging a null pointer address does not work. > > 711 if (fail) { > 712 log_debug("no constraint reply from %s" > 713 " received in time, next query %ds", > 714 log_sockaddr((struct sockaddr *) > 715 &cstr->addr->ss), CONSTRAINT_SCAN_INTERVAL); > > bluhm >
This should prevent that and a few potenial similar cases. -Otto Index: constraint.c =================================================================== RCS file: /home/cvs/src/usr.sbin/ntpd/constraint.c,v diff -u -p -r1.54 constraint.c --- constraint.c 27 Nov 2022 13:19:00 -0000 1.54 +++ constraint.c 18 Dec 2023 18:34:19 -0000 @@ -467,10 +467,9 @@ priv_constraint_check_child(pid_t pid, i if (sig != SIGTERM) { signame = strsignal(sig) ? strsignal(sig) : "unknown"; - log_warnx("constraint %s; " + log_warnx("constraint " "terminated with signal %d (%s)", - log_sockaddr((struct sockaddr *) - &cstr->addr->ss), sig, signame); + sig, signame); } fail = 1; } @@ -679,9 +678,10 @@ constraint_msg_result(u_int32_t id, u_in offset = gettime_from_timeval(&tv[0]) - gettime_from_timeval(&tv[1]); - log_info("constraint reply from %s: offset %f", - log_sockaddr((struct sockaddr *)&cstr->addr->ss), - offset); + if (cstr->addr != NULL) + log_info("constraint reply from %s: offset %f", + log_sockaddr((struct sockaddr *)&cstr->addr->ss), + offset); cstr->state = STATE_REPLY_RECEIVED; cstr->last = getmonotime(); @@ -710,10 +710,11 @@ constraint_msg_close(u_int32_t id, u_int memcpy(&fail, data, len); if (fail) { - log_debug("no constraint reply from %s" - " received in time, next query %ds", - log_sockaddr((struct sockaddr *) - &cstr->addr->ss), CONSTRAINT_SCAN_INTERVAL); + if (cstr->addr != NULL) + log_debug("no constraint reply from %s" + " received in time, next query %ds", + log_sockaddr((struct sockaddr *) + &cstr->addr->ss), CONSTRAINT_SCAN_INTERVAL); cnt = 0; TAILQ_FOREACH(tmp, &conf->constraints, entry)