There were two callers, one can use strtod_l() and the other strptime_l() --- src/import/curl-util.c | 38 +++++++++++++++++++++++--------------- src/shared/util.c | 18 +++++++++++++----- src/shared/util.h | 26 -------------------------- 3 files changed, 36 insertions(+), 46 deletions(-)
diff --git a/src/import/curl-util.c b/src/import/curl-util.c index 0c6c867..bbb68f7 100644 --- a/src/import/curl-util.c +++ b/src/import/curl-util.c @@ -418,27 +418,35 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char int curl_parse_http_time(const char *t, usec_t *ret) { struct tm tm; time_t v; + const char *e; + locale_t loc; assert(t); assert(ret); - RUN_WITH_LOCALE(LC_TIME, "C") { - const char *e; - - /* RFC822 */ - e = strptime(t, "%a, %d %b %Y %H:%M:%S %Z", &tm); - if (!e || *e != 0) - /* RFC 850 */ - e = strptime(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm); - if (!e || *e != 0) - /* ANSI C */ - e = strptime(t, "%a %b %d %H:%M:%S %Y", &tm); - if (!e || *e != 0) - return -EINVAL; - - v = timegm(&tm); + loc = newlocale (LC_TIME_MASK, "C", (locale_t)0); + + if (loc == (locale_t) 0) + return -errno; + + /* RFC822 */ + e = strptime_l(t, "%a, %d %b %Y %H:%M:%S %Z", &tm, loc); + + if (!e || *e != 0) + /* RFC 850 */ + e = strptime_l(t, "%A, %d-%b-%y %H:%M:%S %Z", &tm, loc); + if (!e || *e != 0) + /* ANSI C */ + e = strptime_l(t, "%a %b %d %H:%M:%S %Y", &tm, loc); + if (!e || *e != 0) { + freelocale(loc); + return -EINVAL; } + freelocale(loc); + + v = timegm(&tm); + if (v == (time_t) -1) return -EINVAL; diff --git a/src/shared/util.c b/src/shared/util.c index 884e782..599f3ca 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -507,19 +507,27 @@ int safe_atolli(const char *s, long long int *ret_lli) { int safe_atod(const char *s, double *ret_d) { char *x = NULL; double d = 0; + locale_t loc; assert(s); assert(ret_d); - RUN_WITH_LOCALE(LC_NUMERIC_MASK, "C") { - errno = 0; - d = strtod(s, &x); - } + loc = newlocale (LC_NUMERIC_MASK, "C", (locale_t)0); - if (!x || x == s || *x || errno) + if(loc == (locale_t)0) + return -errno; + + errno = 0; + d = strtod_l(s, &x, loc); + + if (!x || x == s || *x || errno) { + freelocale(loc); return errno ? -errno : -EINVAL; + } *ret_d = (double) d; + freelocale(loc); + return 0; } diff --git a/src/shared/util.h b/src/shared/util.h index fdb9fb6..8445371 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -942,32 +942,6 @@ int unlink_noerrno(const char *path); _r_; \ }) -struct _locale_struct_ { - locale_t saved_locale; - locale_t new_locale; - bool quit; -}; - -static inline void _reset_locale_(struct _locale_struct_ *s) { - PROTECT_ERRNO; - if (s->saved_locale != (locale_t) 0) - uselocale(s->saved_locale); - if (s->new_locale != (locale_t) 0) - freelocale(s->new_locale); -} - -#define RUN_WITH_LOCALE(mask, loc) \ - for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \ - ({ \ - if (!_saved_locale_.quit) { \ - PROTECT_ERRNO; \ - _saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \ - if (_saved_locale_.new_locale != (locale_t) 0) \ - _saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \ - } \ - !_saved_locale_.quit; }) ; \ - _saved_locale_.quit = true) - bool id128_is_valid(const char *s) _pure_; int split_pair(const char *s, const char *sep, char **l, char **r); -- 2.2.1 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel