Author: wollman
Date: Wed May 23 02:51:56 2018
New Revision: 334070
URL: https://svnweb.freebsd.org/changeset/base/334070

Log:
  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

Modified:
  head/usr.bin/getconf/Makefile
  head/usr.bin/getconf/getconf.c
  head/usr.bin/getconf/getconf.h
  head/usr.bin/getconf/limits.gperf

Modified: head/usr.bin/getconf/Makefile
==============================================================================
--- head/usr.bin/getconf/Makefile       Wed May 23 01:48:09 2018        
(r334069)
+++ head/usr.bin/getconf/Makefile       Wed May 23 02:51:56 2018        
(r334070)
@@ -4,11 +4,12 @@
 
 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}
 CLEANFILES+=   confstr.c limits.c pathconf.c progenv.c sysconf.c \
                confstr.names limits.names pathconf.names sysconf.names \
-               conflicting.names unique.names
+               conflicting.names unique.names unsigned_limits.names
 
 .SUFFIXES: .gperf .names
 .PHONY: conflicts

Modified: head/usr.bin/getconf/getconf.c
==============================================================================
--- head/usr.bin/getconf/getconf.c      Wed May 23 01:48:09 2018        
(r334069)
+++ head/usr.bin/getconf/getconf.c      Wed May 23 02:51:56 2018        
(r334070)
@@ -65,6 +65,7 @@ main(int argc, char **argv)
        int c, key, valid;
        const char *name, *vflag, *alt_path;
        intmax_t limitval;
+       uintmax_t ulimitval;
 
        aflag = false;
        vflag = NULL;
@@ -115,6 +116,13 @@ main(int argc, char **argv)
        }
 
        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 > 0)
                                printf("%" PRIdMAX "\n", limitval);

Modified: head/usr.bin/getconf/getconf.h
==============================================================================
--- head/usr.bin/getconf/getconf.h      Wed May 23 01:48:09 2018        
(r334069)
+++ head/usr.bin/getconf/getconf.h      Wed May 23 02:51:56 2018        
(r334070)
@@ -37,6 +37,7 @@ typedef long long intmax_t;
 #endif
 
 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_pathconf(const char *name, int *key);
 int    find_progenv(const char *name, const char **alt_path);

Modified: head/usr.bin/getconf/limits.gperf
==============================================================================
--- head/usr.bin/getconf/limits.gperf   Wed May 23 01:48:09 2018        
(r334069)
+++ head/usr.bin/getconf/limits.gperf   Wed May 23 02:51:56 2018        
(r334070)
@@ -86,11 +86,6 @@ SCHAR_MIN, SCHAR_MIN
 SHRT_MAX, SHRT_MAX
 SHRT_MIN, SHRT_MIN
 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
 CHARCLASS_NAME_MAX, CHARCLASS_NAME_MAX
 NL_ARGMAX, NL_ARGMAX
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to