5
5
#include <string.h>
6
6
#include <unistd.h>
7
7
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 )
9
9
{
10
10
strcpy (buffer , "/data/data/com.termux/files/usr/bin/" );
11
11
char * bin_match = strstr (filename , "/bin/" );
@@ -27,6 +27,7 @@ const char* termux_rewrite_executable(const char* filename, char* buffer, int bu
27
27
int execve (const char * filename , char * const * argv , char * const envp [])
28
28
{
29
29
int fd = -1 ;
30
+ const char * * new_argv = NULL ;
30
31
31
32
char filename_buffer [512 ];
32
33
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[])
62
63
* whitespace_pos = 0 ;
63
64
64
65
// Find start of argument:
65
- arg = whitespace_pos + 1 ;;
66
+ arg = whitespace_pos + 1 ;
66
67
while (* arg != 0 && * arg == ' ' ) arg ++ ;
67
68
if (arg == newline_location ) {
68
69
// Only whitespace after interpreter.
69
70
arg = NULL ;
70
71
}
71
72
}
72
73
73
- const char * new_argv [4 ];
74
- new_argv [0 ] = basename (interpreter );
75
-
76
74
char interp_buf [512 ];
77
75
const char * new_interpreter = termux_rewrite_executable (interpreter , interp_buf , sizeof (interp_buf ));
76
+ if (new_interpreter == interpreter ) goto final ;
78
77
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 ;
87
90
88
91
filename = new_interpreter ;
89
92
argv = (char * * ) new_argv ;
90
93
91
94
final :
92
95
if (fd != -1 ) close (fd );
93
96
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 ;
95
100
}
0 commit comments