static void
printargc(struct tcb *const tcp, kernel_ulong_t addr)
{
- if (!addr || !verbose(tcp)) {
- printaddr(addr);
+ printaddr(addr);
+
+ if (!addr || !verbose(tcp))
return;
- }
bool unterminated = false;
unsigned int count = 0;
for (; addr; addr += current_wordsize, ++count) {
if (umoven(tcp, addr, current_wordsize, &cp)) {
- if (count) {
- unterminated = true;
- break;
- }
- printaddr(addr);
- return;
+ if (!count)
+ return;
+
+ unterminated = true;
+ break;
}
if (!cp)
break;
}
- tprintf("[/* %u var%s%s */]",
+ tprintf(" /* %u var%s%s */",
count, count == 1 ? "" : "s",
unterminated ? ", unterminated" : "");
}
#if VERBOSE
", [\"%s\", \"%s\", %p, %p, %p, ???]"
#else
- ", [/* 5 vars, unterminated */]"
+ ", %p /* 5 vars, unterminated */"
#endif
") = -1 ENOENT (%m)\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
argv[3], argv[4], argv[5]
#if VERBOSE
, q_envp[0], q_envp[1], envp[2], envp[3], envp[4]
+#else
+ , tail_envp
#endif
);
#if VERBOSE
", [\"%s\", \"%s\"]"
#else
- ", [/* 2 vars */]"
+ ", %p /* 2 vars */"
#endif
") = -1 ENOENT (%m)\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2]
#if VERBOSE
, q_envp[0], q_envp[1]
+#else
+ , tail_envp
#endif
);
#if VERBOSE
", [\"%s\"]"
#else
- ", [/* 1 var */]"
+ ", %p /* 1 var */"
#endif
") = -1 ENOENT (%m)\n",
Q_FILENAME, q_argv[2]
#if VERBOSE
, q_envp[1]
+#else
+ , tail_envp + 1
#endif
);
#if VERBOSE
", []"
#else
- ", [/* 0 vars */]"
+ ", %p /* 0 vars */"
#endif
- ") = -1 ENOENT (%m)\n", Q_FILENAME);
+ ") = -1 ENOENT (%m)\n", Q_FILENAME
+#if !VERBOSE
+ , empty
+#endif
+ );
char str_a[] = "012345678901234567890123456789012";
char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}";
printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
for (i = 1; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", b[i]);
+ printf("]");
#else
- printf("], [/* %u vars */", DEFAULT_STRLEN + 1);
+ printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
#endif
- printf("]) = -1 ENOENT (%m)\n");
+ printf(") = -1 ENOENT (%m)\n");
execve(FILENAME, a + 1, b + 1);
printf("execve(\"%s\", [\"%s\"", Q_FILENAME, a[1]);
printf("], [\"%s\"", b[1]);
for (i = 2; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", b[i]);
+ printf("]");
#else
- printf("], [/* %d vars */", DEFAULT_STRLEN);
+ printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
#endif
- printf("]) = -1 ENOENT (%m)\n");
+ printf(") = -1 ENOENT (%m)\n");
execve(FILENAME, (char **) tail_argv[ARRAY_SIZE(q_argv)], efault);
printf("execve(\"%s\", NULL, %p) = -1 ENOENT (%m)\n",
#if VERBOSE
", [\"%s\", \"%s\", %p, %p, %p, ???]"
#else
- ", [/* 5 vars, unterminated */]"
+ ", %p /* 5 vars, unterminated */"
#endif
", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
argv[3], argv[4], argv[5],
#if VERBOSE
q_envp[0], q_envp[1], envp[2], envp[3], envp[4],
+#else
+ tail_envp,
#endif
errno2name());
#if VERBOSE
", [\"%s\", \"%s\"]"
#else
- ", [/* 2 vars */]"
+ ", %p /* 2 vars */"
#endif
", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
Q_FILENAME, q_argv[0], q_argv[1], q_argv[2],
#if VERBOSE
q_envp[0], q_envp[1],
+#else
+ tail_envp,
#endif
errno2name());
#if VERBOSE
", [\"%s\"]"
#else
- ", [/* 1 var */]"
+ ", %p /* 1 var */"
#endif
", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
Q_FILENAME, q_argv[2],
#if VERBOSE
q_envp[1],
+#else
+ tail_envp + 1,
#endif
errno2name());
#if VERBOSE
", []"
#else
- ", [/* 0 vars */]"
+ ", %p /* 0 vars */"
#endif
", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
- Q_FILENAME, errno2name());
+ Q_FILENAME,
+#if !VERBOSE
+ empty,
+#endif
+ errno2name());
char str_a[] = "012345678901234567890123456789012";
char str_b[] = "_abcdefghijklmnopqrstuvwxyz()[]{}";
printf("], [\"%.*s\"...", DEFAULT_STRLEN, b[0]);
for (i = 1; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", b[i]);
+ printf("]");
#else
- printf("], [/* %u vars */", DEFAULT_STRLEN + 1);
+ printf("], %p /* %u vars */", b, DEFAULT_STRLEN + 1);
#endif
- printf("], AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
+ printf(", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
errno2name());
syscall(__NR_execveat, -100, FILENAME, a + 1, b + 1, 0x1100);
printf("], [\"%s\"", b[1]);
for (i = 2; i <= DEFAULT_STRLEN; ++i)
printf(", \"%s\"", b[i]);
+ printf("]");
#else
- printf("], [/* %d vars */", DEFAULT_STRLEN);
+ printf("], %p /* %d vars */", b + 1, DEFAULT_STRLEN);
#endif
- printf("], AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
+ printf(", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n",
errno2name());
syscall(__NR_execveat, -100, FILENAME, NULL, efault, 0x1100);
. "${srcdir=.}/init.sh"
run_prog ../umovestr
-pattern_abbrev_verbose='execve("\.\./umovestr", \["\.\./umovestr"\], \[/\* [[:digit:]]* vars \*/\]) = 0'
+pattern_abbrev_verbose='execve("\.\./umovestr", \["\.\./umovestr"\], 0x[[:xdigit:]]* /\* [[:digit:]]* vars \*/) = 0'
pattern_nonabbrev_verbose='execve("\.\./umovestr", \["\.\./umovestr"\], \[".*\"\(\.\.\.\)\?\]) = 0'
pattern_nonverbose='execve("\.\./umovestr", 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
pattern_raw='execve(0x[[:xdigit:]]*, 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
-[ ]{5}0\.0{6} execve\("\.\./sleep", \["\.\./sleep", "1"\], \[/\* [[:digit:]]+ vars \*/\]\) = 0
+[ ]{5}0\.0{6} execve\("\.\./sleep", \["\.\./sleep", "1"\], 0x[[:xdigit:]]* /\* [[:digit:]]* vars \*/\) = 0
[ ]{5}(1\.[01]|0\.9)[[:digit:]]{5} \+\+\+ exited with 0 \+\+\+
t1="$(date +%T)"
cat > "$EXP" << __EOF__
-($t0|$t1) execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+($t0|$t1) execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]* vars \\*/\\) = 0
__EOF__
match_grep "$LOG" "$EXP"
done
cat > "$EXP" << __EOF__
-($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]* vars \\*/\\) = 0
__EOF__
match_grep "$LOG" "$EXP"
done
cat > "$EXP" << __EOF__
-($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], \\[/\\* [[:digit:]]+ vars \\*/\\]\\) = 0
+($t_reg)\\.[[:digit:]]{6} execve\\("\\.\\./sleep", \\["\\.\\./sleep", "0"\\], 0x[[:xdigit:]]* /\\* [[:digit:]]+ vars \\*/\\) = 0
__EOF__
match_grep "$LOG" "$EXP"
switch (action % NUMBER_OF_ACTIONS) {
case ACTION_exit:
printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
- ", [/* %u vars */] <pid changed to %u ...>\n",
+ ", %p /* %u vars */ <pid changed to %u ...>\n",
tid, argv[0], argv[0], argv[1], argv[2],
- arglen(environ), leader);
+ environ, arglen(environ), leader);
break;
case ACTION_rt_sigsuspend:
printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
- ", [/* %u vars */] <unfinished ...>\n"
+ ", %p /* %u vars */ <unfinished ...>\n"
"%-5d <... rt_sigsuspend resumed>) = ?\n",
tid, argv[0], argv[0], argv[1], argv[2],
- arglen(environ),
+ environ, arglen(environ),
leader);
break;
case ACTION_nanosleep:
printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
- ", [/* %u vars */] <unfinished ...>\n"
+ ", %p /* %u vars */ <unfinished ...>\n"
"%-5d <... nanosleep resumed> <unfinished ...>)"
" = ?\n",
tid, argv[0], argv[0], argv[1], argv[2],
- arglen(environ),
+ environ, arglen(environ),
leader);
break;
}
if (clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL))
perror_msg_and_skip("clock_nanosleep CLOCK_REALTIME");
- printf("%-5d execve(\"%s\", [\"%s\"], [/* %u vars */]) = 0\n",
- leader, av[0], av[0], arglen(environ));
-
get_sigsetsize();
static char buf[sizeof(sigsetsize) * 3];
sprintf(buf, "%u", sigsetsize);
char *argv[] = { av[0], buf, (char *) "0", NULL };
printf("%-5d execve(\"%s\", [\"%s\", \"%s\", \"%s\"]"
- ", [/* %u vars */]) = 0\n",
+ ", %p /* %u vars */) = 0\n",
leader, argv[0], argv[0], argv[1], argv[2],
- arglen(environ));
+ environ, arglen(environ));
execve(argv[0], argv, environ);
perror_msg_and_fail("execve");
}
# Due to probabilistic nature of the test, try it several times.
i=0
-while [ $i -le 9 ]; do
+while [ $i -le 19 ]; do
+ i="$(($i+1))"
run_strace "$@" > "$EXP"
- diff -- "$EXP" "$LOG" || continue
+ sed 1d < "$LOG" > "$OUT"
+ diff -- "$EXP" "$OUT" || continue
exit 0
done