aboutsummaryrefslogtreecommitdiff
path: root/networking/ntpd.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-02 13:43:06 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-02 13:43:06 +0100
commit4bd51893704e4db5dda0ecca19ebb1f39a574baa (patch)
tree4a9eff56fcb96e7f78499fe156a2945159a3a14a /networking/ntpd.c
parentebde6f10fbce0e1843cf1ffa2b1f2697d0139117 (diff)
downloadbusybox-w32-4bd51893704e4db5dda0ecca19ebb1f39a574baa.tar.gz
busybox-w32-4bd51893704e4db5dda0ecca19ebb1f39a574baa.tar.bz2
busybox-w32-4bd51893704e4db5dda0ecca19ebb1f39a574baa.zip
ntpd: fix malloc-too-short bug; code shrink -76 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/ntpd.c')
-rw-r--r--networking/ntpd.c72
1 files changed, 27 insertions, 45 deletions
diff --git a/networking/ntpd.c b/networking/ntpd.c
index b100caa09..320477c13 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -113,7 +113,7 @@ enum {
113typedef struct { 113typedef struct {
114 double o_offset; 114 double o_offset;
115 double o_delay; 115 double o_delay;
116 //UNUSED: double o_error; 116 //UNUSED: double o_error;
117 time_t o_rcvd; 117 time_t o_rcvd;
118 uint32_t o_refid4; 118 uint32_t o_refid4;
119 uint8_t o_leap; 119 uint8_t o_leap;
@@ -404,42 +404,34 @@ updated_scale(double offset)
404static void 404static void
405slew_time(void) 405slew_time(void)
406{ 406{
407 ntp_peer_t *p; 407 llist_t *item;
408 llist_t *item; 408 double offset_median;
409 unsigned offset_cnt; 409 struct timeval tv;
410 double offset_median;
411 struct timeval tv;
412
413 offset_cnt = 0;
414 for (item = G.ntp_peers; item != NULL; item = item->link) {
415 p = (ntp_peer_t *) item->data;
416 if (p->trustlevel < TRUSTLEVEL_BADPEER)
417 continue;
418 if (!p->update.o_good)
419 return;
420 offset_cnt++;
421 }
422
423 if (offset_cnt == 0)
424 goto clear_good;
425 410
426 { 411 {
427 len_and_sockaddr *lsa; 412 len_and_sockaddr *lsa;
413 ntp_peer_t **peers = xzalloc(sizeof(peers[0]) * G.peer_cnt);
414 unsigned goodpeer_cnt = 0;
428 unsigned middle; 415 unsigned middle;
429 unsigned i = 0;
430 ntp_peer_t **peers = xzalloc(sizeof(peers[0]) * offset_cnt);
431 416
432 for (item = G.ntp_peers; item != NULL; item = item->link) { 417 for (item = G.ntp_peers; item != NULL; item = item->link) {
433 p = (ntp_peer_t *) item->data; 418 ntp_peer_t *p = (ntp_peer_t *) item->data;
434 if (p->trustlevel < TRUSTLEVEL_BADPEER) 419 if (p->trustlevel < TRUSTLEVEL_BADPEER)
435 continue; 420 continue;
436 peers[i++] = p; 421 if (!p->update.o_good)
422 return;
423 peers[goodpeer_cnt++] = p;
424 }
425
426 if (goodpeer_cnt == 0) {
427 free(peers);
428 goto clear_good;
437 } 429 }
438 430
439 qsort(peers, offset_cnt, sizeof(peers[0]), compare_offsets); 431 qsort(peers, goodpeer_cnt, sizeof(peers[0]), compare_offsets);
440 432
441 middle = offset_cnt / 2; 433 middle = goodpeer_cnt / 2;
442 if (middle != 0 && (offset_cnt & 1) == 0) { 434 if (middle != 0 && (goodpeer_cnt & 1) == 0) {
443 offset_median = (peers[middle-1]->update.o_offset + peers[middle]->update.o_offset) / 2; 435 offset_median = (peers[middle-1]->update.o_offset + peers[middle]->update.o_offset) / 2;
444 G.rootdelay = (peers[middle-1]->update.o_delay + peers[middle]->update.o_delay) / 2; 436 G.rootdelay = (peers[middle-1]->update.o_delay + peers[middle]->update.o_delay) / 2;
445 G.stratum = 1 + MAX(peers[middle-1]->update.o_stratum, peers[middle]->update.o_stratum); 437 G.stratum = 1 + MAX(peers[middle-1]->update.o_stratum, peers[middle]->update.o_stratum);
@@ -480,11 +472,12 @@ slew_time(void)
480 } 472 }
481 473
482 G.reftime = gettime1900fp(); 474 G.reftime = gettime1900fp();
475//TODO: log if G.scale changed?
483 G.scale = updated_scale(offset_median); 476 G.scale = updated_scale(offset_median);
484 477
485 clear_good: 478 clear_good:
486 for (item = G.ntp_peers; item != NULL; item = item->link) { 479 for (item = G.ntp_peers; item != NULL; item = item->link) {
487 p = (ntp_peer_t *) item->data; 480 ntp_peer_t *p = (ntp_peer_t *) item->data;
488 p->update.o_good = 0; 481 p->update.o_good = 0;
489 } 482 }
490} 483}
@@ -512,7 +505,7 @@ step_time_once(double offset)
512 d_to_tv(offset, &tv); 505 d_to_tv(offset, &tv);
513 506
514 if (settimeofday(&tv, NULL) == -1) { 507 if (settimeofday(&tv, NULL) == -1) {
515 bb_error_msg("settimeofday"); 508 bb_perror_msg("settimeofday");
516 goto bail; 509 goto bail;
517 } 510 }
518 511
@@ -544,22 +537,13 @@ update_peer_data(ntp_peer_t *p)
544 * Invalidate it and all older ones. 537 * Invalidate it and all older ones.
545 */ 538 */
546 int i; 539 int i;
547 int best = best; /* for compiler */ 540 int best = -1;
548 int good; 541 int good = 0;
549 542
550 good = 0;
551 for (i = 0; i < OFFSET_ARRAY_SIZE; i++) { 543 for (i = 0; i < OFFSET_ARRAY_SIZE; i++) {
552 if (p->reply[i].o_good) { 544 if (p->reply[i].o_good) {
553 good++; 545 good++;
554 best = i++; 546 if (best < 0 || p->reply[i].o_delay < p->reply[best].o_delay)
555 break;
556 }
557 }
558
559 for (; i < OFFSET_ARRAY_SIZE; i++) {
560 if (p->reply[i].o_good) {
561 good++;
562 if (p->reply[i].o_delay < p->reply[best].o_delay)
563 best = i; 547 best = i;
564 } 548 }
565 } 549 }
@@ -612,8 +596,6 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
612 xfunc_die(); 596 xfunc_die();
613 } 597 }
614 598
615 T4 = gettime1900fp();
616
617 if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) { 599 if (size != NTP_MSGSIZE_NOAUTH && size != NTP_MSGSIZE) {
618 bb_error_msg("malformed packet received from %s", p->dotted); 600 bb_error_msg("malformed packet received from %s", p->dotted);
619 goto bail; 601 goto bail;
@@ -649,6 +631,7 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
649 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2. 631 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2.
650 */ 632 */
651 633
634 T4 = gettime1900fp();
652 T1 = p->xmttime; 635 T1 = p->xmttime;
653 T2 = lfp_to_d(msg.m_rectime); 636 T2 = lfp_to_d(msg.m_rectime);
654 T3 = lfp_to_d(msg.m_xmttime); 637 T3 = lfp_to_d(msg.m_xmttime);
@@ -658,14 +641,13 @@ recv_and_process_peer_pkt(ntp_peer_t *p)
658 offset->o_offset = ((T2 - T1) + (T3 - T4)) / 2; 641 offset->o_offset = ((T2 - T1) + (T3 - T4)) / 2;
659 offset->o_delay = (T4 - T1) - (T3 - T2); 642 offset->o_delay = (T4 - T1) - (T3 - T2);
660 if (offset->o_delay < 0) { 643 if (offset->o_delay < 0) {
644 bb_error_msg("reply from %s: negative delay %f", p->dotted, offset->o_delay);
661 interval = error_interval(); 645 interval = error_interval();
662 set_next(p, interval); 646 set_next(p, interval);
663 bb_error_msg("reply from %s: negative delay %f", p->dotted, p->reply[p->shift].o_delay);
664 goto close_sock; 647 goto close_sock;
665 } 648 }
666 //UNUSED: offset->o_error = (T2 - T1) - (T3 - T4); 649 //UNUSED: offset->o_error = (T2 - T1) - (T3 - T4);
667// Can we use (T4 - OFFSET_1900_1970) instead of time(NULL)? 650 offset->o_rcvd = time(NULL); /* can use (time_t)(T4 - OFFSET_1900_1970) too */
668 offset->o_rcvd = time(NULL);
669 offset->o_good = 1; 651 offset->o_good = 1;
670 652
671 offset->o_leap = (msg.m_status & LI_MASK); 653 offset->o_leap = (msg.m_status & LI_MASK);