]> granicus.if.org Git - strace/blobdiff - execve.c
Robustify mpers.awk against invalid input
[strace] / execve.c
index 2e819cf76db11089cda85607fcf8c084fd5ecc73..a8f53f608031ee6d27cf307b87dbf48692e95f4a 100644 (file)
--- a/execve.c
+++ b/execve.c
@@ -32,37 +32,53 @@ static void
 printargc(const char *fmt, struct tcb *tcp, long addr)
 {
        int count;
-       char *cp;
+       char *cp = NULL;
 
-       for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
-               addr += sizeof(char *);
+       for (count = 0; !umoven(tcp, addr, current_wordsize, &cp) && cp; count++) {
+               addr += current_wordsize;
        }
        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;
 }