diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-02 13:43:06 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-02 13:43:06 +0100 |
commit | 4bd51893704e4db5dda0ecca19ebb1f39a574baa (patch) | |
tree | 4a9eff56fcb96e7f78499fe156a2945159a3a14a /networking/ntpd.c | |
parent | ebde6f10fbce0e1843cf1ffa2b1f2697d0139117 (diff) | |
download | busybox-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.c | 72 |
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 { | |||
113 | typedef struct { | 113 | typedef 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) | |||
404 | static void | 404 | static void |
405 | slew_time(void) | 405 | slew_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); |