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

nebelbank at posteo.de nebelbank at posteo.de
Thu Mar 10 19:17:33 CET 2016


From: erwin <nebelbank at posteo.de>

Signed-off-by: erwin <nebelbank at posteo.de>
---
It took me a while to find out why the signal from "-d hw:1,0" sounded so
unexpected: was from another pair of microphones...

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