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)