Prevent integer overflow of very large escape sequence params. Fixes #274.
This commit is contained in:
@@ -81,10 +81,16 @@ void Dispatcher::parse_params( void )
|
|||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
int val = strtol( segment_begin, &endptr, 10 );
|
long val = strtol( segment_begin, &endptr, 10 );
|
||||||
if ( endptr == segment_begin ) {
|
if ( endptr == segment_begin ) {
|
||||||
val = -1;
|
val = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( val > PARAM_MAX || errno == ERANGE ) {
|
||||||
|
val = -1;
|
||||||
|
errno = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ( errno == 0 || segment_begin == endptr ) {
|
if ( errno == 0 || segment_begin == endptr ) {
|
||||||
parsed_params.push_back( val );
|
parsed_params.push_back( val );
|
||||||
}
|
}
|
||||||
@@ -95,10 +101,16 @@ void Dispatcher::parse_params( void )
|
|||||||
/* get last param */
|
/* get last param */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
char *endptr;
|
char *endptr;
|
||||||
int val = strtol( segment_begin, &endptr, 10 );
|
long val = strtol( segment_begin, &endptr, 10 );
|
||||||
if ( endptr == segment_begin ) {
|
if ( endptr == segment_begin ) {
|
||||||
val = -1;
|
val = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( val > PARAM_MAX || errno == ERANGE ) {
|
||||||
|
val = -1;
|
||||||
|
errno = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ( errno == 0 || segment_begin == endptr ) {
|
if ( errno == 0 || segment_begin == endptr ) {
|
||||||
parsed_params.push_back( val );
|
parsed_params.push_back( val );
|
||||||
}
|
}
|
||||||
@@ -117,10 +129,6 @@ int Dispatcher::getparam( size_t N, int defaultval )
|
|||||||
ret = parsed_params[ N ];
|
ret = parsed_params[ N ];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ret > PARAM_MAX ) {
|
|
||||||
ret = defaultval;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ret < 1 ) ret = defaultval;
|
if ( ret < 1 ) ret = defaultval;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user