Module Name: src Committed By: kre Date: Sat Nov 5 23:09:37 UTC 2016
Modified Files: src/lib/libc/time: zic.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.67 src/lib/libc/time/zic.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/time/zic.c diff -u src/lib/libc/time/zic.c:1.66 src/lib/libc/time/zic.c:1.67 --- src/lib/libc/time/zic.c:1.66 Sat Nov 5 22:21:48 2016 +++ src/lib/libc/time/zic.c Sat Nov 5 23:09:37 2016 @@ -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 @@ growalloc(void *ptr, size_t itemsize, pt 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;