@@ -366,12 +366,15 @@ char* guac_user_parse_args_string(guac_user* user, const char** arg_names,
366366 /* Pull parameter value from argv */
367367 const char * value = argv [index ];
368368
369- /* Use default value if blank */
370- if (value [0 ] == 0 ) {
369+ /* Use default_value if value is NULL, or an empty string */
370+ if (value == NULL || value [0 ] == 0 ) {
371371
372372 /* NULL is a completely legal default value */
373- if (default_value == NULL )
373+ if (default_value == NULL ) {
374+ guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. No default value provided." ,
375+ arg_names [index ]);
374376 return NULL ;
377+ }
375378
376379 /* Log use of default */
377380 guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. Using "
@@ -386,17 +389,74 @@ char* guac_user_parse_args_string(guac_user* user, const char** arg_names,
386389
387390}
388391
389- int guac_user_parse_args_int (guac_user * user , const char * * arg_names ,
390- const char * * argv , int index , int default_value ) {
392+ char * guac_user_parse_args_int_string_bounded (guac_user * user , const char * * arg_names ,
393+ const char * * argv , int index , const char * default_value , int min , int max ) {
394+
395+ char * parse_end ;
396+ long parsed_value ;
397+
398+ /* Pull parameter value from argv */
399+ const char * value = argv [index ];
400+
401+ /* Use default_value if value is NULL, or an empty string */
402+ if (value == NULL || value [0 ] == 0 ) {
403+
404+ /* NULL is a completely legal default value */
405+ if (default_value == NULL ) {
406+ guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. No default value provided." ,
407+ arg_names [index ]);
408+
409+ return NULL ;
410+ }
411+
412+ /* Log use of default */
413+ guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. Using "
414+ "default value of \"%s\"." , arg_names [index ], default_value );
415+
416+ return guac_strdup (default_value );
417+
418+ }
419+
420+ /* Parse value using strtol, checking for errors */
421+ errno = 0 ;
422+ parsed_value = strtol (value , & parse_end , 10 );
423+
424+ /* Check for parsing errors or invalid range */
425+ if (errno != 0 || * parse_end != '\0' || parsed_value < min || parsed_value > max ) {
426+
427+ /* NULL is a completely legal default value */
428+ if (default_value == NULL ) {
429+ guac_user_log (user , GUAC_LOG_WARNING , "Specified value \"%s\" for "
430+ "parameter \"%s\" is not valid. No default value provided" ,
431+ value , arg_names [index ]);
432+
433+ return NULL ;
434+ }
435+
436+ /* Log use of default */
437+ guac_user_log (user , GUAC_LOG_WARNING , "Specified value \"%s\" for "
438+ "parameter \"%s\" is not valid. Using default value "
439+ "of \"%s\"." , value , arg_names [index ], default_value );
440+
441+ return guac_strdup (default_value );
442+
443+ }
444+
445+ /* Otherwise use provided value */
446+ return guac_strdup (value );
447+ }
448+
449+ int guac_user_parse_args_int_bounded (guac_user * user , const char * * arg_names ,
450+ const char * * argv , int index , int default_value , int min , int max ) {
391451
392452 char * parse_end ;
393453 long parsed_value ;
394454
395455 /* Pull parameter value from argv */
396456 const char * value = argv [index ];
397457
398- /* Use default value if blank */
399- if (value [0 ] == 0 ) {
458+ /* Use default_value if value is NULL, or an empty string */
459+ if (value == NULL || value [0 ] == 0 ) {
400460
401461 /* Log use of default */
402462 guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. Using "
@@ -410,24 +470,28 @@ int guac_user_parse_args_int(guac_user* user, const char** arg_names,
410470 errno = 0 ;
411471 parsed_value = strtol (value , & parse_end , 10 );
412472
413- /* Ensure parsed value is within the legal range of an int */
414- if (parsed_value < INT_MIN || parsed_value > INT_MAX )
415- errno = ERANGE ;
416-
417- /* Resort to default if input is invalid */
418- if (errno != 0 || * parse_end != '\0' ) {
473+ /* Check for parsing errors or invalid range */
474+ if (errno != 0 || * parse_end != '\0' || parsed_value < min || parsed_value > max ) {
419475
420476 /* Log use of default */
421477 guac_user_log (user , GUAC_LOG_WARNING , "Specified value \"%s\" for "
422- "parameter \"%s\" is not a valid integer . Using default value "
478+ "parameter \"%s\" is not valid. Using default value "
423479 "of %i." , value , arg_names [index ], default_value );
424480
425481 return default_value ;
426482
427483 }
428484
429485 /* Parsed successfully */
430- return parsed_value ;
486+ return (int )parsed_value ;
487+
488+ }
489+
490+ int guac_user_parse_args_int (guac_user * user , const char * * arg_names ,
491+ const char * * argv , int index , int default_value ) {
492+
493+ return guac_user_parse_args_int_bounded (user , arg_names , argv , index ,
494+ default_value , GUAC_ITOA_INT_MIN , GUAC_ITOA_INT_MAX );
431495
432496}
433497
@@ -437,8 +501,8 @@ int guac_user_parse_args_boolean(guac_user* user, const char** arg_names,
437501 /* Pull parameter value from argv */
438502 const char * value = argv [index ];
439503
440- /* Use default value if blank */
441- if (value [0 ] == 0 ) {
504+ /* Use default_value if value is NULL, or an empty string */
505+ if (value == NULL || value [0 ] == 0 ) {
442506
443507 /* Log use of default */
444508 guac_user_log (user , GUAC_LOG_DEBUG , "Parameter \"%s\" omitted. Using "
0 commit comments