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.
This commit is contained in:
Mark Kettenis
2014-02-12 14:51:19 +01:00
parent 706d088346
commit 493443a47f
2 changed files with 10 additions and 4 deletions

View 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