From patchwork Wed Dec 3 02:27:41 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Perkins X-Patchwork-Id: 4047 Received: (qmail 26630 invoked by alias); 3 Dec 2014 02:28:42 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 25879 invoked by uid 89); 3 Dec 2014 02:28:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ig0-f177.google.com X-Received: by 10.43.111.66 with SMTP id en2mr5295886icc.55.1417573679452; Tue, 02 Dec 2014 18:27:59 -0800 (PST) From: James Perkins To: libc-alpha@sourceware.org Subject: [PATCH v2 2/2] [BZ #16141] strptime: fix %z minutes calculation Date: Tue, 2 Dec 2014 18:27:41 -0800 Message-Id: <1417573661-9902-2-git-send-email-james@loowit.net> In-Reply-To: <1417573661-9902-1-git-send-email-james@loowit.net> References: <1417573661-9902-1-git-send-email-james@loowit.net> This is a fix for [BZ #16141] strptime %z offset restriction. strptime supports the parsing of a timezone offset from UTC time into the broken-out time field tm_gmtoff. The offset includes an hour portion and an optional minute portion (ex. -08 or -0800 means eight hours before UTC, whereas -0830 means eight hours and thirty minutes before UTC). However, in the current implementation, the minutes portion calculation is correct only for minutes portion values evenly divisible by 3. This is because the minutes value is converted to decimal time, and not enough precision is used for rounding to cause incorrect results. For example, a +1159 offset string results in a tm_gmtoff of 43128 (== 11 * 3600 + 3528) seconds, instead of 43140 (== 11 * 3600 + 59 * 60) seconds. This fix calculates the offset from the hour and minute portions directly, without the rounding errors introduced by decimal time. James 2014-12-02 James Perkins james@loowit.net [BZ #16141] * time/strptime_l.c (__strptime_internal): Fix %z minutes calculation, removing incorrect decimal time rounding, so that all minute values result in a valid seconds value --- time/strptime_l.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/time/strptime_l.c b/time/strptime_l.c index 1cdce41..659fd91 100644 --- a/time/strptime_l.c +++ b/time/strptime_l.c @@ -770,19 +770,15 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) else if (n != 4) /* Only two or four digits recognized. */ return NULL; - else - { - /* We have to convert the minutes into decimal. */ - if (val % 100 >= 60) - return NULL; - val = (val / 100) * 100 + ((val % 100) * 50) / 30; - } + else if (val % 100 >= 60) + /* minutes valid range is 0 through 59. */ + return NULL; /* valid range UTC-24 to +25, ala POSIX */ if (neg && val > 2400) return NULL; if (!neg && val > 2500) return NULL; - tm->tm_gmtoff = (val * 3600) / 100; + tm->tm_gmtoff = (val / 100) * 3600 + (val % 100) * 60; if (neg) tm->tm_gmtoff = -tm->tm_gmtoff; }