1dca155fe3fa (log: handle integer overflow in timestamps, 2014-02-24)
assigns the result of strtol() to an 'int' and then checks it against
LONG_MIN and LONG_MAX, indicating underflow or overflow, even though
'int' may not be large enough to represent those values.

On Mac, the compiler complains:

    warning: comparison of constant 9223372036854775807 with
      expression of type 'int' is always false
      if (<<tz == LONG_MAX>> || tz == LONG_MIN)

Similarly for the LONG_MIN case. Fix this.

Signed-off-by: Eric Sunshine <sunsh...@sunshineco.com>

Alternately, the result of strtol() could be assigned temporarily to a
'long', compared against LONG_MIN and LONG_MAX, and then assigned to the
'int' "tz" variable. I chose the 'errno' approach instead because its
dead obvious, even to the most casual reader who hasn't checked the
strtol() man page, that it's handling a conversion failure. However, I
could go either way.

This patch is atop 'next'.

 pretty.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pretty.c b/pretty.c
index 3b811ed..8903116 100644
--- a/pretty.c
+++ b/pretty.c
@@ -403,10 +403,10 @@ static const char *show_ident_date(const struct 
ident_split *ident,
                date = strtoul(ident->date_begin, NULL, 10);
        if (date_overflows(date))
                date = 0;
-       else {
-               if (ident->tz_begin && ident->tz_end)
-                       tz = strtol(ident->tz_begin, NULL, 10);
-               if (tz == LONG_MAX || tz == LONG_MIN)
+       else if (ident->tz_begin && ident->tz_end) {
+               errno = 0;
+               tz = strtol(ident->tz_begin, NULL, 10);
+               if (errno)
                        tz = 0;
        return show_date(date, tz, mode);

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to