]> granicus.if.org Git - strace/blobdiff - print_time.c
Robustify mpers.awk against invalid input
[strace] / print_time.c
index 147651996605e2719c5cef35ef264246a9eae31a..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];
@@ -108,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];
@@ -187,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 */