Module Name: src
Committed By: christos
Date: Tue Dec 13 19:08:42 UTC 2022
Modified Files:
src/lib/libc/time: zdump.c zic.c
Log Message:
Handle the case the code originally intended to handle; systems where:
SIZE_MAX < PTRDIFF_MAX
To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/lib/libc/time/zdump.c
cvs rdiff -u -r1.86 -r1.87 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/zdump.c
diff -u src/lib/libc/time/zdump.c:1.59 src/lib/libc/time/zdump.c:1.60
--- src/lib/libc/time/zdump.c:1.59 Sun Dec 11 12:57:23 2022
+++ src/lib/libc/time/zdump.c Tue Dec 13 14:08:42 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: zdump.c,v 1.59 2022/12/11 17:57:23 christos Exp $ */
+/* $NetBSD: zdump.c,v 1.60 2022/12/13 19:08:42 christos Exp $ */
/* Dump time zone data in a textual format. */
/*
@@ -8,7 +8,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: zdump.c,v 1.59 2022/12/11 17:57:23 christos Exp $");
+__RCSID("$NetBSD: zdump.c,v 1.60 2022/12/13 19:08:42 christos Exp $");
#endif /* !defined lint */
#ifndef NETBSD_INSPIRED
@@ -144,10 +144,10 @@ sumsize(size_t a, size_t b)
{
#ifdef ckd_add
ptrdiff_t sum;
- if (!ckd_add(&sum, a, b) && sum <= PTRDIFF_MAX)
+ if (!ckd_add(&sum, a, b) && sum <= (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX))
return sum;
#else
- ptrdiff_t sum_max = min(PTRDIFF_MAX, SIZE_MAX);
+ ptrdiff_t sum_max = (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX);
if (a <= sum_max && b <= sum_max - a)
return a + b;
#endif
@@ -269,7 +269,7 @@ tzalloc(char const *val)
|| SIZE_MAX < initial_envptrs)
size_overflow();
# else
- if (initial_nenvptrs == min(PTRDIFF_MAX, SIZE_MAX) / sizeof *environ)
+ if (initial_nenvptrs == (ptrdiff_t)(min(PTRDIFF_MAX, SIZE_MAX) / sizeof *environ))
size_overflow();
initial_nenvptrs++;
# endif
Index: src/lib/libc/time/zic.c
diff -u src/lib/libc/time/zic.c:1.86 src/lib/libc/time/zic.c:1.87
--- src/lib/libc/time/zic.c:1.86 Sun Dec 11 12:57:23 2022
+++ src/lib/libc/time/zic.c Tue Dec 13 14:08:42 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: zic.c,v 1.86 2022/12/11 17:57:23 christos Exp $ */
+/* $NetBSD: zic.c,v 1.87 2022/12/13 19:08:42 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2006-07-17 by Arthur David Olson.
@@ -11,7 +11,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: zic.c,v 1.86 2022/12/11 17:57:23 christos Exp $");
+__RCSID("$NetBSD: zic.c,v 1.87 2022/12/13 19:08:42 christos Exp $");
#endif /* !defined lint */
/* Use the system 'time' function, instead of any private replacement.
@@ -490,10 +490,10 @@ size_sum(size_t a, size_t b)
{
#ifdef ckd_add
ptrdiff_t sum;
- if (!ckd_add(&sum, a, b) && sum <= PTRDIFF_MAX)
+ if (!ckd_add(&sum, a, b) && sum <= (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX))
return sum;
#else
- ptrdiff_t sum_max = min(PTRDIFF_MAX, SIZE_MAX);
+ ptrdiff_t sum_max = (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX);
if (a <= sum_max && b <= sum_max - a)
return a + b;
#endif
@@ -505,10 +505,10 @@ size_product(ptrdiff_t nitems, ptrdiff_t
{
#ifdef ckd_mul
ptrdiff_t product;
- if (!ckd_mul(&product, nitems, itemsize) && product <= PTRDIFF_MAX)
+ if (!ckd_mul(&product, nitems, itemsize) && product <= (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX))
return product;
#else
- ptrdiff_t nitems_max = min(PTRDIFF_MAX, SIZE_MAX) / itemsize;
+ ptrdiff_t nitems_max = (ptrdiff_t)(min(PTRDIFF_MAX, SIZE_MAX) / itemsize);
if (nitems <= nitems_max)
return nitems * itemsize;
#endif
@@ -564,10 +564,11 @@ grow_nitems_alloc(ptrdiff_t *nitems_allo
#if defined ckd_add && defined ckd_mul
ptrdiff_t product;
if (!ckd_add(nitems_alloc, *nitems_alloc, addend)
- && !ckd_mul(&product, *nitems_alloc, itemsize) && product <= PTRDIFF_MAX)
+ && !ckd_mul(&product, *nitems_alloc, itemsize)
+ && product <= (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX))
return product;
#else
- ptrdiff_t amax = min(PTRDIFF_MAX, SIZE_MAX);
+ ptrdiff_t amax = (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX);
if (*nitems_alloc <= ((amax - 1) / 3 * 2) / itemsize) {
*nitems_alloc += addend;
return *nitems_alloc * itemsize;
@@ -1413,7 +1414,7 @@ static char *
relname(char const *target, char const *linkname)
{
size_t i, taillen, dir_len = 0, dotdots = 0;
- ptrdiff_t dotdotetcsize, linksize = min(PTRDIFF_MAX, SIZE_MAX);
+ ptrdiff_t dotdotetcsize, linksize = (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX);
char const *f = target;
char *result = NULL;
if (*linkname == '/') {
@@ -1688,7 +1689,7 @@ infile(int fnum, char const *name)
wantcont = false;
for (num = 1; ; ++num) {
enum { bufsize_bound
- = (min(INT_MAX, min(PTRDIFF_MAX, SIZE_MAX))
+ = (min(INT_MAX, (ptrdiff_t)min(PTRDIFF_MAX, SIZE_MAX))
/ FORMAT_LEN_GROWTH_BOUND) };
char buf[min(_POSIX2_LINE_MAX, bufsize_bound)];
int nfields;