From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 6XB3Oft/2GqAjwEAWB0awg (envelope-from ) for ; Wed, 21 Oct 2026 05:03:55 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=Y5Yhhl/V; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id E3BBF1E047; Wed, 21 Oct 2026 05:03:55 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 7815E1E047 for ; Wed, 21 Oct 2026 05:03:54 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 274424BA23D8 for ; Wed, 21 Oct 2026 09:03:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 274424BA23D8 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=Y5Yhhl/V Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by sourceware.org (Postfix) with ESMTPS id 0DDD04BA2E28 for ; Wed, 21 Oct 2026 09:02:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0DDD04BA2E28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0DDD04BA2E28 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::102b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792573377; cv=none; b=QWMMIiglLo1TfFMS+zcaw/gMxvgOWZKhPYGKnBeaWyYvDfT8C6aaJ14cizbsWxJQIv2acXCcValmiqfvQ5S9Q/LQlwgdQCm1718TI6QB8dtgQtT6JLKRIyq0mDooZ+4AXLruKuPX4lIr8u7KXK1EZpqlWNU/+bifFQUQJc89ZIE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792573377; c=relaxed/simple; bh=A8wgAsZCAJHWlSKRW2xZui5Aad5XDu6Uvj2XUgfbYzE=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=bCmnzH17dwYXwiGrU6+BCyB2E5PoDrwSgV5dV8enc0dWzJzwNbUxCUecBMNb6ds34/BHI7uYenHqOkWGja/vvu3G1U2EqDN4mSfO2Q6eXWIfO/F6LUDYbYABjpH2mnnxYXyZfAV5MM+Fo8GSjokrXvcUOwRgOLRJWZ42KbVDfLE= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=Y5Yhhl/V DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0DDD04BA2E28 Received: by mail-pj1-x102b.google.com with SMTP id 98e67ed59e1d1-3acb512a7a0so314317a91.1 for ; Wed, 21 Oct 2026 02:02:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792573376; x=1793178176; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=6xezbCsrV39gNWP1VScJNMCLr7eZYCj3gmffbsZ5w4k=; b=Y5Yhhl/VLY0RvhLwfQzIcCr2t5sDcgPR/QGg7rI0MEJmcgDBy6xhv4ggI8HIoSmx7A VLTrohKdRS9xu8qZrIpslf29IWdGAr7o6VM1v+gQEhKrepcHrELFAcQa6OMGIkzvywb8 upCxyj9BAgwPiwKT4ez1ZJu8UaYLS2FQjci8GUxYZaXaQIfAlNRdxdMrg4Kxkzi/GaGe ZkB9EepGSV0TbSOPDnuLeUf4+GMNin91kEzTytbIcHKfN/8g3MsWQazVbiwNe6gL55vu VFNSRDkTAx5JPOgLnlmi9ZsMie/MD23zXpp1PX9d78mDs4dVxpeoE0BWD+xGqGViXsNr f2bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792573376; x=1793178176; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6xezbCsrV39gNWP1VScJNMCLr7eZYCj3gmffbsZ5w4k=; b=MXwBhFNCx85GB+1vKgMQhBDYZD6lnhsehio3lsUhmwUItOE3vOalmxWdHeHULzDg3F vHZozWbvD/Q5AhdCaE7duY+6JFtpPHK0XP0kE63hLyiP5a+F4gBWRJDLtpb1NQTZP0x6 0FOqdgAPiKssp9cZHG0ObW0ud9nF024V5oN3ge0Ev0aP5/+k8TqzXDoteRtzacuNtdMG A+WXs+JdMbFQ2nu2oBdRWBRU9sZzFHjWQIaSLJwZr173l/hViHCr+UWjBw0OxL8rgiXX 8O51Iz7tYGtokS7jjfKe2rpTnr4J0bFH8K8uLQIzRZdIkn09Hm5VfDkXVRXh4eXJbQOY ghIw== X-Gm-Message-State: AFq9FYJT75EfTQZheB0yqC5ywqw2cuwr8fe1XJrS2Wl+Kgfjv6sC9wl5 pIxb9/iA6Poo2ec/y4vTQtbQEwoZuJ42CRw+LKLlutZZFc+uPXdnLom6 X-Gm-Gg: AYBFou0R6dSBFTg2tPgCBUN/H757Gwdv6o2qwfOj3Ejh9M/L1lfs7T3Yx8AJ8to4JRy GxutEZjdqIIQnxxyicKyoyaD2t/tyidKtn7uyF2Lq5II/t3eY1bZEg2mP39bdgF36GVZUuoUoj5 emG7m9m8HeABrqHmKWJy/OafSjUVeoSsa/2XQPv/JJkYjr2Uy+efOwOB/csvDzBVpL5bPh2DIUW TNJB9Gt4lKrnYw2d2LMrdc13vFsjOQ4yOD4XG7gwkWrQWfkL0D6UBFRpeNUfZkjxZVwcUFZaxsQ 5bIE0fXDeIc0RaCPZQ9cyB8VnXHucIbsYtWvkHMIm4K76K6qx4E9lp5UC2baDh5kClB3FYsdBzj YvrEyAu1ofZV09vOTjLHXDMaZIe2yVH6ylx8b3DxVkTHImI/S+a2FwTJMX3/+/dyBmcyAy7Qhlg fLlp6mgNDwkGcpY+bK3mNxfKMuZOesxgNOLEAQ5PftzyA/3pzG4EtYsRXL6kWH5KQdTccuAKi74 pRdg4wp1ffdeJbFulKTlAKp7GCus5Z01Rc1eVpDDjxjzaznskYHg+yRmvyQwX0qrlkJvxdq9jE/ s55jlNdubHfZ7VD0rw== X-Received: by 2002:a17:90a:ec8c:b0:3a7:bb1d:3688 with SMTP id 98e67ed59e1d1-3ad86c91b1dmr1189251a91.27.1792573375867; Wed, 21 Oct 2026 02:02:55 -0700 (PDT) Received: from dhcp-9-123-1-12.bl1-in.ibm.com ([129.41.58.4]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cd6a859bad0sm568244a12.9.2026.10.21.02.02.53 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 21 Oct 2026 02:02:55 -0700 (PDT) From: Aditya Vidyadhar Kamath To: ulrich.weigand@de.ibm.com, simon.marchi@polymtl.ca, tom@tromey.com Cc: gdb-patches@sourceware.org, Aditya.Kamath1@ibm.com, sangamesh.swamy@in.ibm.com, Aditya Vidyadhar Kamath Subject: [PATCH v2] Fix crash when target-wide-charset doesn't match wchar_t size Date: Wed, 21 Oct 2026 14:31:56 +0530 Message-ID: <20261021090155.28129-2-akamath996@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org From: Aditya Vidyadhar Kamath Tom asked a question [1] which is valid: can setting target-wide-charset to an encoding with the wrong unit size crash GDB? First I compiled gdb/testsuite/gdb.base/wchar.c gcc -g -maix64 -o /tmp/wchar64 gdb/testsuite/gdb.base/wchar.c Then debug with GDB and we get the crash (gdb) b wchar.c:44 (gdb) run (gdb) set target-wide-charset UTF-16 (gdb) print single Fatal signal: Segmentation fault ----- Backtrace ----- This patch checks the width implied by the charset name against wchar_bit in validate(), and gives an error if they differ. Since the set command stores the new value before calling the sfunc, restore the old value when the check fails. With the patch, the same session now gives: (gdb) set target-wide-charset UTF-16 Character set `UTF-16' has a 2-byte character width but `wchar_t' on this target is 4 bytes wide. Use `set target-wide-charset auto' to let GDB choose the correct encoding automatically. (gdb) print single $1 = 48879 L'\xbeef' Add tests to wchar.exp for this. [1]: https://sourceware.org/pipermail/gdb-patches/2026-October/231110.html --- gdb/charset.c | 51 +++++++++++++++++++++++++++++++- gdb/testsuite/gdb.base/wchar.exp | 31 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/gdb/charset.c b/gdb/charset.c index 1b0725b5078..9052f8b98c8 100644 --- a/gdb/charset.c +++ b/gdb/charset.c @@ -256,6 +256,10 @@ show_target_charset_name (struct ui_file *file, int from_tty, } static const char *target_wide_charset_name = "auto"; + +/* Last known-good value of target_wide_charset_name, used to roll back + if a new setting fails validation. */ +static const char *target_wide_charset_name_validated = "auto"; static void show_target_wide_charset_name (struct ui_file *file, int from_tty, @@ -336,6 +340,21 @@ set_be_le_names (struct gdbarch *gdbarch) /* 'Set charset', 'set host-charset', 'set target-charset', 'set target-wide-charset', 'set charset' sfunc's. */ +/* Return the character width in bytes implied by a wide charset name: + 2 for UTF-16/UCS-2, 4 for UTF-32/UCS-4, 0 if unknown. */ + +static int +wide_charset_width (const char *name) +{ + if (strncasecmp (name, "UTF-16", 6) == 0 + || strncasecmp (name, "UCS-2", 5) == 0) + return 2; + if (strncasecmp (name, "UTF-32", 6) == 0 + || strncasecmp (name, "UCS-4", 5) == 0) + return 4; + return 0; +} + static void validate (struct gdbarch *gdbarch) { @@ -346,6 +365,25 @@ validate (struct gdbarch *gdbarch) if (streq (target_wide_cset, "auto")) target_wide_cset = gdbarch_auto_wide_charset (gdbarch); + else + { + /* Reject charsets whose unit size doesn't match wchar_t. + A mismatch (e.g. UTF-16 with a 4-byte wchar_t) makes iconv + consume the wrong number of bytes and can crash GDB. */ + int charset_width = wide_charset_width (target_wide_cset); + if (charset_width != 0) + { + int wchar_bytes = gdbarch_wchar_bit (gdbarch) / 8; + if (charset_width != wchar_bytes) + error (_ ("Character set \"%s\" has a %d-byte character width " + "but \"wchar_t\" on this target is %d bytes wide.\n" + "Use \"%ps\" to let GDB " + "choose the correct encoding automatically."), + target_wide_cset, charset_width, wchar_bytes, + styled_string (command_style.style (), + "set target-wide-charset auto")); + } + } desc = iconv_open (target_wide_cset, host_cset); if (desc == (iconv_t) -1) @@ -395,7 +433,18 @@ static void set_target_wide_charset_sfunc (const char *charset, int from_tty, struct cmd_list_element *c) { - validate (get_current_arch ()); + /* The setshow framework writes the new value before calling us, so + restore the previous setting if validation fails. */ + try + { + validate (get_current_arch ()); + target_wide_charset_name_validated = target_wide_charset_name; + } + catch (const gdb_exception_error &) + { + target_wide_charset_name = target_wide_charset_name_validated; + throw; + } } /* sfunc for the 'show charset' command. */ diff --git a/gdb/testsuite/gdb.base/wchar.exp b/gdb/testsuite/gdb.base/wchar.exp index b02f4a78336..7a9b4612f9f 100644 --- a/gdb/testsuite/gdb.base/wchar.exp +++ b/gdb/testsuite/gdb.base/wchar.exp @@ -75,3 +75,34 @@ gdb_test "printf \"%ls\\n\", 0" "\\(null\\)" # From PR exp/33124 - a bug when converting escapes. set wbs {L'\\'} gdb_test "print $wbs" " = $decimal [string_to_regexp $wbs]" + +# A wide charset whose unit size doesn't match wchar_t must be rejected, +# otherwise printing wide chars can crash GDB. +# Use the encoding GDB picks for "auto" as the good one. +set good_cs "" +gdb_test_multiple "show target-wide-charset" "" { + -re "currently (UTF-\[0-9\]+).*$gdb_prompt $" { + set good_cs $expect_out(1,string) + } +} +if { $good_cs == "UTF-16" } { + set bad_cs UTF-32 +} elseif { $good_cs == "UTF-32" } { + set bad_cs UTF-16 +} else { + return +} + +gdb_test "set target-wide-charset $bad_cs" \ + "Character set \"$bad_cs\" has a .-byte character width.*" \ + "reject target-wide-charset $bad_cs" + +# The rejected setting must not stick. +gdb_test "print single" "= 48879 L'\\\\xbeef'" \ + "print wchar_t after rejected target-wide-charset" + +gdb_test_no_output "set target-wide-charset $good_cs" \ + "accept target-wide-charset $good_cs" + +gdb_test "print single" "= 48879 L'\\\\xbeef'" \ + "print wchar_t with explicit target-wide-charset" -- 2.51.2