From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23652 invoked by alias); 11 Aug 2009 20:03:55 -0000 Received: (qmail 23464 invoked by uid 22791); 11 Aug 2009 20:03:54 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_14,J_CHICKENPOX_55,RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: sourceware.org Received: from hel.is.scarlet.be (HELO hel.is.scarlet.be) (193.74.71.26) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 11 Aug 2009 20:03:46 +0000 Received: from [172.17.1.10] (ip-81-11-239-71.dsl.scarlet.be [81.11.239.71]) by hel.is.scarlet.be (8.14.2/8.14.2) with ESMTP id n7BK3gh2013549; Tue, 11 Aug 2009 22:03:42 +0200 Subject: Ping (Re: Patch : gdbserver get_image_name on CE) From: Danny Backx Reply-To: danny.backx@scarlet.be To: gdb-patches Content-Type: multipart/mixed; boundary="=-2GPM8Yw/zcBbAd9qPiYe" Date: Tue, 11 Aug 2009 20:36:00 -0000 Message-Id: <1250021102.5537.1123.camel@pavilion> Mime-Version: 1.0 X-DCC-scarlet.be-Metrics: hel 20001; Body=2 Fuz1=2 Fuz2=2 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-08/txt/msg00164.txt.bz2 --=-2GPM8Yw/zcBbAd9qPiYe Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 1239 Ping again. On Mon, 2009-07-27, Danny Backx wrote: > Ping ? > > On Wed, 2009-07-08 at 13:33 +0200, Danny Backx wrote: > > On Wed, 2009-07-08 at 11:55 +0200, Danny Backx wrote: > > > It looks like ReadProcessMemory refuses to read from an address > beyond > > > the pointer, but it does work from the pointer itself. > > > > > > I've changed my code such that it loops, and tries to read a > bigger > > > chunk of memory at each iteration. > > > > > > I'm not bothering you with that code or its debug output right > now. > > > > > > In that way, the code appears to work, and it complies with the > > > documentation saying not to read more than required. > > > > > > Shall I submit a new patch based on this ? > > > > > > Danny > > > > Ignore that question, here's the patch. > > > > Please comment on its contents and on my adherence to the coding > > standards. Apologies for that, I seem to have a hard time learning > that. > > > > Danny > > > > 2009-07-08 Danny Backx > > > > * win32-low.c (get_image_name) : Work around ReadProcessMemory > > failure when reading at arbitrary addresses. -- Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info --=-2GPM8Yw/zcBbAd9qPiYe Content-Disposition: attachment; filename="x" Content-Type: text/x-patch; name="x"; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-length: 1629 Index: win32-low.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/win32-low.c,v retrieving revision 1.38 diff -u -r1.38 win32-low.c --- win32-low.c 4 Jul 2009 18:13:28 -0000 1.38 +++ win32-low.c 11 Aug 2009 20:01:19 -0000 @@ -922,7 +922,6 @@ DWORD size = unicode ? sizeof (WCHAR) : sizeof (char); char *address_ptr; int len = 0; - char b[2]; DWORD done; /* Attempt to read the name of the dll that was detected. @@ -945,21 +944,23 @@ return NULL; #endif - /* Find the length of the string */ - while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done) - && (b[0] != 0 || b[size - 1] != 0) && done == size) - continue; + /* ReadProcessMemory sometimes fails when reading a (w)char at a time, but + * we can't just read MAX_PATH (w)chars either : msdn says not to cross the + * boundary into inaccessible areas. + * So we loop, reading more characters each time, until we find the NULL. + */ + WCHAR *wbuf = alloca ((MAX_PATH + 1) * size); + while (1) + { + ReadProcessMemory (h, address_ptr, wbuf, ++len * size, &done); + if (wbuf[len - 1] == 0) + break; + } if (!unicode) ReadProcessMemory (h, address_ptr, buf, len, &done); else - { - WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR)); - ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR), - &done); - - WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0); - } + WideCharToMultiByte (CP_ACP, 0, wbuf, len, buf, len, 0, 0); return buf; } --=-2GPM8Yw/zcBbAd9qPiYe--