From 850c143ac5ef21ec81882631c9a00eead2203beb Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Mon, 17 Oct 2022 18:44:30 +0200 Subject: [PATCH] Fix SIGSEGV caused by time_t casted to long on 32bit systems 32bit systems have time_t set to long long int while 64bit system have time_t set to long int. This is problematic as in the busybox code this is not handled correctly and we have some casted to long and some not casted at all. Some arch (found this problem on a mt7621) may be restrictive about casting and crash with segmentation fault if time_t is cast to %ld instead of the correct %lld. This is the cause of https://github.com/RIPE-NCC/ripe-atlas-software-probe/issues/74 Use the correct type and cast every time_t to (long long) so that eperd and condmv doesn't crash anymore and the measurement works correctly. Signed-off-by: Christian Marangi --- coreutils/condmv.c | 2 +- eperd/condmv.c | 6 +++--- eperd/evtdig.c | 12 ++++++------ eperd/httpget.c | 8 ++++---- eperd/ntp.c | 4 ++-- eperd/sslgetcert.c | 8 ++++---- eperd/traceroute.c | 8 ++++---- miscutils/perd.c | 4 ++-- networking/httppost.c | 30 +++++++++++++++--------------- networking/rptaddrs.c | 2 +- 10 files changed, 42 insertions(+), 42 deletions(-) diff --git a/coreutils/condmv.c b/coreutils/condmv.c index 4dfedd8cb..bf239c0b4 100644 --- a/coreutils/condmv.c +++ b/coreutils/condmv.c @@ -149,7 +149,7 @@ int condmv_main(int argc, char *argv[]) rebased_from, strerror(errno)); goto err; } - if (fprintf(file, "%s %lu %s\n", opt_add, mytime, from) < 0) + if (fprintf(file, "%s %llu %s\n", opt_add, (long long)mytime, from) < 0) { fprintf(stderr, "condmv: unable to append to '%s': %s\n", diff --git a/eperd/condmv.c b/eperd/condmv.c index dae202d2c..100670a74 100644 --- a/eperd/condmv.c +++ b/eperd/condmv.c @@ -99,8 +99,8 @@ static void condmv_start(void *state) len= strlen(condmvstate->to) + 20; to= malloc(len); - snprintf(to, len, "%s.%ld", condmvstate->to, - (long)time(NULL)/condmvstate->interval); + snprintf(to, len, "%s.%lld", condmvstate->to, + (long long)time(NULL)/condmvstate->interval); crondlog(LVL7 "condmv_start: destination '%s'\n", to); @@ -124,7 +124,7 @@ static void condmv_start(void *state) free(to); return; } - if (fprintf(file, "%s %lu %s\n", condmvstate->atlas, mytime, + if (fprintf(file, "%s %lld %s\n", condmvstate->atlas, (long long)mytime, condmvstate->from) < 0) { crondlog(LVL9 "condmv: unable to append to '%s': %s\n", diff --git a/eperd/evtdig.c b/eperd/evtdig.c index 6224b8bc7..4e5a31dee 100644 --- a/eperd/evtdig.c +++ b/eperd/evtdig.c @@ -1009,7 +1009,7 @@ static int mk_dns_buff(struct query_state *qry, u_char *packet, lookup_prepend = xzalloc(DEFAULT_LINE_LENGTH + sizeof(qry->lookupname)); snprintf(lookup_prepend, (sizeof(qry->lookupname) + DEFAULT_LINE_LENGTH - 1), - "%d.%lu.%s", probe_id, qry->xmit_time, + "%d.%lld.%s", probe_id, (long long)qry->xmit_time, qry->lookupname); qnamelen= ChangetoDnsNameFormat(qname, qnamelen, @@ -3081,7 +3081,7 @@ static void tdig_stats(int unusg_statsed UNUSED_PARAM, const short event UNUSED_ AS(atlas_get_version_json_str()); AS(", "); gettimeofday(&now, NULL); - JS1(time, %ld, now.tv_sec); + JS1(time, %lld, (long long)now.tv_sec); JU(sok , base->sentok); JU(rok , base->recvok); JU(sent , base->sentbytes); @@ -3395,7 +3395,7 @@ void printErrorQuick (struct query_state *qry) fprintf(fh, "RESULT { "); fprintf(fh, "%s,", atlas_get_version_json_str()); fprintf(fh, "\"id\" : 9202 ,"); - fprintf(fh, "\"time\" : %ld ,", atlas_time()); + fprintf(fh, "\"time\" : %lld ,", (long long)atlas_time()); fprintf(fh, "\"error\" : [{ "); fprintf(fh, "\"query busy\": \"not starting a new one. previous one is not done yet\"}"); @@ -3405,7 +3405,7 @@ void printErrorQuick (struct query_state *qry) fprintf(fh, "\"id\" : \"%s\"", qry->str_Atlas); if (qry->str_bundle) fprintf(fh, ",\"bundle\" : %s", qry->str_bundle); - fprintf(fh, ",\"start time\" : %ld", qry->xmit_time); + fprintf(fh, ",\"start time\" : %lld", (long long)qry->xmit_time); if(qry->retry) { fprintf(fh, ",\"retry\": %d", qry->retry); @@ -3456,7 +3456,7 @@ void printReply(struct query_state *qry, int wire_size, unsigned char *result) AS(atlas_get_version_json_str()); AS(", "); if (qry->opt_rset){ - JS1(time, %ld, qry->xmit_time); + JS1(time, %lld, (long long)qry->xmit_time); JD(lts,lts); AS("\"resultset\" : [ {"); } @@ -3466,7 +3466,7 @@ void printReply(struct query_state *qry, int wire_size, unsigned char *result) AS (",{"); } - JS1(time, %ld, qry->xmit_time); + JS1(time, %lld, (long long)qry->xmit_time); JD(lts,lts); if (qry->opt_do_tls && ssl_version != NULL) diff --git a/eperd/httpget.c b/eperd/httpget.c index 257f35e4b..f6a74f264 100644 --- a/eperd/httpget.c +++ b/eperd/httpget.c @@ -853,10 +853,10 @@ static void report(struct hgstate *state) fprintf(fh, DBQ(id) ":" DBQ(%s) ", " "%s, " DBQ(lts) ":%d, " - DBQ(time) ":%ld, ", + DBQ(time) ":%lld, ", state->atlas, atlas_get_version_json_str(), get_timesync(), - state->gstart); + (long long)state->gstart); if (state->bundle) { fprintf(fh, DBQ(bundle) ":%s, ", @@ -876,8 +876,8 @@ static void report(struct hgstate *state) { if (state->do_combine) { - snprintf(line, sizeof(line), DBQ(time) ":%ld, ", - state->start.tv_sec); + snprintf(line, sizeof(line), DBQ(time) ":%lld, ", + (long long)state->start.tv_sec); } else { diff --git a/eperd/ntp.c b/eperd/ntp.c index 294e32f0a..7f8c74a9a 100644 --- a/eperd/ntp.c +++ b/eperd/ntp.c @@ -366,10 +366,10 @@ static void report(struct ntpstate *state) fprintf(fh, DBQ(id) ":" DBQ(%s) ", %s" ", " DBQ(lts) ":%d" - ", " DBQ(time) ":%ld, ", + ", " DBQ(time) ":%lld, ", state->atlas, atlas_get_version_json_str(), get_timesync(), - state->starttime); + (long long)state->starttime); if (state->bundle) fprintf(fh, DBQ(bundle) ":%s, ", state->bundle); } diff --git a/eperd/sslgetcert.c b/eperd/sslgetcert.c index fccc3526d..b3d534df2 100644 --- a/eperd/sslgetcert.c +++ b/eperd/sslgetcert.c @@ -1026,9 +1026,9 @@ static void report(struct state *state) fprintf(fh, DBQ(id) ":" DBQ(%s) ", " "%s, " DBQ(lts) ":%d, " - DBQ(time) ":%ld, ", + DBQ(time) ":%lld, ", state->atlas, atlas_get_version_json_str(), - get_timesync(), state->gstart); + get_timesync(), (long long)state->gstart); if (state->bundle) fprintf(fh, DBQ(bundle) ":%s, ", state->bundle); } @@ -1185,8 +1185,8 @@ static FILE *report_head(struct state *state) fprintf(fh, DBQ(bundle) ":%s, ", state->bundle); } - fprintf(fh, "%s" DBQ(time) ":%ld", - state->atlas ? ", " : "", atlas_time()); + fprintf(fh, "%s" DBQ(time) ":%lld", + state->atlas ? ", " : "", (long long)atlas_time()); fprintf(fh, ", " DBQ(dst_name) ":" DBQ(%s) ", " DBQ(dst_port) ":" DBQ(%s), state->hostname, state->portname); diff --git a/eperd/traceroute.c b/eperd/traceroute.c index dcef94be2..1396e72d8 100644 --- a/eperd/traceroute.c +++ b/eperd/traceroute.c @@ -362,12 +362,12 @@ static void report(struct trtstate *state) fprintf(fh, DBQ(id) ":" DBQ(%s) ", %s" ", " DBQ(lts) ":%d" - ", " DBQ(time) ":%ld" - ", " DBQ(endtime) ":%ld, ", + ", " DBQ(time) ":%lld" + ", " DBQ(endtime) ":%lld, ", state->atlas, atlas_get_version_json_str(), get_timesync(), - state->starttime, - (long)atlas_time()); + (long long)state->starttime, + (long long)atlas_time()); if (state->bundle_id) fprintf(fh, DBQ(bundle) ":%s, ", state->bundle_id); } diff --git a/miscutils/perd.c b/miscutils/perd.c index c75f15c4b..d2e4592d0 100644 --- a/miscutils/perd.c +++ b/miscutils/perd.c @@ -1197,8 +1197,8 @@ static int atlas_run(char *cmdline) fprintf(fn, "RESULT { "); if (atlas_id) fprintf(fn, DBQ(id) ":" DBQ(%s) ", ", atlas_id); - fprintf(fn, "%s, " DBQ(time) ":%d, ", - atlas_get_version_json_str(), time(NULL)); + fprintf(fn, "%s, " DBQ(time) ":%lld, ", + atlas_get_version_json_str(), (long long)time(NULL)); if (reason != NULL) fprintf(fn, DBQ(reason) ":" DBQ(%s) ", ", reason); fprintf(fn, DBQ(err) ":%d, " DBQ(cmd) ": \"", r); diff --git a/networking/httppost.c b/networking/httppost.c index 36ebd2bfb..7d5f233ac 100644 --- a/networking/httppost.c +++ b/networking/httppost.c @@ -492,32 +492,32 @@ int httppost_main(int argc, char *argv[]) if (need_set_time && getenv("HTTPPOST_ALLOW_STIME")) { fprintf(stderr, - "setting time, time difference is %ld\n", - (long)server_time-now.tv_sec); + "setting time, time difference is %lld\n", + (long long)server_time-now.tv_sec); ts.tv_sec= server_time; ts.tv_nsec= 0; clock_settime(CLOCK_REALTIME, &ts); if (atlas_id) { printf( - "RESULT %s ongoing %ld httppost setting time, local %ld, remote %ld\n", - atlas_id, (long)time(NULL), - (long)now.tv_sec, - (long)server_time); + "RESULT %s ongoing %lld httppost setting time, local %lld, remote %lld\n", + atlas_id, (long long)time(NULL), + (long long)now.tv_sec, + (long long)server_time); } } else if (need_set_time) { fprintf(stderr, - "not setting time, time difference is %ld\n", - (long)server_time-now.tv_sec); + "not setting time, time difference is %lld\n", + (long long)server_time-now.tv_sec); if (atlas_id) { printf( - "RESULT %s ongoing %ld httppost not in sync, local %ld, remote %ld\n", - atlas_id, (long)time(NULL), - (long)now.tv_sec, - (long)server_time); + "RESULT %s ongoing %ld httppost not in sync, local %lld, remote %lld\n", + atlas_id, (long long)time(NULL), + (long long)now.tv_sec, + (long long)server_time); } } else if (rtt <= 1) @@ -528,7 +528,7 @@ int httppost_main(int argc, char *argv[]) fh= fopen(fn_new, "wt"); if (fh) { - fprintf(fh, "%ld\n", (long)now.tv_sec); + fprintf(fh, "%lld\n", (long long)now.tv_sec); fclose(fh); rename(fn_new, fn); } @@ -537,8 +537,8 @@ int httppost_main(int argc, char *argv[]) } else if (atlas_id) { - printf("RESULT %s ongoing %ld httppost rtt %g ms\n", - atlas_id, (long)time(NULL), rtt*1000); + printf("RESULT %s ongoing %lld httppost rtt %g ms\n", + atlas_id, (long long)time(NULL), rtt*1000); } } diff --git a/networking/rptaddrs.c b/networking/rptaddrs.c index da774174e..9a20d464c 100644 --- a/networking/rptaddrs.c +++ b/networking/rptaddrs.c @@ -802,7 +802,7 @@ static int rpt_ipv6(char *cache_name, char *out_name, char *opt_atlas, int opt_a JS(id, opt_atlas); } gettimeofday(&now, NULL); - JS1(time, %ld, now.tv_sec); + JS1(time, %lld, (long long)now.tv_sec); /* Copy all lines */ while (fgets(buf, sizeof(buf), file) != NULL)