From nobody Tue Feb 10 03:38:49 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) client-ip=209.85.128.45; envelope-from=philippe.mathieu.daude@gmail.com; helo=mail-wm1-f45.google.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1621487751; cv=none; d=zohomail.com; s=zohoarc; b=BFs8H+umvhN0SClJT4KIFBLPbz4EgoQZklETfiFj0LU6jUjwpBBGX84+6yUinK8qdrlfmiSakWx1yuC9uH293hBXnh/7TzEBR3npA1iuu9t4GHkyzPMGkUCTz3VV+hco+8WqNKnOVQcMzeV66tBSRH/YmvrVjaI6aC13Ys+uveg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1621487751; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TLM11x+CwA7dtccb1VwoEJf/uXmEpf+a+h0Tdo5AASA=; b=hUZAIXBfAnpEUFvBu5SlLMc3NdP5pu3XBmNoEm8Mwyii9Ob0iAy6wSOLfRmwEYIV/sD+DhPgvD+ET76HFWIcQ838DvkdV/MwabrIvwkxxhfznRqTKzqCFyquvTM0U/yk4xcsbYWO5jkPmieIr/7H+Tb+tvlFELx6P0eMYv5/eZE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of _spf.google.com designates 209.85.128.45 as permitted sender) smtp.mailfrom=philippe.mathieu.daude@gmail.com Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by mx.zohomail.com with SMTPS id 1621487751409759.5476220339168; Wed, 19 May 2021 22:15:51 -0700 (PDT) Received: by mail-wm1-f45.google.com with SMTP id b7so7779848wmh.5 for ; Wed, 19 May 2021 22:15:50 -0700 (PDT) Return-Path: Return-Path: Received: from x1w.redhat.com (31.red-83-51-215.dynamicip.rima-tde.net. [83.51.215.31]) by smtp.gmail.com with ESMTPSA id v18sm1938897wro.18.2021.05.19.22.15.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 May 2021 22:15:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TLM11x+CwA7dtccb1VwoEJf/uXmEpf+a+h0Tdo5AASA=; b=owbqZCRqWupKJwYUVgi5yJSS+TDgiXrJzgnOCT1KlQ5+3cMbDB5xWc1Mtn+HeWeWg8 zT2xxHrjRn08Goh5ZWCJhC9FHsiiOBriF+pc1uMSkQ2JH/rcIWzhKWTUmFQVUyW/5nNc 1hObPoHPygemN1uhyC+Wgz6CAau6ZaIXnmQDyZl88ebDwpzKS2/io/YMZXg4yXggVomr JntIww/3Rs81OWgkyr46GDWQMmF76b4xsQzI0yVM6oBVPFt+u8iwj6O66Kfafu9X6PZA Zc/EAhb1a3PVcLyLpg3yih7aUFuvxQgf4cb905VnIiV4qGKO9MxFPgpSqyhIQvUXEC+z iIzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=TLM11x+CwA7dtccb1VwoEJf/uXmEpf+a+h0Tdo5AASA=; b=tgqCSS9Tzmz5h4d9vEfJRFX6r/jBCHpS7fTF6RVCubUbu4OQmDeFB5Du6WO0OzHUcy kmRnWLoonih9vCkRt5R56e2cvg3pcaediFNDKsquIRWaxlmB1dPjM0sNOKJzPuRILBYM KTJl7WePoBBZ96X67C0d61TJiRPxJ5zLrb8oT+SxXxme2tIP/b0gAXkj2oPRpdy24+wq BDk5YjPM4S/jd3gOm6jmllO5ggWJYLc+Ed9o0ZoDwoypF2QgJKLgbMgPFNI1Xzxp4jcO QVHa85eCZsJ19vrW4JJZ5WKn9rTiYUDyRNnzLhdTtK5OXGpZOm9IezRzT6Q9N7TEBHQ2 6c9w== X-Gm-Message-State: AOAM530eByb+yvAuhQew/rzBpp5i3NGIYnrFxZt1bu3dEuYdB7vrCFlN p+qj/+tABlEA9YIgndhj9XM= X-Google-Smtp-Source: ABdhPJy3f01MKam21I/98mQDJb1njf1uZPZZ4J8u9p2CtqcrkPWbpxVMfyHf3UdGV9+F7n5Pkd7jww== X-Received: by 2002:a1c:e484:: with SMTP id b126mr2097270wmh.35.1621487749623; Wed, 19 May 2021 22:15:49 -0700 (PDT) Sender: =?UTF-8?Q?Philippe_Mathieu=2DDaud=C3=A9?= From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v3 1/3] hw/arm/boot: Abort if set_kernel_args() fails Date: Thu, 20 May 2021 07:15:40 +0200 Message-Id: <20210520051542.2378774-2-f4bug@amsat.org> X-Mailer: git-send-email 2.26.3 In-Reply-To: <20210520051542.2378774-1-f4bug@amsat.org> References: <20210520051542.2378774-1-f4bug@amsat.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) If a address_space_write() call fails while calling set_kernel_args(), the guest kernel will boot using crap data. Avoid that by aborting if this ever occurs. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Peter Maydell --- hw/arm/boot.c | 53 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/hw/arm/boot.c b/hw/arm/boot.c index d7b059225e6..0c1346d5842 100644 --- a/hw/arm/boot.c +++ b/hw/arm/boot.c @@ -291,15 +291,20 @@ static inline bool have_dtb(const struct arm_boot_inf= o *info) =20 #define WRITE_WORD(p, value) do { \ address_space_stl_notdirty(as, p, value, \ - MEMTXATTRS_UNSPECIFIED, NULL); \ + MEMTXATTRS_UNSPECIFIED, &result); \ + if (result !=3D MEMTX_OK) { \ + goto fail; \ + } \ p +=3D 4; \ } while (0) =20 -static void set_kernel_args(const struct arm_boot_info *info, AddressSpace= *as) +/* Returns: 0 on success, -1 on error */ +static int set_kernel_args(const struct arm_boot_info *info, AddressSpace = *as) { int initrd_size =3D info->initrd_size; hwaddr base =3D info->loader_start; hwaddr p; + MemTxResult result; =20 p =3D base + KERNEL_ARGS_ADDR; /* ATAG_CORE */ @@ -326,8 +331,11 @@ static void set_kernel_args(const struct arm_boot_info= *info, AddressSpace *as) int cmdline_size; =20 cmdline_size =3D strlen(info->kernel_cmdline); - address_space_write(as, p + 8, MEMTXATTRS_UNSPECIFIED, - info->kernel_cmdline, cmdline_size + 1); + result =3D address_space_write(as, p + 8, MEMTXATTRS_UNSPECIFIED, + info->kernel_cmdline, cmdline_size + = 1); + if (result !=3D MEMTX_OK) { + goto fail; + } cmdline_size =3D (cmdline_size >> 2) + 1; WRITE_WORD(p, cmdline_size + 2); WRITE_WORD(p, 0x54410009); @@ -341,22 +349,31 @@ static void set_kernel_args(const struct arm_boot_inf= o *info, AddressSpace *as) atag_board_len =3D (info->atag_board(info, atag_board_buf) + 3) & = ~3; WRITE_WORD(p, (atag_board_len + 8) >> 2); WRITE_WORD(p, 0x414f4d50); - address_space_write(as, p, MEMTXATTRS_UNSPECIFIED, - atag_board_buf, atag_board_len); + result =3D address_space_write(as, p, MEMTXATTRS_UNSPECIFIED, + atag_board_buf, atag_board_len); + if (result !=3D MEMTX_OK) { + goto fail; + } p +=3D atag_board_len; } /* ATAG_END */ WRITE_WORD(p, 0); WRITE_WORD(p, 0); + + return 0; +fail: + return -1; } =20 -static void set_kernel_args_old(const struct arm_boot_info *info, - AddressSpace *as) +/* Returns: 0 on success, -1 on error */ +static int set_kernel_args_old(const struct arm_boot_info *info, + AddressSpace *as) { hwaddr p; const char *s; int initrd_size =3D info->initrd_size; hwaddr base =3D info->loader_start; + MemTxResult result; =20 /* see linux/include/asm-arm/setup.h */ p =3D base + KERNEL_ARGS_ADDR; @@ -419,10 +436,18 @@ static void set_kernel_args_old(const struct arm_boot= _info *info, } s =3D info->kernel_cmdline; if (s) { - address_space_write(as, p, MEMTXATTRS_UNSPECIFIED, s, strlen(s) + = 1); + result =3D address_space_write(as, p, MEMTXATTRS_UNSPECIFIED, + s, strlen(s) + 1); + if (result !=3D MEMTX_OK) { + goto fail; + } } else { WRITE_WORD(p, 0); } + + return 0; +fail: + return -1; } =20 static int fdt_add_memory_node(void *fdt, uint32_t acells, hwaddr mem_base, @@ -786,10 +811,16 @@ static void do_cpu_reset(void *opaque) cpu_set_pc(cs, info->loader_start); =20 if (!have_dtb(info)) { + int err; + if (old_param) { - set_kernel_args_old(info, as); + err =3D set_kernel_args_old(info, as); } else { - set_kernel_args(info, as); + err =3D set_kernel_args(info, as); + } + if (err) { + error_report("could not set kernel arguments"); + exit(1); } } } else { --=20 2.26.3