Move unsigned limits to a separate table/recognizer and display them
using the appropriate (unsigned) format specification. This prevents integer overflow when ULLONG_MAX and (on some architectures) ULONG_MAX are used to initialize an intmax_t and then displayed as the signed value -1. (A different approach was suggested in the bug report, which I did not use.) If other limits are defined to be unsigned, they could be moved here. PR: 164049 Reported by: Marcus Reid
This commit is contained in:
parent
abeb3096ce
commit
29fa89bc66
@ -4,11 +4,12 @@
|
|||||||
|
|
||||||
PROG= getconf
|
PROG= getconf
|
||||||
|
|
||||||
SRCS= confstr.c getconf.c limits.c pathconf.c progenv.c sysconf.c
|
SRCS= confstr.c getconf.c limits.c pathconf.c progenv.c sysconf.c \
|
||||||
|
unsigned_limits.c
|
||||||
CFLAGS+= -I${.CURDIR}
|
CFLAGS+= -I${.CURDIR}
|
||||||
CLEANFILES+= confstr.c limits.c pathconf.c progenv.c sysconf.c \
|
CLEANFILES+= confstr.c limits.c pathconf.c progenv.c sysconf.c \
|
||||||
confstr.names limits.names pathconf.names sysconf.names \
|
confstr.names limits.names pathconf.names sysconf.names \
|
||||||
conflicting.names unique.names
|
conflicting.names unique.names unsigned_limits.names
|
||||||
|
|
||||||
.SUFFIXES: .gperf .names
|
.SUFFIXES: .gperf .names
|
||||||
.PHONY: conflicts
|
.PHONY: conflicts
|
||||||
|
@ -65,6 +65,7 @@ main(int argc, char **argv)
|
|||||||
int c, key, valid;
|
int c, key, valid;
|
||||||
const char *name, *vflag, *alt_path;
|
const char *name, *vflag, *alt_path;
|
||||||
intmax_t limitval;
|
intmax_t limitval;
|
||||||
|
uintmax_t ulimitval;
|
||||||
|
|
||||||
aflag = false;
|
aflag = false;
|
||||||
vflag = NULL;
|
vflag = NULL;
|
||||||
@ -115,6 +116,13 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (argv[optind + 1] == NULL) { /* confstr or sysconf */
|
if (argv[optind + 1] == NULL) { /* confstr or sysconf */
|
||||||
|
if ((valid = find_unsigned_limit(name, &ulimitval)) != 0) {
|
||||||
|
if (valid > 0)
|
||||||
|
printf("%" PRIuMAX "\n", ulimitval);
|
||||||
|
else
|
||||||
|
printf("undefined\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if ((valid = find_limit(name, &limitval)) != 0) {
|
if ((valid = find_limit(name, &limitval)) != 0) {
|
||||||
if (valid > 0)
|
if (valid > 0)
|
||||||
printf("%" PRIdMAX "\n", limitval);
|
printf("%" PRIdMAX "\n", limitval);
|
||||||
|
@ -37,6 +37,7 @@ typedef long long intmax_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int find_confstr(const char *name, int *key);
|
int find_confstr(const char *name, int *key);
|
||||||
|
int find_unsigned_limit(const char *name, uintmax_t *value);
|
||||||
int find_limit(const char *name, intmax_t *value);
|
int find_limit(const char *name, intmax_t *value);
|
||||||
int find_pathconf(const char *name, int *key);
|
int find_pathconf(const char *name, int *key);
|
||||||
int find_progenv(const char *name, const char **alt_path);
|
int find_progenv(const char *name, const char **alt_path);
|
||||||
|
@ -86,11 +86,6 @@ SCHAR_MIN, SCHAR_MIN
|
|||||||
SHRT_MAX, SHRT_MAX
|
SHRT_MAX, SHRT_MAX
|
||||||
SHRT_MIN, SHRT_MIN
|
SHRT_MIN, SHRT_MIN
|
||||||
SSIZE_MAX, SSIZE_MAX
|
SSIZE_MAX, SSIZE_MAX
|
||||||
UCHAR_MAX, UCHAR_MAX
|
|
||||||
UINT_MAX, UINT_MAX
|
|
||||||
ULLONG_MAX, ULLONG_MAX
|
|
||||||
ULONG_MAX, ULONG_MAX
|
|
||||||
USHRT_MAX, USHRT_MAX
|
|
||||||
WORD_BIT, WORD_BIT
|
WORD_BIT, WORD_BIT
|
||||||
CHARCLASS_NAME_MAX, CHARCLASS_NAME_MAX
|
CHARCLASS_NAME_MAX, CHARCLASS_NAME_MAX
|
||||||
NL_ARGMAX, NL_ARGMAX
|
NL_ARGMAX, NL_ARGMAX
|
||||||
|
Loading…
Reference in New Issue
Block a user