From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 40A52385E003 for ; Tue, 24 Mar 2020 18:33:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 40A52385E003 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.11] (unknown [192.222.164.54]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 85A2A1E5F8; Tue, 24 Mar 2020 14:33:26 -0400 (EDT) Subject: Re: [PATCH] Fix WOW64 process system DLL paths To: Hannes Domani , gdb-patches@sourceware.org References: <20200324171734.3335-1-ssbssa.ref@yahoo.de> <20200324171734.3335-1-ssbssa@yahoo.de> From: Simon Marchi Message-ID: Date: Tue, 24 Mar 2020 14:33:26 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20200324171734.3335-1-ssbssa@yahoo.de> Content-Type: text/plain; charset=utf-8 Content-Language: en-US-large Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-29.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org 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: , X-List-Received-Date: Tue, 24 Mar 2020 18:33:28 -0000 On 2020-03-24 1:17 p.m., Hannes Domani via Gdb-patches wrote: > diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c > index 9c5ea5c046..6f46d3d361 100644 > --- a/gdb/windows-nat.c > +++ b/gdb/windows-nat.c > @@ -1993,6 +1993,21 @@ windows_add_all_dlls (void) > return; > } > > +#ifdef __x86_64__ > + char system_dir[__PMAX]; > + char syswow_dir[__PMAX]; > + size_t system_dir_len = 0; > + size_t syswow_dir_len = 0; > + if (wow64_process) > + { > + GetSystemDirectoryA (system_dir, __PMAX); > + GetSystemWow64DirectoryA (syswow_dir, __PMAX); This functions are documented to possibly fail, so let's check the return value. If there is not imaginable reason why they would fail, then I using an assertion is fine. We should also check that we have passed a large enough buffer. For example: UINT len = GetSystemDirectoryA (system_dir, sizeof (system_dir)); /* Error check. */ gdb_assert (len != 0); /* Check that we have passed a large enough buffer. */ gdb_assert (len < sizeof (system_dir)); > + strcat (system_dir, "\\"); > + strcat (syswow_dir, "\\"); > + system_dir_len = strlen (system_dir); > + syswow_dir_len = strlen (syswow_dir); > + } > +#endif > for (i = 1; i < (int) (cb_needed / sizeof (HMODULE)); i++) > { > MODULEINFO mi; > @@ -2014,6 +2029,19 @@ windows_add_all_dlls (void) > #else > name = dll_name; > #endif > +#ifdef __x86_64__ > + /* Convert the DLL path of WOW64 processes returned by > + GetModuleFileNameEx from the 64bit system directory to the > + 32bit syswow64 directory if necessary. */ > + if (wow64_process > + && strncasecmp (name, system_dir, system_dir_len) == 0 > + && strchr (name + system_dir_len, '\\') == nullptr) > + { > + strcpy (syswow_dir + syswow_dir_len, name + system_dir_len); > + strcpy (name, syswow_dir); > + syswow_dir[syswow_dir_len] = 0; > + } > +#endif Here, I wouldn't mind if you used some std::string a bit more to make the string less error-prone (even if it involves a bit more copying), but it's as you wish. Simon