This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] FIX EOF detection in PT_IO-based to_xfer_partial implementation.


Committed.

>From 493443a47f514251f12e08223b2c56f0fed69015 Mon Sep 17 00:00:00 2001
From: Mark Kettenis <kettenis@gnu.org>
Date: Wed, 12 Feb 2014 14:51:19 +0100
Subject: [PATCH] FIX EOF detection in PT_IO-based to_xfer_partial
 implementation.

At least on OpenBSD PT_IO/PIOD_READ_AUXV can return sucessfully without
transferring any bytes.  Arguably a kernel bug, but interpreting this as EOF
seems sensible.

gdb/ChangeLog:

        * inf-ptrace.c (inf_ptrace_xfer_partial): Return TARGET_XFER_EOF
        if a PT_IO ptrace request returns sucessfully but indicates that 0
        bytes were transferred.
---
 gdb/ChangeLog    | 6 ++++++
 gdb/inf-ptrace.c | 8 ++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 41397b2..8d91946 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-12  Mark Kettenis  <kettenis@gnu.org>
+
+	* inf-ptrace.c (inf_ptrace_xfer_partial): Return TARGET_XFER_EOF
+	if a PT_IO ptrace request returns sucessfully but indicates that 0
+	bytes were transferred.
+
 2014-02-12  Pedro Alves  <palves@redhat.com>
 	    Kevin Buettner <kevinb@redhat.com>
 
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 1ab6b0b..1269d24 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -489,9 +489,9 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
 	errno = 0;
 	if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
 	  {
-	    *xfered_len = piod.piod_len;
 	    /* Return the actual number of bytes read or written.  */
-	    return TARGET_XFER_OK;
+	    *xfered_len = piod.piod_len;
+	    return (piod.piod_len == 0) ? TARGET_XFER_EOF : TARGET_XFER_OK;
 	  }
 	/* If the PT_IO request is somehow not supported, fallback on
 	   using PT_WRITE_D/PT_READ_D.  Otherwise we will return zero
@@ -595,9 +595,9 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
 	errno = 0;
 	if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
 	  {
-	    *xfered_len = piod.piod_len;
 	    /* Return the actual number of bytes read or written.  */
-	    return TARGET_XFER_OK;
+	    *xfered_len = piod.piod_len;
+	    return (piod.piod_len == 0) ? TARGET_XFER_EOF : TARGET_XFER_OK;
 	  }
       }
 #endif
-- 
1.8.5.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]