From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id YTxOHh0T0mr6BRoAWB0awg (envelope-from ) for ; Fri, 16 Oct 2026 08:05:49 -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=PJnBEFTB; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 54BCD1E047; Fri, 16 Oct 2026 08:05:49 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.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,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.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 3A46C1E047 for ; Fri, 16 Oct 2026 08:05:47 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 705504BA2E1F for ; Fri, 16 Oct 2026 12:05:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 705504BA2E1F 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=PJnBEFTB Received: from mail-dy1-x132b.google.com (mail-dy1-x132b.google.com [IPv6:2607:f8b0:4864:20::132b]) by sourceware.org (Postfix) with ESMTPS id 522174BA2E0B for ; Fri, 16 Oct 2026 12:05:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 522174BA2E0B 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 522174BA2E0B Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::132b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792152319; cv=none; b=CWFDG14GLIm20XkT4CjmXMG0ksQtgFTx0t9WT5spOC6IuwRivN0LI7Ay3t+KTrul9RQDP7xaFvJbLP5PF1JNb9ofebonZ9jYvEmqvdMDQPIbJrJDbxrnCvMwplM/uP3UeBJSltf/B+TiINPKZsZyYUirwBLGXrTFkwY/GhbEhKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792152319; c=relaxed/simple; bh=MIqvhWuU2JhnakG9I03yRGlGJTTCWyjhP1yR6mDM8LU=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=g8/bo3L+drDu+hnC3il/AHz7rtJ8CwNDci1WKzkQ0hRREuEmIWJzw+OBC2L34wzEFw56n+ufh2uzvyUIznL/ZNrjQY9i3eeYx96547LdLRrFXcBaW0PN3U3ZLYpZjJDBQgqH2SKuwk4RvIgXpDWj/zbV24OZu2en7VJUkbbXZ6w= 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=PJnBEFTB DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 522174BA2E0B Received: by mail-dy1-x132b.google.com with SMTP id 5a478bee46e88-35a31bb9fb6so124505eec.1 for ; Fri, 16 Oct 2026 05:05:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1792152318; x=1792757118; 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=EfEBkI+W7DCsSmFsNEM2F59yOkWU2sjhLkvAEFyWIj0=; b=PJnBEFTBVNQF/hS5tCh+8sB4N2w3XLqdY2IZWJDXGAXQie1p9l5Mjw589oT+FZRbr1 KiqYS1D+qJ0PfNOokfuhxmN9JlbdqrBHBfxF9597tlkOcrrlGHmZb4RqoF0GbD14eivw xCHWTrdrQROBVH9O3kY5Ns2pgadKQs1YLFk8Gprfwll/MGaRjodtm2tqI9wZRCdQ9BLa ZiEtvCNPNmlMeWAoTBU/9Gbxx+wPmvEx3Q/Tc3iqzCIuflzu6Ct5P0zmczHoVOD0DBPm CnFGvvj7SSgFnfWmrqL5HRyE06i1hk+N1AbtPp8ma4zVsGW0SvAJLyHEJy5pfjGoEy9o bAgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1792152318; x=1792757118; 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=EfEBkI+W7DCsSmFsNEM2F59yOkWU2sjhLkvAEFyWIj0=; b=RcBJP7nJYUTwXQncRbRTZU4TAJH9jiINuSyo6iawlMoC21TgNFCQ3xtaLrE9ItMbWV kNDXRqjZInywUlX4h2nGDjxekIztH93/kK53CIy+bqeWPCrbLQjDd4CAYvry5hFCkiIi 1T3fn4Fn1gffQBEcZwE4BY8BOZrWliSM7P2hyHlE3QhdUotasgl43i3PSTI+O7ZxEtjQ ibb6Oc0UIfgxsZP6fOtzk5O/jCUDAOpC1T0Uc2WbErPuIi4Fr5q8QmCPDsUTAnKy8hoS 82d3p4tlT9UrcZA6jU85lwEftynoKYoE7It8gZvNho+V6FL8zoDiXXJ1R33T9okxhC6w 08Cw== X-Gm-Message-State: AFq9FYKnKyM0kU4714SXW4BrCsW/+1WX+Zdd7UQ4CcVMJiyUPINZMzAU v7ULFyrjBJ6VzBVrhXV0w7VhgmK/pxJCWSBXZFcXFllQ3Pe/FJ9sABigpRvn7ZHO X-Gm-Gg: AYBFou0JLLoRFgY+4Epi4tIYv+zd2xfHsbrpd3UpDgr+QtLIV62oEeU2F9+Ry8IsRxT Ep8iXoCM1ug16TFj6c/l3M/MKhCOMIxtbYpmJxSXq4xDgtCpK3Cr//l0mZ1DjyaY9aliwDVEiwj RM0HWxM24+52nh8sLnUXtEBtNXp87lTvFEqPlodQ3ir2c4snUpc9bAxy3t9avMX9F1hPBDdMh4x dyv/RIz96CNelZGgRhuPqbiJf6zRb/LSU2N1y5kJACga1o70Gdp0jLd3wHx4nKUplOWgkdCWd4G bA5l//u26Uj0qgoAPWIE9U72D4xphD+Q42apBtqg8nBliWtiirhiE8gEaW0UYxaMWnBMlwcdhGq 7pngSBnBnLIaSHJ63XcqnvX9uKv8FTtVJkZGiQVdLJZTCtUkI0ThY5DdYYiJksEX+YPlFNgHYfE GGPFtWAA+2KugLIFrRdpLr6hlM+FtcGiDK3ItaJxEld7QKDfhopQBTkjtDlmU1YRPjsoKPMLcTo UQ3FFYQrEO1Zi8j61wLJqrKFjU= X-Received: by 2002:a05:7300:e9d4:20b0:35b:20d6:8eae with SMTP id 5a478bee46e88-35b20e5d33bmr21193687eec.3.1792152317918; Fri, 16 Oct 2026 05:05:17 -0700 (PDT) Received: from localhost.localdomain ([122.171.17.236]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-360819bc569sm6180041eec.11.2026.10.16.05.05.14 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 16 Oct 2026 05:05:17 -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] Fix crash when target-wide-charset doesn't match wchar_t size Date: Fri, 16 Oct 2026 17:35:03 +0530 Message-ID: <20261016120502.88374-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 | 49 +++++++++++++++++++++++++++++++- gdb/testsuite/gdb.base/wchar.exp | 31 ++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/gdb/charset.c b/gdb/charset.c index 1b0725b5078..9656e31290b 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,23 @@ 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 `set target-wide-charset auto' to let GDB " + "choose the correct encoding automatically."), + target_wide_cset, charset_width, wchar_bytes); + } + } desc = iconv_open (target_wide_cset, host_cset); if (desc == (iconv_t) -1) @@ -395,7 +431,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..baa5c60a31d 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