Skip to content

Commit 5d6b350

Browse files
committed
Making split_venv_command_into_args dynamic
1 parent 6b452c2 commit 5d6b350

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

graalpython/python-macos-launcher/src/venvlauncher.c

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,43 @@ char *get_pyenvcfg_command(const char *pyenv_cfg_path) {
115115
exit(1);
116116
}
117117

118-
void split_venv_command_into_args(char *venv_command, char *result[]) {
118+
char **split_venv_command_into_args(char *venv_command, int *argc_out) {
119+
120+
char *copy = strdup(venv_command);
121+
size_t capacity = 5;
122+
char **args = malloc(capacity * sizeof(char *));
123+
if (!args) {
124+
fprintf(stderr, "allocation failed failed\n");
125+
free(copy);
126+
exit(1);
127+
}
128+
129+
size_t count = 0;
119130
char *current_token = strtok(venv_command, " ");
120-
for (int i = 0; i < 5; i++) {
121-
result[i] = current_token;
131+
while (current_token) {
132+
if (count >= capacity) {
133+
capacity *= 2;
134+
char **tmp = realloc(args, capacity * sizeof(char *));
135+
if (!tmp) {
136+
// allocation failed
137+
fprintf(stderr, "reallocation failed\n");
138+
for (size_t i = 0; i < count; i++) {
139+
free(args[i]);
140+
}
141+
free(args);
142+
free(copy);
143+
exit(1);
144+
}
145+
args = tmp;
146+
}
147+
148+
args[count++] = strdup(current_token);
122149
current_token = strtok(NULL, " ");
123150
}
124-
if (current_token != NULL) {
125-
fprintf(stderr, "Unexpected venv_command size!\n");
126-
exit(1);
127-
}
151+
152+
free(copy);
153+
*argc_out = (int) count;
154+
return args;
128155
}
129156

130157
void find_pyvenv(char *pyvenv_cfg_path, size_t path_size) {
@@ -157,10 +184,9 @@ int main(int argc, char *argv[]) {
157184
find_pyvenv(pyvenv_cfg_path, sizeof(pyvenv_cfg_path));
158185

159186
char *venv_command = get_pyenvcfg_command(pyvenv_cfg_path);
160-
char *venv_command_dup = strdup(venv_command);
161187

162-
char *venv_args[5];
163-
split_venv_command_into_args(venv_command_dup, venv_args);
188+
int venv_argc = 0;
189+
char **venv_args = split_venv_command_into_args(venv_command, &venv_argc);
164190

165191
// Adds "--python.VenvlauncherCommand="
166192
size_t python_base_exec_size = strlen(venv_command) + strlen(GRAAL_PYTHON_BASE_EXE_ARG) + 2 + 1;
@@ -176,13 +202,13 @@ int main(int argc, char *argv[]) {
176202
GRAAL_PYTHON_EXE_ARG,
177203
argv[0]);
178204

179-
// venv_args (5) + "--python.VenvlauncherCommand=" + Adds "--python.Executable=" + rest of argc + NULL
180-
size_t args_size = 5 + 2 + (argc - 1) + 1;
205+
// venv_args + "--python.VenvlauncherCommand=" + Adds "--python.Executable=" + rest of argc (-1 because we are not interested in argv[0]) + NULL
206+
size_t args_size = venv_argc + 2 + (argc - 1) + 1;
181207
char *args[args_size];
182208

183209
// copy venv_args
184210
int k = 0;
185-
for (k = 0; k < 5; k++) {
211+
for (k = 0; k < venv_argc; k++) {
186212
args[k] = venv_args[k];
187213
}
188214

@@ -200,4 +226,3 @@ int main(int argc, char *argv[]) {
200226
perror("execv failed"); // only runs if execv fails
201227
return 1;
202228
}
203-

0 commit comments

Comments
 (0)