diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 1e15f77c4c1..54348e5a732 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2013-09-02 Pierre Muller + + * win32-low.c (child_xfer_memory): Check if ReadProcessMemory + or WriteProcessMemory complete successfully and handle + ERROR_PARTIAL_COPY error. + 2013-09-02 Pedro Alves * server.c (gdb_read_memory): Return -1 on traceframe memory read diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 4e87a43a4c5..549c29f0825 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -278,21 +278,30 @@ static int 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 (); } - return done; + if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0) + return done; + else + return success ? done : -1; } /* Clear out any old thread list and reinitialize it to a pristine