[alsa-devel] [PATCH v2 1/1] aplay/arecord: handle parsing errors of parameter values

Takashi Iwai tiwai at suse.de
Fri Mar 11 16:58:35 CET 2016


On Fri, 11 Mar 2016 12:40:30 +0100,
nebelbank at posteo.de wrote:
> 
> From: erwin <nebelbank at posteo.de>
> 
> when a user enters a command, he expects his command to be executed
> as specified or aborted if it is impossible to fulfill his request
> 
> right now a command like "arecord -d hw:1,0 --max-file-time 1h recording.wav"
> will happily record something and exit without error status while the resulting
> recording contains definitely not what the user requested
> 
> to fix this, the patch handles the number parsing function's error channel
> and checks whether the parsed number has any trailing characters
> 
> Signed-off-by: erwin <nebelbank at posteo.de>

Applied, thanks.


Takashi

> 
> diff --git a/aplay/aplay.c b/aplay/aplay.c
> index 7eacee3..7acaa83 100644
> --- a/aplay/aplay.c
> +++ b/aplay/aplay.c
> @@ -427,6 +427,22 @@ enum {
>  	OPT_FATAL_ERRORS,
>  };
>  
> +static long parse_long(const char *str, int *err)
> +{
> +	long val;
> +	char *endptr;
> +
> +	errno = 0;
> +	val = strtol(str, &endptr, 0);
> +
> +	if (errno != 0 || *endptr != '\0')
> +		*err = -1;
> +	else
> +		*err = 0;
> +
> +	return val;
> +}
> +
>  int main(int argc, char *argv[])
>  {
>  	int option_index;
> @@ -558,7 +574,11 @@ int main(int argc, char *argv[])
>  			}
>  			break;
>  		case 'c':
> -			rhwparams.channels = strtol(optarg, NULL, 0);
> +			rhwparams.channels = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid channels argument '%s'"), optarg);
> +				return 1;
> +			}
>  			if (rhwparams.channels < 1 || rhwparams.channels > 256) {
>  				error(_("value %i for channels is invalid"), rhwparams.channels);
>  				return 1;
> @@ -585,7 +605,11 @@ int main(int argc, char *argv[])
>  			}
>  			break;
>  		case 'r':
> -			tmp = strtol(optarg, NULL, 0);
> +			tmp = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid rate argument '%s'"), optarg);
> +				return 1;
> +			}
>  			if (tmp < 300)
>  				tmp *= 1000;
>  			rhwparams.rate = tmp;
> @@ -595,32 +619,64 @@ int main(int argc, char *argv[])
>  			}
>  			break;
>  		case 'd':
> -			timelimit = strtol(optarg, NULL, 0);
> +			timelimit = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid duration argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'N':
>  			nonblock = 1;
>  			open_mode |= SND_PCM_NONBLOCK;
>  			break;
>  		case 'F':
> -			period_time = strtol(optarg, NULL, 0);
> +			period_time = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid period time argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'B':
> -			buffer_time = strtol(optarg, NULL, 0);
> +			buffer_time = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid buffer time argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case OPT_PERIOD_SIZE:
> -			period_frames = strtol(optarg, NULL, 0);
> +			period_frames = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid period size argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case OPT_BUFFER_SIZE:
> -			buffer_frames = strtol(optarg, NULL, 0);
> +			buffer_frames = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid buffer size argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'A':
> -			avail_min = strtol(optarg, NULL, 0);
> +			avail_min = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid min available space argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'R':
> -			start_delay = strtol(optarg, NULL, 0);
> +			start_delay = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid start delay argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'T':
> -			stop_delay = strtol(optarg, NULL, 0);
> +			stop_delay = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid stop delay argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case 'v':
>  			verbose++;
> @@ -671,7 +727,11 @@ int main(int argc, char *argv[])
>  			test_position = 1;
>  			break;
>  		case OPT_TEST_COEF:
> -			test_coef = strtol(optarg, NULL, 0);
> +			test_coef = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid test coef argument '%s'"), optarg);
> +				return 1;
> +			}
>  			if (test_coef < 1)
>  				test_coef = 1;
>  			break;
> @@ -679,7 +739,11 @@ int main(int argc, char *argv[])
>  			test_nowait = 1;
>  			break;
>  		case OPT_MAX_FILE_TIME:
> -			max_file_time = strtol(optarg, NULL, 0);
> +			max_file_time = parse_long(optarg, &err);
> +			if (err < 0) {
> +				error(_("invalid max file time argument '%s'"), optarg);
> +				return 1;
> +			}
>  			break;
>  		case OPT_PROCESS_ID_FILE:
>  			pidfile_name = optarg;
> -- 
> 2.5.0
> 


More information about the Alsa-devel mailing list