From c9717ad647910df9ade1631a170a28fe6c6ba9a5 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Dec 2018 13:26:29 +0100 Subject: fix TTL parsing in gnunet-namestore --- src/namestore/gnunet-namestore.c | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) (limited to 'src/namestore') diff --git a/src/namestore/gnunet-namestore.c b/src/namestore/gnunet-namestore.c index 90fe79779..0124db62b 100644 --- a/src/namestore/gnunet-namestore.c +++ b/src/namestore/gnunet-namestore.c @@ -1374,6 +1374,7 @@ run (void *cls, * @param option name of the option (typically 'R') * @param value command line argument given; format is * "TTL TYPE FLAGS VALUE" where TTL is an expiration time (rel or abs), + * always given in seconds (without the unit), * TYPE is a DNS/GNS record type, FLAGS is either "n" for no flags or * a combination of 's' (shadow) and 'p' (public) and VALUE is the * value (in human-readable format) @@ -1390,13 +1391,14 @@ multirecord_process (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, struct GNUNET_GNSRECORD_Data record; char *cp; char *tok; + char *saveptr; int etime_is_rel; void *raw_data; (void) ctx; (void) option; cp = GNUNET_strdup (value); - tok = strtok (cp, " "); + tok = strtok_r (cp, " ", &saveptr); if (NULL == tok) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -1404,21 +1406,30 @@ multirecord_process (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, GNUNET_free (cp); return GNUNET_SYSERR; } - if (GNUNET_OK != - parse_expiration (tok, - &etime_is_rel, - &record.expiration_time)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Invalid expiration time `%s'\n"), - tok); - GNUNET_free (cp); - return GNUNET_SYSERR; + char *etime_in_s; + + GNUNET_asprintf (&etime_in_s, + "%s s", + tok); + if (GNUNET_OK != + parse_expiration (etime_in_s, + &etime_is_rel, + &record.expiration_time)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Invalid expiration time `%s' (must be without unit)\n"), + tok); + GNUNET_free (cp); + GNUNET_free (etime_in_s); + return GNUNET_SYSERR; + } + GNUNET_free (etime_in_s); } - tok = strtok (NULL, " "); + tok = strtok_r (NULL, " ", &saveptr); if (NULL == tok) { - GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Missing entries in record line `%s'.\n"), value); GNUNET_free (cp); @@ -1433,7 +1444,7 @@ multirecord_process (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, GNUNET_free (cp); return GNUNET_SYSERR; } - tok = strtok (NULL, " "); + tok = strtok_r (NULL, " ", &saveptr); if (NULL == tok) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -- cgit v1.2.3