]> granicus.if.org Git - strace/blobdiff - print_time.c
Robustify mpers.awk against invalid input
[strace] / print_time.c
index f9caf26a8b31f048424067edbcd0be05e4607c07..4d387669df8a6669786c1d7bab21ed05db0b2527 100644 (file)
@@ -56,6 +56,24 @@ MPERS_PRINTER_DECL(void, print_timespec)(struct tcb *tcp, const long addr)
        print_timespec_t(&t);
 }
 
+MPERS_PRINTER_DECL(const char *, sprint_timespec)(struct tcb *tcp, const long addr)
+{
+       timespec_t t;
+       static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
+
+       if (!addr) {
+               strcpy(buf, "NULL");
+       } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
+                  umove(tcp, addr, &t)) {
+               snprintf(buf, sizeof(buf), "%#lx", addr);
+       } else {
+               snprintf(buf, sizeof(buf), time_fmt,
+                        (intmax_t) t.tv_sec, (intmax_t) t.tv_nsec);
+       }
+
+       return buf;
+}
+
 MPERS_PRINTER_DECL(void, print_timespec_utime_pair)(struct tcb *tcp, const long addr)
 {
        timespec_t t[2];
@@ -84,6 +102,16 @@ MPERS_PRINTER_DECL(void, print_itimerspec)(struct tcb *tcp, const long addr)
        tprints("}");
 }
 
+MPERS_PRINTER_DECL(void, print_timeval)(struct tcb *tcp, const long addr)
+{
+       timeval_t t;
+
+       if (umove_or_printaddr(tcp, addr, &t))
+               return;
+
+       print_timeval_t(&t);
+}
+
 MPERS_PRINTER_DECL(void, print_timeval_pair)(struct tcb *tcp, const long addr)
 {
        timeval_t t[2];
@@ -98,6 +126,24 @@ MPERS_PRINTER_DECL(void, print_timeval_pair)(struct tcb *tcp, const long addr)
        tprints("]");
 }
 
+MPERS_PRINTER_DECL(const char *, sprint_timeval)(struct tcb *tcp, const long addr)
+{
+       timeval_t t;
+       static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
+
+       if (!addr) {
+               strcpy(buf, "NULL");
+       } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
+                  umove(tcp, addr, &t)) {
+               snprintf(buf, sizeof(buf), "%#lx", addr);
+       } else {
+               snprintf(buf, sizeof(buf), time_fmt,
+                        (intmax_t) t.tv_sec, (intmax_t) t.tv_usec);
+       }
+
+       return buf;
+}
+
 MPERS_PRINTER_DECL(void, print_itimerval)(struct tcb *tcp, const long addr)
 {
        timeval_t t[2];
@@ -136,6 +182,32 @@ print_timeval32_t(const timeval32_t *t)
        tprintf(time_fmt, (intmax_t) t->tv_sec, (intmax_t) t->tv_usec);
 }
 
+void
+print_timeval32(struct tcb *tcp, const long addr)
+{
+       timeval32_t t;
+
+       if (umove_or_printaddr(tcp, addr, &t))
+               return;
+
+       print_timeval32_t(&t);
+}
+
+void
+print_timeval32_pair(struct tcb *tcp, const long addr)
+{
+       timeval32_t t[2];
+
+       if (umove_or_printaddr(tcp, addr, &t))
+               return;
+
+       tprints("[");
+       print_timeval32_t(&t[0]);
+       tprints(", ");
+       print_timeval32_t(&t[1]);
+       tprints("]");
+}
+
 void
 print_itimerval32(struct tcb *tcp, const long addr)
 {
@@ -151,4 +223,23 @@ print_itimerval32(struct tcb *tcp, const long addr)
        tprints("}");
 }
 
+const char *
+sprint_timeval32(struct tcb *tcp, const long addr)
+{
+       timeval32_t t;
+       static char buf[sizeof(time_fmt) + 3 * sizeof(t)];
+
+       if (!addr) {
+               strcpy(buf, "NULL");
+       } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
+                  umove(tcp, addr, &t)) {
+               snprintf(buf, sizeof(buf), "%#lx", addr);
+       } else {
+               snprintf(buf, sizeof(buf), time_fmt,
+                        (intmax_t) t.tv_sec, (intmax_t) t.tv_usec);
+       }
+
+       return buf;
+}
+
 #endif /* ALPHA */