FIX EOF detection in PT_IO-based to_xfer_partial implementation.
authorMark Kettenis <kettenis@gnu.org>
Wed, 12 Feb 2014 13:51:19 +0000 (14:51 +0100)
committerMark Kettenis <kettenis@gnu.org>
Wed, 12 Feb 2014 13:51:19 +0000 (14:51 +0100)
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
gdb/inf-ptrace.c

index 41397b21e63095ae708e064cfa8c43aa69a94f14..8d919468247572ba5700f256241348fd51388af4 100644 (file)
@@ -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>
 
index 1ab6b0beee29074947af26bcc4c2880c16ba013a..1269d24b657430af712c77eddacf8ee51bb98e5b 100644 (file)
@@ -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