This enables printing of iovec arrays even in case of failed syscall
(failed syscall doesn't mean that iovec itself is inaccessible and
useless). One caveat here is that we should explicitly provide proper
IOV_DECODE_* value based on syserror value in case printing is performed
on exiting; we can't simply override it to IOV_DECODE_ADDR on exiting
when syserror is up, since this may be called by code which tries to
print iovec containing local data, which should be perfectly accessible
(on the other hand, there are no cases of such behaviour at the moment).

* io.c (tprint_iov_upto): provide umoven_or_printaddr_ignore_syserror
instead of umoven_or_printaddr as umoven_func parameter.
(SYS_FUNC(readv)): Provide decode_iov parameter value based on
syserror(tcp) value.
(do_preadv): Likewise.
* scsi.c: (print_sg_io_v3_res): Likewise.
(print_sg_io_v4_res): Likewise.
---
 io.c   |    8 +++++---
 scsi.c |    5 +++--
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/io.c b/io.c
index 8a93cb8..fe865a5 100644
--- a/io.c
+++ b/io.c
@@ -119,7 +119,7 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, 
unsigned long addr,
                { .decode_iov = decode_iov, .data_size = data_size };
 
        print_array(tcp, addr, len, iov, current_wordsize * 2,
-                   umoven_or_printaddr, print_iovec, &config);
+                   umoven_or_printaddr_ignore_syserror, print_iovec, &config);
 }
 
 void
@@ -136,6 +136,7 @@ SYS_FUNC(readv)
                tprints(", ");
        } else {
                tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
+                               syserror(tcp) ? IOV_DECODE_ADDR :
                                IOV_DECODE_STR, tcp->u_rval);
                tprintf(", %lu", tcp->u_arg[2]);
        }
@@ -226,8 +227,9 @@ do_preadv(struct tcb *tcp, const int flags_arg)
                printfd(tcp, tcp->u_arg[0]);
                tprints(", ");
        } else {
-               tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1], 
IOV_DECODE_STR,
-                               tcp->u_rval);
+               tprint_iov_upto(tcp, tcp->u_arg[2], tcp->u_arg[1],
+                               syserror(tcp) ? IOV_DECODE_ADDR :
+                               IOV_DECODE_STR, tcp->u_rval);
                tprintf(", %lu, ", tcp->u_arg[2]);
                print_lld_from_low_high_val(tcp, 3);
                if (flags_arg >= 0) {
diff --git a/scsi.c b/scsi.c
index 979c342..b3c6245 100644
--- a/scsi.c
+++ b/scsi.c
@@ -114,8 +114,8 @@ print_sg_io_v3_res(struct tcb *tcp, const long arg)
                if (sg_io.iovec_count)
                        tprint_iov_upto(tcp, sg_io.iovec_count,
                                        (unsigned long) sg_io.dxferp,
-                                       IOV_DECODE_STR,
-                                       din_len);
+                                       syserror(tcp) ? IOV_DECODE_ADDR :
+                                       IOV_DECODE_STR, din_len);
                else
                        print_sg_io_buffer(tcp, (unsigned long) sg_io.dxferp,
                                           din_len);
@@ -190,6 +190,7 @@ print_sg_io_v4_res(struct tcb *tcp, const long arg)
        tprintf(", din[%u]=", din_len);
        if (sg_io.din_iovec_count)
                tprint_iov_upto(tcp, sg_io.din_iovec_count, sg_io.din_xferp,
+                               syserror(tcp) ? IOV_DECODE_ADDR :
                                IOV_DECODE_STR, din_len);
        else
                print_sg_io_buffer(tcp, sg_io.din_xferp, din_len);
-- 
1.7.10.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to