From patchwork Mon Nov 19 15:47:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Qiang X-Patchwork-Id: 10688823 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0CDFD13BB for ; Mon, 19 Nov 2018 15:49:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F103029FF4 for ; Mon, 19 Nov 2018 15:49:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E501029FF5; Mon, 19 Nov 2018 15:49:15 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BAA2429FF6 for ; Mon, 19 Nov 2018 15:49:14 +0000 (UTC) Received: from localhost ([::1]:57315 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOlnV-0003Zw-Hb for patchwork-qemu-devel@patchwork.kernel.org; Mon, 19 Nov 2018 10:49:13 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41444) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOlmU-0003TI-Vr for qemu-devel@nongnu.org; Mon, 19 Nov 2018 10:48:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gOlmU-00016S-4U for qemu-devel@nongnu.org; Mon, 19 Nov 2018 10:48:10 -0500 Received: from m12-16.163.com ([220.181.12.16]:52021) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gOlmT-00014u-GX for qemu-devel@nongnu.org; Mon, 19 Nov 2018 10:48:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id; bh=8PP/krRuVQKsYiWMWa 7RbIwmba5EYnKtjgyVGuceS1g=; b=C96XF2T8qc5YTYEbDe+p1D6F2jWfUktWb6 QIT11eJHxRKzvumMqaDfvlvQgthiJ1JQb/3cG7poX0RjseuMLGssHOBQBt2B0ZxM mFBCmlwv4yT9EswBCx1lHxHmL6+hSEACYKvSI40aOZoIdXrLPtgj/oEGmmoen3Ra Tz12omavg= Received: from ubuntu.localdomain (unknown [36.22.237.106]) by smtp12 (Coremail) with SMTP id EMCowADHTWIx2_JbFk1cAw--.51875S3; Mon, 19 Nov 2018 23:48:07 +0800 (CST) From: Li Qiang To: pbonzini@redhat.com, kraxel@redhat.com, lersek@redhat.com, philmd@redhat.com, armbru@redhat.com Date: Mon, 19 Nov 2018 07:47:35 -0800 Message-Id: <20181119154737.9840-2-liq3ea@163.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181119154737.9840-1-liq3ea@163.com> References: <20181119154737.9840-1-liq3ea@163.com> X-CM-TRANSID: EMCowADHTWIx2_JbFk1cAw--.51875S3 X-Coremail-Antispam: 1Uf129KBjvJXoWxJFyDZr4UCrWkKryxurWkCrg_yoW5tF1xpF Z8J3Z8G3s5JFZrXrsxZw4DuF1ftrs7XF1UX3y5Xw4kArWUXr1kuw4xKFySv3y2yrZ7Zwsr WF4rXrW7JF17XFJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UmiihUUUUU= X-Originating-IP: [36.22.237.106] X-CM-SenderInfo: 5oltjvrd6rljoofrz/xtbBaxcEbVets57wIAAAsS X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 220.181.12.16 Subject: [Qemu-devel] [PATCH 1/3] fw_cfg: fix -boot bootsplash error checking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Qiang , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP fw_cfg_bootsplash() gets option parameter "splash-time" with qemu_opt_get(), then converts it to an integer by hand. It neglects to check that conversion for errors. This is needlessly complicated and error-prone. But as "splash-time not specified" is not the same as "splash-time=T" for any T, we need use qemu_opt_get() to check if splash time exists. This patch also make the qemu exit when finding or loading splash file failed. Signed-off-by: Li Qiang Reviewed-by: Markus Armbruster --- hw/nvram/fw_cfg.c | 40 ++++++++++++++++------------------------ vl.c | 2 +- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c index 946f765f7f..78f43dad93 100644 --- a/hw/nvram/fw_cfg.c +++ b/hw/nvram/fw_cfg.c @@ -118,55 +118,47 @@ error: static void fw_cfg_bootsplash(FWCfgState *s) { - int boot_splash_time = -1; const char *boot_splash_filename = NULL; - char *p; + const char *boot_splash_time = NULL; char *filename, *file_data; gsize file_size; int file_type; - const char *temp; /* get user configuration */ QemuOptsList *plist = qemu_find_opts("boot-opts"); QemuOpts *opts = QTAILQ_FIRST(&plist->head); - if (opts != NULL) { - temp = qemu_opt_get(opts, "splash"); - if (temp != NULL) { - boot_splash_filename = temp; - } - temp = qemu_opt_get(opts, "splash-time"); - if (temp != NULL) { - p = (char *)temp; - boot_splash_time = strtol(p, &p, 10); - } - } + boot_splash_filename = qemu_opt_get(opts, "splash"); + boot_splash_time = qemu_opt_get(opts, "splash-time"); /* insert splash time if user configurated */ - if (boot_splash_time >= 0) { + if (boot_splash_time) { + int64_t bst_val = qemu_opt_get_number(opts, "splash-time", -1); /* validate the input */ - if (boot_splash_time > 0xffff) { - error_report("splash time is big than 65535, force it to 65535."); - boot_splash_time = 0xffff; + if (bst_val < 0 || bst_val > 0xffff) { + error_report("splash time is invalid," + "it should be a value between 0 and 65535"); + exit(1); } /* use little endian format */ - qemu_extra_params_fw[0] = (uint8_t)(boot_splash_time & 0xff); - qemu_extra_params_fw[1] = (uint8_t)((boot_splash_time >> 8) & 0xff); + qemu_extra_params_fw[0] = (uint8_t)(bst_val & 0xff); + qemu_extra_params_fw[1] = (uint8_t)((bst_val >> 8) & 0xff); fw_cfg_add_file(s, "etc/boot-menu-wait", qemu_extra_params_fw, 2); } /* insert splash file if user configurated */ - if (boot_splash_filename != NULL) { + if (boot_splash_filename) { filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, boot_splash_filename); if (filename == NULL) { - error_report("failed to find file '%s'.", boot_splash_filename); - return; + error_report("failed to find file '%s'", boot_splash_filename); + exit(1); } /* loading file data */ file_data = read_splashfile(filename, &file_size, &file_type); if (file_data == NULL) { g_free(filename); - return; + error_report("failed to read file '%s'", boot_splash_filename); + exit(1); } g_free(boot_splash_filedata); boot_splash_filedata = (uint8_t *)file_data; diff --git a/vl.c b/vl.c index fa25d1ae2d..96ac0ddcf6 100644 --- a/vl.c +++ b/vl.c @@ -336,7 +336,7 @@ static QemuOptsList qemu_boot_opts = { .type = QEMU_OPT_STRING, }, { .name = "splash-time", - .type = QEMU_OPT_STRING, + .type = QEMU_OPT_NUMBER, }, { .name = "reboot-timeout", .type = QEMU_OPT_STRING,