Skip to content

Commit 48f9e3a

Browse files
committed
Fix some basic issues
1 parent d2eed94 commit 48f9e3a

File tree

4 files changed

+21
-16
lines changed

4 files changed

+21
-16
lines changed

run-tests.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ for f in tests/*.sh; do
99
ACTUAL_FILE=$f-actual
1010

1111
rm -f $ACTUAL_FILE
12-
$f $ACTUAL_FILE > $ACTUAL_FILE
12+
$f myarg1 myarg2 > $ACTUAL_FILE
1313

1414
if cmp --silent $ACTUAL_FILE $EXPECTED_FILE; then
1515
printf " OK\n"

termux-exec.c

+19-14
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <string.h>
66
#include <unistd.h>
77

8-
const char* termux_rewrite_executable(const char* filename, char* buffer, int buffer_len)
8+
static const char* termux_rewrite_executable(const char* filename, char* buffer, int buffer_len)
99
{
1010
strcpy(buffer, "/data/data/com.termux/files/usr/bin/");
1111
char* bin_match = strstr(filename, "/bin/");
@@ -27,6 +27,7 @@ const char* termux_rewrite_executable(const char* filename, char* buffer, int bu
2727
int execve(const char* filename, char* const* argv, char *const envp[])
2828
{
2929
int fd = -1;
30+
const char** new_argv = NULL;
3031

3132
char filename_buffer[512];
3233
filename = termux_rewrite_executable(filename, filename_buffer, sizeof(filename_buffer));
@@ -62,34 +63,38 @@ int execve(const char* filename, char* const* argv, char *const envp[])
6263
*whitespace_pos = 0;
6364

6465
// Find start of argument:
65-
arg = whitespace_pos + 1;;
66+
arg = whitespace_pos + 1;
6667
while (*arg != 0 && *arg == ' ') arg++;
6768
if (arg == newline_location) {
6869
// Only whitespace after interpreter.
6970
arg = NULL;
7071
}
7172
}
7273

73-
const char* new_argv[4];
74-
new_argv[0] = basename(interpreter);
75-
7674
char interp_buf[512];
7775
const char* new_interpreter = termux_rewrite_executable(interpreter, interp_buf, sizeof(interp_buf));
76+
if (new_interpreter == interpreter) goto final;
7877

79-
if (arg) {
80-
new_argv[1] = arg;
81-
new_argv[2] = filename;
82-
new_argv[3] = NULL;
83-
} else {
84-
new_argv[1] = filename;
85-
new_argv[2] = NULL;
86-
}
78+
int orig_argv_count = 0;
79+
while (argv[orig_argv_count] != NULL) orig_argv_count++;
80+
81+
new_argv = malloc(sizeof(char*) * (4 + orig_argv_count));
82+
83+
int current_argc = 0;
84+
new_argv[current_argc++] = basename(interpreter);
85+
if (arg) new_argv[current_argc++] = arg;
86+
new_argv[current_argc++] = filename;
87+
int i = 1;
88+
while (orig_argv_count-- > 1) new_argv[current_argc++] = argv[i++];
89+
new_argv[current_argc] = NULL;
8790

8891
filename = new_interpreter;
8992
argv = (char**) new_argv;
9093

9194
final:
9295
if (fd != -1) close(fd);
9396
int (*real_execve)(const char*, char *const[], char *const[]) = dlsym(RTLD_NEXT, "execve");
94-
return real_execve(filename, argv, envp);
97+
int ret = real_execve(filename, argv, envp);
98+
free(new_argv);
99+
return ret;
95100
}

tests/args-with-spaces.sh-expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hello world bye tests/args-with-spaces.sh
1+
hello world bye tests/args-with-spaces.sh myarg1 myarg2

tests/usr-bin-env.sh

100644100755
File mode changed.

0 commit comments

Comments
 (0)