From: "Pierre Muller" <pierre.muller@ics-cnrs.unistra.fr>
To: "'Pedro Alves'" <palves@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: [RFA] gdbserver/win32-low.c: Check Read/WriteProcessMemory return value (followup to [RFA] windows-nat.c: Handle ERROR_PARTIAL_COPY in windows_xfer_memory function)
Date: Mon, 02 Sep 2013 13:38:00 -0000 [thread overview]
Message-ID: <000301cea7e1$b0e91ab0$12bb5010$@muller@ics-cnrs.unistra.fr> (raw)
In-Reply-To: <52249053.6050103@redhat.com>
> >>> This is not compatible with returning information that only part of
the
> >>> request length
> >>> was read/written.
> >>
> >> Well, we could just change that interface to make it possible...
> >>
> >> The thing I don't like with doing this only on the native
> >> side, is that we're trying to get to a point where we
> >> can share the target backends between GDB and gdbserver:
> >
> > Well, when you look at the code inside child_xfer_memory,
> > you can notice that the return value of ReadProcessMemory or
> > WriteProcessMemory
> > is discarded, which means that it does behave more or less like the
> > new windows-nat.c code (at least in case of ERROR_PARTIAL_COPY)
> > for other errors, it might also return garbage...
> > anyhow, the calling code compares the returned value to the requested
> length
> > (LEN value)
>
> That's brittle...
>
> > so that the risk of generating a successful read_memory despite a
failure
> > of ReadProcessMemory function is small... (the uninitialized variable
done
> > would need to return the value LEN..)
> > It could of course still happen theoretically...
>
> This is really no argument for not fixing gdbserver... In fact,
> it's an argument _for_ fixing it.
What about this patch,
it still does not allow to really return the number of bytes read or
written,
but at least it checks correctly if the API calls succeeded.
Pierre Muller
2013-09-02 Pierre Muller <muller@sourceware.org>
* win32-low.c (child_xfer_memory): Check if ReadProcessMemory
or WriteProcessMemory complete successfully and handle
ERROR_PARTIAL_COPY error.
Index: src/gdb/gdbserver/win32-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/win32-low.c,v
retrieving revision 1.66
diff -u -r1.66 win32-low.c
--- src/gdb/gdbserver/win32-low.c 2 Jul 2013 11:59:24 -0000 1.66
+++ src/gdb/gdbserver/win32-low.c 2 Sep 2013 13:31:31 -0000
@@ -278,21 +278,35 @@
child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
int write, struct target_ops *target)
{
- SIZE_T done;
+ BOOL success;
+ SIZE_T done = 0;
+ DWORD lasterror = 0;
uintptr_t addr = (uintptr_t) memaddr;
if (write)
{
- WriteProcessMemory (current_process_handle, (LPVOID) addr,
- (LPCVOID) our, len, &done);
+ success = WriteProcessMemory (current_process_handle, (LPVOID) addr,
+ (LPCVOID) our, len, &done);
+ if (!success)
+ lasterror = GetLastError ();
FlushInstructionCache (current_process_handle, (LPCVOID) addr, len);
}
else
{
- ReadProcessMemory (current_process_handle, (LPCVOID) addr, (LPVOID)
our,
- len, &done);
+ success = ReadProcessMemory (current_process_handle, (LPCVOID) addr,
+ (LPVOID) our, len, &done);
+ if (!success)
+ lasterror = GetLastError ();
+ }
+ if (success)
+ return done;
+ else
+ {
+ if (lasterror == ERROR_PARTIAL_COPY && done > 0)
+ return done;
+ else
+ return -1;
}
- return done;
}
/* Clear out any old thread list and reinitialize it to a pristine
next prev parent reply other threads:[~2013-09-02 13:38 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <5223bb46.c6c0420a.5a41.008dSMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-02 12:34 ` [RFA] windows-nat.c: Handle ERROR_PARTIAL_COPY in windows_xfer_memory function Pedro Alves
2013-09-02 12:48 ` Pierre Muller
2013-09-02 12:50 ` Pedro Alves
2013-09-02 13:05 ` Pierre Muller
2013-09-02 13:19 ` Pedro Alves
2013-09-02 13:38 ` Pierre Muller [this message]
[not found] ` <522494dc.297a420a.6ab0.6047SMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-02 13:50 ` [RFA] gdbserver/win32-low.c: Check Read/WriteProcessMemory return value (followup to [RFA] windows-nat.c: Handle ERROR_PARTIAL_COPY in windows_xfer_memory function) Pedro Alves
2013-09-02 14:01 ` Pierre Muller
[not found] ` <52249a22.42bd420a.28f1.722cSMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-02 14:09 ` Pedro Alves
2013-09-02 14:18 ` Pierre Muller
[not found] ` <52249e27.e8a4420a.4293.ffff89a0SMTPIN_ADDED_BROKEN@mx.google.com>
2013-09-02 14:19 ` Pedro Alves
2013-09-02 14:25 ` [RFA-v2] " Pierre Muller
2013-09-02 14:29 ` Pedro Alves
2013-09-02 14:35 ` Pierre Muller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='000301cea7e1$b0e91ab0$12bb5010$@muller@ics-cnrs.unistra.fr' \
--to=pierre.muller@ics-cnrs.unistra.fr \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox