From patchwork Fri Mar 11 11:40:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: nebelbank@posteo.de X-Patchwork-Id: 8565051 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B3ABFC0553 for ; Fri, 11 Mar 2016 11:41:07 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CA578202B8 for ; Fri, 11 Mar 2016 11:41:06 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 0173120272 for ; Fri, 11 Mar 2016 11:41:05 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id DE2E826654A; Fri, 11 Mar 2016 12:41:02 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NO_DNS_FOR_FROM, RCVD_IN_DNSWL_NONE,UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 23EAD2606AB; Fri, 11 Mar 2016 12:40:55 +0100 (CET) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id EBEF7261A5E; Fri, 11 Mar 2016 12:40:53 +0100 (CET) Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) by alsa0.perex.cz (Postfix) with ESMTP id 059902606AB for ; Fri, 11 Mar 2016 12:40:46 +0100 (CET) Received: from dovecot03.posteo.de (dovecot03.posteo.de [172.16.0.13]) by mout01.posteo.de (Postfix) with ESMTPS id 2F5A4209C1 for ; Fri, 11 Mar 2016 12:40:46 +0100 (CET) Received: from mail.posteo.de (localhost [127.0.0.1]) by dovecot03.posteo.de (Postfix) with ESMTPSA id 3qM4vx464tz5vNj; Fri, 11 Mar 2016 12:40:45 +0100 (CET) From: nebelbank@posteo.de To: patch@alsa-project.org Date: Fri, 11 Mar 2016 11:40:30 +0000 Message-Id: <1457696430-3781-1-git-send-email-nebelbank@posteo.de> X-Mailer: git-send-email 2.5.0 In-Reply-To: References: Cc: alsa-devel@alsa-project.org, erwin Subject: [alsa-devel] [PATCH v2 1/1] aplay/arecord: handle parsing errors of parameter values X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: erwin 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 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;