* CVE-2019-8936, bsc#1128525: Crafted null dereference attack in
authenticated mode 6 packet.
* Fix several bugs in the BANCOMM reclock driver.
* Fix ntp_loopfilter.c snprintf compilation warnings.
* Fix spurious initgroups() error message.
* Fix STA_NANO struct timex units.
* Fix GPS week rollover in libparse.
* Fix incorrect poll interval in packet.
* Add a missing check for ENABLE_CMAC.
OBS-URL: https://build.opensuse.org/package/show/network:time/ntp?expand=0&rev=180
158 lines
4.8 KiB
Diff
158 lines
4.8 KiB
Diff
--- sntp/main.c.orig
|
|
+++ sntp/main.c
|
|
@@ -118,7 +118,6 @@ void set_li_vn_mode(struct pkt *spkt, ch
|
|
int set_time(double offset);
|
|
void dec_pending_ntp(const char *, sockaddr_u *);
|
|
int libevent_version_ok(void);
|
|
-int gettimeofday_cached(struct event_base *b, struct timeval *tv);
|
|
|
|
|
|
/*
|
|
@@ -271,7 +270,7 @@ sntp_main (
|
|
for (i = 0; i < argc; ++i)
|
|
handle_lookup(argv[i], CTX_UCST);
|
|
|
|
- gettimeofday_cached(base, &start_tv);
|
|
+ gettimeofday(&start_tv, NULL);
|
|
event_base_dispatch(base);
|
|
event_base_free(base);
|
|
|
|
@@ -571,7 +570,7 @@ queue_xmt(
|
|
xctx = emalloc_zero(sizeof(*xctx));
|
|
xctx->sock = sock;
|
|
xctx->spkt = spkt;
|
|
- gettimeofday_cached(base, &start_cb);
|
|
+ gettimeofday(&start_cb, NULL);
|
|
xctx->sched = start_cb.tv_sec + (2 * xmt_delay);
|
|
|
|
LINK_SORT_SLIST(xmt_q, xctx, (xctx->sched < L_S_S_CUR()->sched),
|
|
@@ -621,7 +620,7 @@ xmt_timer_cb(
|
|
|
|
if (NULL == xmt_q || shutting_down)
|
|
return;
|
|
- gettimeofday_cached(base, &start_cb);
|
|
+ gettimeofday(&start_cb, NULL);
|
|
if (xmt_q->sched <= start_cb.tv_sec) {
|
|
UNLINK_HEAD_SLIST(x, xmt_q, link);
|
|
TRACE(2, ("xmt_timer_cb: at .%6.6u -> %s\n",
|
|
@@ -708,7 +707,7 @@ timeout_queries(void)
|
|
TRACE(3, ("timeout_queries: called to check %u items\n",
|
|
(unsigned)COUNTOF(fam_listheads)));
|
|
|
|
- gettimeofday_cached(base, &start_cb);
|
|
+ gettimeofday(&start_cb, NULL);
|
|
for (idx = 0; idx < COUNTOF(fam_listheads); idx++) {
|
|
head = fam_listheads[idx];
|
|
for (spkt = head; spkt != NULL; spkt = spkt_next) {
|
|
@@ -1224,7 +1223,7 @@ handle_pkt(
|
|
TRACE(3, ("handle_pkt: %d bytes from %s %s\n",
|
|
rpktl, stoa(host), hostname));
|
|
|
|
- gettimeofday_cached(base, &tv_dst);
|
|
+ gettimeofday(&tv_dst, NULL);
|
|
|
|
p_SNTP_PRETEND_TIME = getenv("SNTP_PRETEND_TIME");
|
|
if (p_SNTP_PRETEND_TIME) {
|
|
@@ -1513,101 +1512,6 @@ libevent_version_ok(void)
|
|
}
|
|
return 1;
|
|
}
|
|
-
|
|
-/*
|
|
- * gettimeofday_cached()
|
|
- *
|
|
- * Clones the event_base_gettimeofday_cached() interface but ensures the
|
|
- * times are always on the gettimeofday() 1970 scale. Older libevent 2
|
|
- * sometimes used gettimeofday(), sometimes the since-system-start
|
|
- * clock_gettime(CLOCK_MONOTONIC), depending on the platform.
|
|
- *
|
|
- * It is not cleanly possible to tell which timescale older libevent is
|
|
- * using.
|
|
- *
|
|
- * The strategy involves 1 hour thresholds chosen to be far longer than
|
|
- * the duration of a round of libevent callbacks, which share a cached
|
|
- * start-of-round time. First compare the last cached time with the
|
|
- * current gettimeofday() time. If they are within one hour, libevent
|
|
- * is using the proper timescale so leave the offset 0. Otherwise,
|
|
- * compare libevent's cached time and the current time on the monotonic
|
|
- * scale. If they are within an hour, libevent is using the monotonic
|
|
- * scale so calculate the offset to add to such times to bring them to
|
|
- * gettimeofday()'s scale.
|
|
- */
|
|
-int
|
|
-gettimeofday_cached(
|
|
- struct event_base * b,
|
|
- struct timeval * caller_tv
|
|
- )
|
|
-{
|
|
-#if defined(_EVENT_HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
|
|
- static struct event_base * cached_b;
|
|
- static struct timeval cached;
|
|
- static struct timeval adj_cached;
|
|
- static struct timeval offset;
|
|
- static int offset_ready;
|
|
- struct timeval latest;
|
|
- struct timeval systemt;
|
|
- struct timespec ts;
|
|
- struct timeval mono;
|
|
- struct timeval diff;
|
|
- int cgt_rc;
|
|
- int gtod_rc;
|
|
-
|
|
- event_base_gettimeofday_cached(b, &latest);
|
|
- if (b == cached_b &&
|
|
- !memcmp(&latest, &cached, sizeof(latest))) {
|
|
- *caller_tv = adj_cached;
|
|
- return 0;
|
|
- }
|
|
- cached = latest;
|
|
- cached_b = b;
|
|
- if (!offset_ready) {
|
|
- cgt_rc = clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
- gtod_rc = gettimeofday(&systemt, NULL);
|
|
- if (0 != gtod_rc) {
|
|
- msyslog(LOG_ERR,
|
|
- "%s: gettimeofday() error %m",
|
|
- progname);
|
|
- exit(1);
|
|
- }
|
|
- diff = sub_tval(systemt, latest);
|
|
- if (debug > 1)
|
|
- printf("system minus cached %+ld.%06ld\n",
|
|
- (long)diff.tv_sec, (long)diff.tv_usec);
|
|
- if (0 != cgt_rc || labs((long)diff.tv_sec) < 3600) {
|
|
- /*
|
|
- * Either use_monotonic == 0, or this libevent
|
|
- * has been repaired. Leave offset at zero.
|
|
- */
|
|
- } else {
|
|
- mono.tv_sec = ts.tv_sec;
|
|
- mono.tv_usec = ts.tv_nsec / 1000;
|
|
- diff = sub_tval(latest, mono);
|
|
- if (debug > 1)
|
|
- printf("cached minus monotonic %+ld.%06ld\n",
|
|
- (long)diff.tv_sec, (long)diff.tv_usec);
|
|
- if (labs((long)diff.tv_sec) < 3600) {
|
|
- /* older libevent2 using monotonic */
|
|
- offset = sub_tval(systemt, mono);
|
|
- TRACE(1, ("%s: Offsetting libevent CLOCK_MONOTONIC times by %+ld.%06ld\n",
|
|
- "gettimeofday_cached",
|
|
- (long)offset.tv_sec,
|
|
- (long)offset.tv_usec));
|
|
- }
|
|
- }
|
|
- offset_ready = TRUE;
|
|
- }
|
|
- adj_cached = add_tval(cached, offset);
|
|
- *caller_tv = adj_cached;
|
|
-
|
|
- return 0;
|
|
-#else
|
|
- return event_base_gettimeofday_cached(b, caller_tv);
|
|
-#endif
|
|
-}
|
|
-
|
|
/* Dummy function to satisfy libntp/work_fork.c */
|
|
extern int set_user_group_ids(void);
|
|
int set_user_group_ids(void)
|