Skip to content

Commit af853fd

Browse files
committed
Correct WASI Command Line Parsing Error Handling Paths
This function may not return the null pointer. On error, just crash.
1 parent 5dad41f commit af853fd

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

stdlib/public/stubs/CommandLine.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,21 +223,31 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
223223

224224
__wasi_errno_t err;
225225

226-
size_t argv_buf_size;
227-
size_t argc;
226+
size_t argv_buf_size = 0;
227+
size_t argc = 0;
228228
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
229-
if (err != __WASI_ERRNO_SUCCESS)
230-
return nullptr;
229+
if (err != __WASI_ERRNO_SUCCESS) {
230+
argc = 0;
231+
}
231232

233+
// __wasi_args_sizes_get requires the caller to allocate extra space for NULL
234+
// termination.
232235
size_t num_ptrs = argc + 1;
233-
char *argv_buf = static_cast<char *>(alloc(argv_buf_size));
234236
char **argv = static_cast<char **>(calloc(num_ptrs, sizeof(char *)));
237+
if (err != __WASI_ERRNO_SUCCESS) {
238+
*outArgLen = 0;
239+
argv[0] = nullptr;
240+
return argv;
241+
}
235242

243+
char *argv_buf = static_cast<char *>(malloc(argv_buf_size));
236244
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
237245
if (err != __WASI_ERRNO_SUCCESS) {
238246
free(argv_buf);
239-
free(argv);
240-
return nullptr;
247+
248+
*outArgLen = 0;
249+
argv[0] = nullptr;
250+
return argv;
241251
}
242252

243253
*outArgLen = static_cast<int>(argc);

0 commit comments

Comments
 (0)