]> granicus.if.org Git - strace/blobdiff - execve.c
Robustify mpers.awk against invalid input
[strace] / execve.c
index c2f3c0e8e886bb7210fe472e3166908c18d096dd..a8f53f608031ee6d27cf307b87dbf48692e95f4a 100644 (file)
--- a/execve.c
+++ b/execve.c
@@ -32,56 +32,70 @@ 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)
 {
-       if (entering(tcp)) {
-               printpath(tcp, tcp->u_arg[0]);
-               tprints(", ");
+       printpath(tcp, tcp->u_arg[index + 0]);
+       tprints(", ");
 
-               if (!tcp->u_arg[1] || !verbose(tcp))
-                       printaddr(tcp->u_arg[1]);
-               else {
-                       tprints("[");
-                       printargv(tcp, tcp->u_arg[1]);
-                       tprints("]");
-               }
-               tprints(", ");
+       if (!tcp->u_arg[index + 1] || !verbose(tcp))
+               printaddr(tcp->u_arg[index + 1]);
+       else {
+               tprints("[");
+               printargv(tcp, tcp->u_arg[index + 1]);
+               tprints("]");
+       }
+       tprints(", ");
 
-               if (!tcp->u_arg[2] || !verbose(tcp))
-                       printaddr(tcp->u_arg[2]);
-               else if (abbrev(tcp))
-                       printargc("[/* %d var%s */]", tcp, tcp->u_arg[2]);
-               else {
-                       tprints("[");
-                       printargv(tcp, tcp->u_arg[2]);
-                       tprints("]");
-               }
+       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[index + 2]);
+       else {
+               tprints("[");
+               printargv(tcp, tcp->u_arg[index + 2]);
+               tprints("]");
        }
-       return 0;
+}
+
+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;
 }
 
 #if defined(SPARC) || defined(SPARC64)
 SYS_FUNC(execv)
 {
-       if (entering(tcp)) {
-               printpath(tcp, tcp->u_arg[0]);
-               tprints(", ");
-               if (!tcp->u_arg[1] || !verbose(tcp))
-                       printaddr(tcp->u_arg[1]);
-               else {
-                       tprints("[");
-                       printargv(tcp, tcp->u_arg[1]);
-                       tprints("]");
-               }
+       printpath(tcp, tcp->u_arg[0]);
+       tprints(", ");
+       if (!tcp->u_arg[1] || !verbose(tcp))
+               printaddr(tcp->u_arg[1]);
+       else {
+               tprints("[");
+               printargv(tcp, tcp->u_arg[1]);
+               tprints("]");
        }
-       return 0;
+
+       return RVAL_DECODED;
 }
 #endif /* SPARC || SPARC64 */