[systemd-commits] 2 commits - src/import src/shared src/timesync

David Herrmann dvdhrm at kemper.freedesktop.org
Sun Jan 18 13:10:49 PST 2015


 src/import/curl-util.c           |   34 ++++++++++++++++++----------------
 src/shared/util.c                |   16 +++++++++++-----
 src/shared/util.h                |   26 --------------------------
 src/timesync/timesyncd-manager.c |    3 ++-
 4 files changed, 31 insertions(+), 48 deletions(-)

New commits:
commit 0193ad26ba121f3df259cc8b3bab54a99b8e5252
Author: Cristian Rodríguez <crrodriguez at opensuse.org>
Date:   Thu Jan 15 02:27:34 2015 -0300

    util: replace RUN_WITH_LOCALE with extended locale functions
    
    There were two callers, one can use strtod_l() and the other strptime_l().
    
    (David: fix up commit-msg and coding-style)

diff --git a/src/import/curl-util.c b/src/import/curl-util.c
index 0c6c867..313b04b 100644
--- a/src/import/curl-util.c
+++ b/src/import/curl-util.c
@@ -416,29 +416,31 @@ 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) {
+        const char *e;
+        locale_t loc;
         struct tm tm;
         time_t v;
 
         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);
+        freelocale(loc);
+        if (!e || *e != 0)
+                return -EINVAL;
 
+        v = timegm(&tm);
         if (v == (time_t) -1)
                 return -EINVAL;
 
diff --git a/src/shared/util.c b/src/shared/util.c
index 884e782..8f6d5e6 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -507,18 +507,24 @@ 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 (loc == (locale_t) 0)
+                return -errno;
 
-        if (!x || x == s || *x || errno)
+        errno = 0;
+        d = strtod_l(s, &x, loc);
+
+        if (!x || x == s || *x || errno) {
+                freelocale(loc);
                 return errno ? -errno : -EINVAL;
+        }
 
+        freelocale(loc);
         *ret_d = (double) d;
         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);

commit 43fcd650e5cb0836cfc9f667ed74b3bc0283a81c
Author: Topi Miettinen <toiwoton at gmail.com>
Date:   Sun Jan 18 16:01:25 2015 +0200

    timesyncd: consider too long packets as invalid
    
    If the received NTP message from server didn't fit to our buffer, either
    it is doing something nasty or we don't know the protocol. Consider the
    packet as invalid.
    
    (David: add parantheses around conditional)

diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c
index 117ea8c..bc35662 100644
--- a/src/timesync/timesyncd-manager.c
+++ b/src/timesync/timesyncd-manager.c
@@ -525,7 +525,8 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
                 return manager_connect(m);
         }
 
-        if (iov.iov_len < sizeof(struct ntp_msg)) {
+        /* Too short or too long packet? */
+        if (iov.iov_len < sizeof(struct ntp_msg) || (msghdr.msg_flags & MSG_TRUNC)) {
                 log_warning("Invalid response from server. Disconnecting.");
                 return manager_connect(m);
         }



More information about the systemd-commits mailing list