Skip to content

Commit 3faad6a

Browse files
committed
Correct Windows Command Line Parsing Error Handling Paths
Returning nullptr from this function is undefined behavior. Instead, just crash.
1 parent af853fd commit 3faad6a

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

stdlib/public/stubs/CommandLine.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,27 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
121121
WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, szArgList[i], -1,
122122
nullptr, 0, nullptr, nullptr);
123123
if (szBufferSize == 0) {
124-
for (char *arg : argv)
125-
free(arg);
124+
swift::fatalError(0,
125+
"Fatal error: Could not retrieve commandline "
126+
"arguments: %u\n",
127+
GetLastError());
126128
return nullptr;
127129
}
128130

129131
char *buffer = static_cast<char *>(
130132
calloc(static_cast<size_t>(szBufferSize), sizeof(char)));
131133
if (buffer == nullptr) {
132-
for (char *arg : argv)
133-
free(arg);
134+
swift::fatalError(0,
135+
"Fatal error: Could not allocate space for commandline"
136+
"arguments");
134137
return nullptr;
135138
}
136139

137140
if (!WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, szArgList[i], -1,
138141
buffer, szBufferSize, nullptr, nullptr)) {
139-
for (char *arg : argv)
140-
free(arg);
142+
swift::fatalError(0,
143+
"Fatal error: Conversion to UTF-8 failed for "
144+
"commandline arguments");
141145
return nullptr;
142146
}
143147

@@ -227,27 +231,21 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
227231
size_t argc = 0;
228232
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
229233
if (err != __WASI_ERRNO_SUCCESS) {
230-
argc = 0;
231-
}
232-
233-
// __wasi_args_sizes_get requires the caller to allocate extra space for NULL
234-
// termination.
235-
size_t num_ptrs = argc + 1;
236-
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;
234+
swift::fatalError(0,
235+
"Fatal error: Could not retrieve commandline "
236+
"arguments: %d.\n", static_cast<int>(err));
237+
return nullptr;
241238
}
242239

243240
char *argv_buf = static_cast<char *>(malloc(argv_buf_size));
241+
char **argv = static_cast<char **>(calloc(argc + 1, sizeof(char *)));
242+
244243
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
245244
if (err != __WASI_ERRNO_SUCCESS) {
246-
free(argv_buf);
247-
248-
*outArgLen = 0;
249-
argv[0] = nullptr;
250-
return argv;
245+
swift::fatalError(0,
246+
"Fatal error: Could not retrieve commandline "
247+
"arguments: %d.\n", static_cast<int>(err));
248+
return nullptr;
251249
}
252250

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

0 commit comments

Comments
 (0)