From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id qN5TB7x1918eEwAAWB0awg (envelope-from ) for ; Thu, 07 Jan 2021 15:57:32 -0500 Received: by simark.ca (Postfix, from userid 112) id 1C0441E965; Thu, 7 Jan 2021 15:57:32 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_NONE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 10FC41E590 for ; Thu, 7 Jan 2021 15:57:31 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B5C59386F457; Thu, 7 Jan 2021 20:57:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B5C59386F457 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1610053050; bh=jC6MW4QRzXxEuxEpAnm/LwrLhUo+p/tqj4u1mIQSqrw=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=UnAriAFKycWBY2pnR1tAuKguAepPhS59nxuZgwnBkxOYEDzrkZOeJ7zNZqm/TV3vt 0gkAgmaqRwILM5Qc8PsJmg2WDC2EDYhDBwmOSwiG5cJsy9BAk+L0sP39FnS3vKGBY/ nnaOWcKuwl3eX3F0NkEvGUmAS0OkcNp6u6yjhfpM= Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id 87671386F44F for ; Thu, 7 Jan 2021 20:57:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 87671386F44F X-ASG-Debug-ID: 1610053046-0c856e6cd56447d0001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id iSNsUSIoWgl8MklM (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 07 Jan 2021 15:57:26 -0500 (EST) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from epycamd.internal.efficios.com (192-222-181-218.qc.cable.ebox.net [192.222.181.218]) by smtp.ebox.ca (Postfix) with ESMTP id 0A3C5441B21; Thu, 7 Jan 2021 15:57:26 -0500 (EST) X-Barracuda-RBL-IP: 192.222.181.218 X-Barracuda-Effective-Source-IP: 192-222-181-218.qc.cable.ebox.net[192.222.181.218] X-Barracuda-Apparent-Source-IP: 192.222.181.218 To: gdb-patches@sourceware.org Subject: [PATCH] gdb: check for empty strings in get_standard_cache_dir/get_standard_config_dir Date: Thu, 7 Jan 2021 15:57:25 -0500 X-ASG-Orig-Subj: [PATCH] gdb: check for empty strings in get_standard_cache_dir/get_standard_config_dir Message-Id: <20210107205725.2010353-1-simon.marchi@efficios.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1610053046 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-Scan-Msg-Size: 7483 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests=BSF_RULE7568M, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.87078 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP 0.50 BSF_RULE7568M Custom Rule 7568M X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Simon Marchi via Gdb-patches Reply-To: Simon Marchi Cc: Simon Marchi , sourcewarebugz@kyber.fi Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" As reported in PR 27157, if some environment variables read at startup by GDB are defined but empty, we hit the assert in gdb_abspath: $ XDG_CACHE_HOME= ./gdb -nx --data-directory=data-directory -q AddressSanitizer:DEADLYSIGNAL ================================================================= ==2007040==ERROR: AddressSanitizer: SEGV on unknown address 0x0000000001b0 (pc 0x5639d4aa4127 bp 0x7ffdac232c00 sp 0x7ffdac232bf0 T0) ==2007040==The signal is caused by a READ memory access. ==2007040==Hint: address points to the zero page. #0 0x5639d4aa4126 in target_stack::top() const /home/smarchi/src/binutils-gdb/gdb/target.h:1334 #1 0x5639d4aa41f1 in inferior::top_target() /home/smarchi/src/binutils-gdb/gdb/inferior.h:369 #2 0x5639d4a70b1f in current_top_target() /home/smarchi/src/binutils-gdb/gdb/target.c:120 #3 0x5639d4b00591 in gdb_readline_wrapper_cleanup::gdb_readline_wrapper_cleanup() /home/smarchi/src/binutils-gdb/gdb/top.c:1046 #4 0x5639d4afab31 in gdb_readline_wrapper(char const*) /home/smarchi/src/binutils-gdb/gdb/top.c:1104 #5 0x5639d4ccce2c in defaulted_query /home/smarchi/src/binutils-gdb/gdb/utils.c:893 #6 0x5639d4ccd6af in query(char const*, ...) /home/smarchi/src/binutils-gdb/gdb/utils.c:985 #7 0x5639d4ccaec1 in internal_vproblem /home/smarchi/src/binutils-gdb/gdb/utils.c:373 #8 0x5639d4ccb3d1 in internal_verror(char const*, int, char const*, __va_list_tag*) /home/smarchi/src/binutils-gdb/gdb/utils.c:439 #9 0x5639d5151a92 in internal_error(char const*, int, char const*, ...) /home/smarchi/src/binutils-gdb/gdbsupport/errors.cc:55 #10 0x5639d5162ab4 in gdb_abspath(char const*) /home/smarchi/src/binutils-gdb/gdbsupport/pathstuff.cc:132 #11 0x5639d5162fac in get_standard_cache_dir[abi:cxx11]() /home/smarchi/src/binutils-gdb/gdbsupport/pathstuff.cc:228 #12 0x5639d3e76a81 in _initialize_index_cache() /home/smarchi/src/binutils-gdb/gdb/dwarf2/index-cache.c:325 #13 0x5639d4dbbe92 in initialize_all_files() /home/smarchi/build/binutils-gdb/gdb/init.c:321 #14 0x5639d4b00259 in gdb_init(char*) /home/smarchi/src/binutils-gdb/gdb/top.c:2344 #15 0x5639d4440715 in captured_main_1 /home/smarchi/src/binutils-gdb/gdb/main.c:950 #16 0x5639d444252e in captured_main /home/smarchi/src/binutils-gdb/gdb/main.c:1229 #17 0x5639d44425cf in gdb_main(captured_main_args*) /home/smarchi/src/binutils-gdb/gdb/main.c:1254 #18 0x5639d3923371 in main /home/smarchi/src/binutils-gdb/gdb/gdb.c:32 #19 0x7fa002d3f0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) #20 0x5639d392314d in _start (/home/smarchi/build/binutils-gdb/gdb/gdb+0x4d414d) gdb_abspath doesn't handle empty strings, so handle this case in the callers. If a variable is defined but empty, I think it's reasonable in this case to just ignore it, as if it was not defined. Note that this sometimes also lead to a segfault, because the failed assertion happens very early during startup, before things are fully initialized. gdbsupport/ChangeLog: PR gdb/27157 * pathstuff.cc (get_standard_cache_dir, get_standard_config_dir, find_gdb_home_config_file): Add empty string check. gdb/testsuite/ChangeLog: PR gdb/27157 * gdb.base/empty-host-env-vars.exp: New test. Change-Id: I8654d8e97e74e1dff6d308c111ae4b1bbf07bef9 --- .../gdb.base/empty-host-env-vars.exp | 28 +++++++++++++++++++ gdbsupport/pathstuff.cc | 14 +++++----- 2 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.base/empty-host-env-vars.exp diff --git a/gdb/testsuite/gdb.base/empty-host-env-vars.exp b/gdb/testsuite/gdb.base/empty-host-env-vars.exp new file mode 100644 index 00000000000..54cd4b92ccf --- /dev/null +++ b/gdb/testsuite/gdb.base/empty-host-env-vars.exp @@ -0,0 +1,28 @@ +# Copyright 2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# GDB reads some environment variables on startup, make sure it behaves +# correctly if these variables are defined but empty. + +foreach_with_prefix env_var_name {HOME XDG_CACHE_HOME LOCALAPPDATA XDG_CONFIG_HOME } { + # Restore the original state of the environment variable. + save_vars env($env_var_name) { + set env($env_var_name) {} + clean_restart + + # Check that GDB is really started and working. + gdb_test "print 1" " = 1" + } +} diff --git a/gdbsupport/pathstuff.cc b/gdbsupport/pathstuff.cc index 51ab8c651b2..ad13900819e 100644 --- a/gdbsupport/pathstuff.cc +++ b/gdbsupport/pathstuff.cc @@ -222,7 +222,7 @@ get_standard_cache_dir () #ifndef __APPLE__ const char *xdg_cache_home = getenv ("XDG_CACHE_HOME"); - if (xdg_cache_home != NULL) + if (xdg_cache_home != NULL && xdg_cache_home[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (xdg_cache_home)); @@ -231,7 +231,7 @@ get_standard_cache_dir () #endif const char *home = getenv ("HOME"); - if (home != NULL) + if (home != NULL && home[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (home)); @@ -240,14 +240,14 @@ get_standard_cache_dir () #ifdef WIN32 const char *win_home = getenv ("LOCALAPPDATA"); - if (win_home != NULL) + if (win_home != NULL && win_home[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (win_home)); return string_printf ("%s/gdb", abs.get ()); } #endif - + return {}; } @@ -289,7 +289,7 @@ get_standard_config_dir () #ifndef __APPLE__ const char *xdg_config_home = getenv ("XDG_CONFIG_HOME"); - if (xdg_config_home != NULL) + if (xdg_config_home != NULL && xdg_config_home[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (xdg_config_home)); @@ -298,7 +298,7 @@ get_standard_config_dir () #endif const char *home = getenv ("HOME"); - if (home != NULL) + if (home != NULL && home[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (home)); @@ -340,7 +340,7 @@ find_gdb_home_config_file (const char *name, struct stat *buf) } const char *homedir = getenv ("HOME"); - if (homedir != nullptr) + if (homedir != nullptr && homedir[0] != '\0') { /* Make sure the path is absolute and tilde-expanded. */ gdb::unique_xmalloc_ptr abs (gdb_abspath (homedir)); -- 2.29.2