1*4882a593SmuzhiyunSubject: restrict value range passed to isprint function 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunAccording to C standards isprint argument shall be representable as an 4*4882a593Smuzhiyununsigned char or be equal to EOF, otherwise the behaviour is undefined. 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunPassing arbitrary ints leads to segfault in nm program from elfutils. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunRestrict isprint argument range to values representable by unsigned char. 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunSigned-off-by: Max Filippov <jcmvbkbc@gmail.com> 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunTaken from buildroot 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunUpstream-Status: Pending 15*4882a593SmuzhiyunSigned-off-by: Khem Raj <raj.khem@gmail.com> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun--- 18*4882a593SmuzhiyunIndex: b/argp.h 19*4882a593Smuzhiyun=================================================================== 20*4882a593Smuzhiyun--- a/argp.h 21*4882a593Smuzhiyun+++ b/argp.h 22*4882a593Smuzhiyun@@ -23,6 +23,7 @@ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include <stdio.h> 25*4882a593Smuzhiyun #include <ctype.h> 26*4882a593Smuzhiyun+#include <limits.h> 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define __need_error_t 29*4882a593Smuzhiyun #include <errno.h> 30*4882a593Smuzhiyun@@ -577,7 +578,7 @@ 31*4882a593Smuzhiyun else 32*4882a593Smuzhiyun { 33*4882a593Smuzhiyun int __key = __opt->key; 34*4882a593Smuzhiyun- return __key > 0 && isprint (__key); 35*4882a593Smuzhiyun+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key); 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun } 38*4882a593Smuzhiyun 39*4882a593SmuzhiyunIndex: b/argp-parse.c 40*4882a593Smuzhiyun=================================================================== 41*4882a593Smuzhiyun--- a/argp-parse.c 42*4882a593Smuzhiyun+++ b/argp-parse.c 43*4882a593Smuzhiyun@@ -1292,7 +1292,7 @@ 44*4882a593Smuzhiyun int __key = __opt->key; 45*4882a593Smuzhiyun /* FIXME: whether or not a particular key implies a short option 46*4882a593Smuzhiyun * ought not to be locale dependent. */ 47*4882a593Smuzhiyun- return __key > 0 && isprint (__key); 48*4882a593Smuzhiyun+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key); 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun 52