From 0837c976950e347cc48a1c55c6c8d60fc710c168 Mon Sep 17 00:00:00 2001 From: Yuanhui Zhang Date: Mon, 24 Feb 2014 15:22:10 +0800 Subject: [PATCH] Fix a GDB assert failure on windows A GDB internal error is found on native mingw32 target. (gdb) run ../../binutils-gdb/gdb/target.c:1483: internal-error: target_xfer_partial: Assertion `*xfered_len > 0' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) This error was introduced by the following snippet in commit 9b409511d07fe375284701af34909fb539029caf > @@ -2536,27 +2538,30 @@ windows_xfer_shared_libraries (struct target_ops *ops, > } > > obstack_free (&obstack, NULL); > - return len; > + *xfered_len = (ULONGEST) len; > + return TARGET_XFER_OK; > } In the original code, len is returned, which could be 0, but after that commit, only TARGET_XFER_OK is returned, which is wrong. If len is 0, TARGET_XFER_EOF should be returned. (it is 0 in enum target_xfer_status declaration). gdb: 2014-02-24 Yuanhui Zhang * windows-nat.c (windows_xfer_shared_libraries): Return TARGET_XFER_EOF if LEN is zero to fix an assert failure when requested object is TARGET_OBJECT_LIBRARIES. --- gdb/ChangeLog | 6 ++++++ gdb/windows-nat.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5fdbf4f314..bc8573c1d0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-02-24 Yuanhui Zhang + + * windows-nat.c (windows_xfer_shared_libraries): Return + TARGET_XFER_EOF if LEN is zero to fix an assert failure when + requested object is TARGET_OBJECT_LIBRARIES. + 2014-02-24 Yao Qi * target.h (enum target_xfer_status) diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 4366aab64b..6c45d0a0a6 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -2501,7 +2501,7 @@ windows_xfer_shared_libraries (struct target_ops *ops, obstack_free (&obstack, NULL); *xfered_len = (ULONGEST) len; - return TARGET_XFER_OK; + return len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF; } static enum target_xfer_status