]> granicus.if.org Git - strace/blobdiff - execve.c
Robustify mpers.awk against invalid input
[strace] / execve.c
index 3f49e20fe3c972792f8970a50021fd4f08e8fe45..a8f53f608031ee6d27cf307b87dbf48692e95f4a 100644 (file)
--- a/execve.c
+++ b/execve.c
@@ -40,29 +40,45 @@ printargc(const char *fmt, struct tcb *tcp, long addr)
        tprintf(fmt, count, count == 1 ? "" : "s");
 }
 
-SYS_FUNC(execve)
+static void
+decode_execve(struct tcb *tcp, const unsigned int index)
 {
-       printpath(tcp, tcp->u_arg[0]);
+       printpath(tcp, tcp->u_arg[index + 0]);
        tprints(", ");
 
-       if (!tcp->u_arg[1] || !verbose(tcp))
-               printaddr(tcp->u_arg[1]);
+       if (!tcp->u_arg[index + 1] || !verbose(tcp))
+               printaddr(tcp->u_arg[index + 1]);
        else {
                tprints("[");
-               printargv(tcp, tcp->u_arg[1]);
+               printargv(tcp, tcp->u_arg[index + 1]);
                tprints("]");
        }
        tprints(", ");
 
-       if (!tcp->u_arg[2] || !verbose(tcp))
-               printaddr(tcp->u_arg[2]);
+       if (!tcp->u_arg[index + 2] || !verbose(tcp))
+               printaddr(tcp->u_arg[index + 2]);
        else if (abbrev(tcp))
-               printargc("[/* %d var%s */]", tcp, tcp->u_arg[2]);
+               printargc("[/* %d var%s */]", tcp, tcp->u_arg[index + 2]);
        else {
                tprints("[");
-               printargv(tcp, tcp->u_arg[2]);
+               printargv(tcp, tcp->u_arg[index + 2]);
                tprints("]");
        }
+}
+
+SYS_FUNC(execve)
+{
+       decode_execve(tcp, 0);
+
+       return RVAL_DECODED;
+}
+
+SYS_FUNC(execveat)
+{
+       print_dirfd(tcp, tcp->u_arg[0]);
+       decode_execve(tcp, 1);
+       tprints(", ");
+       printflags(at_flags, tcp->u_arg[4], "AT_???");
 
        return RVAL_DECODED;
 }