Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/time Actually, this problem won't be reported upstr...



details:   https://anonhg.NetBSD.org/src/rev/60725320e1af
branches:  trunk
changeset: 348757:60725320e1af
user:      kre <kre%NetBSD.org@localhost>
date:      Sat Nov 05 23:09:37 2016 +0000

description:
Actually, this problem won't be reported upstream, their code is
just ...

        ptrdiff_t nitems_max = PTRDIFF_MAX - WORK_AROUND_QTBUG_53071;
        ptrdiff_t amax = nitems_max < SIZE_MAX ? nitems_max : SIZE_MAX;

which is just fine if you think about it a little,   Unfortunately,
in our zealous effort to never leave a ggc warning unused, and to
treat all of the warnings as fatal errors, that code falls foul of the
"you must not compare an unsigned value with a signed value" warning.

nitems_max is a (signed) largish positive integer (obviously, by
inspection).  If it is less than SIZE_MAX then amax is just nitems_max.
In the unlikely case that size_t has less bits than ptrdiff_t so
SIZE_MAX is smaller, amax is limited to SIZE_MAX (which in that case
is known to fit in the ptrdiff_t and to remain positive).

To pacify gcc (and the way the build system uses it), casts are
required.   Unfortunately the cast that was installed here was to
convert SIZE_MAX to a ptrdiff_t.  Unfortunately when ptrdiff_t has
the same number of bits (or less) as size_t (ie: the common case)
but is signed, (ptrdiff_t)SIZE_MAX is just a fancy way of writing -1.

Rearrange the casting in a way that keeps the original intent
of the code for us (it is actyaly now incorrect if size_t has less
bits than a ptrdiff_t) and keeps gcc happy, all at the same time.

What a mess.

diffstat:

 lib/libc/time/zic.c |  13 ++++---------
 1 files changed, 4 insertions(+), 9 deletions(-)

diffs (35 lines):

diff -r 701ed7961754 -r 60725320e1af lib/libc/time/zic.c
--- a/lib/libc/time/zic.c       Sat Nov 05 22:21:48 2016 +0000
+++ b/lib/libc/time/zic.c       Sat Nov 05 23:09:37 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: zic.c,v 1.66 2016/11/05 22:21:48 kre Exp $     */
+/*     $NetBSD: zic.c,v 1.67 2016/11/05 23:09:37 kre Exp $     */
 /*
 ** This file is in the public domain, so clarified as of
 ** 2006-07-17 by Arthur David Olson.
@@ -10,7 +10,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: zic.c,v 1.66 2016/11/05 22:21:48 kre Exp $");
+__RCSID("$NetBSD: zic.c,v 1.67 2016/11/05 23:09:37 kre Exp $");
 #endif /* !defined lint */
 
 #include "private.h"
@@ -452,14 +452,9 @@
        if (nitems < *nitems_alloc)
                return ptr;
        else {
-#define IMAX (INT_MAX < SIZE_MAX ? INT_MAX : (int)SIZE_MAX)
-#if 0
                ptrdiff_t nitems_max = PTRDIFF_MAX - WORK_AROUND_QTBUG_53071;
-               ptrdiff_t amax = nitems_max < (ptrdiff_t)SIZE_MAX ?
-                   nitems_max : (ptrdiff_t)SIZE_MAX;
-#endif
-               int nitems_max = IMAX - WORK_AROUND_QTBUG_53071;
-               int amax = nitems_max < IMAX ? nitems_max : IMAX;
+               ptrdiff_t amax = (ptrdiff_t)((size_t)nitems_max < SIZE_MAX ?
+                   (size_t)nitems_max : SIZE_MAX);
                if ((amax - 1) / 3 * 2 < *nitems_alloc)
                        memory_exhausted(_("integer overflow"));
                *nitems_alloc += (*nitems_alloc >> 1) + 1;



Home | Main Index | Thread Index | Old Index