Skip to content

Commit af52886

Browse files
authored
Merge pull request #32516 from CodaFi/NPE-NBD
Correct Bogus NULL-Returns in _swift_stdlib_getUnsafeArgvArgc
2 parents 6d27611 + 3faad6a commit af52886

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

stdlib/public/stubs/CommandLine.cpp

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
8989
}
9090
fclose(cmdline);
9191
*outArgLen = argvec.size();
92-
char **outBuf = (char **)calloc(argvec.size() + 1, sizeof(char *));
92+
auto outBuf = static_cast<char **>(calloc(argvec.size() + 1, sizeof(char *)));
9393
std::copy(argvec.begin(), argvec.end(), outBuf);
9494
outBuf[argvec.size()] = nullptr;
9595

@@ -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

@@ -175,7 +179,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
175179
size_t argPtrSize = 0;
176180
for (int i = 0; i < 3 && !argPtr; ++i) { // give up after 3 tries
177181
if (sysctl(mib, 4, nullptr, &argPtrSize, nullptr, 0) != -1) {
178-
argPtr = (char *)malloc(argPtrSize);
182+
argPtr = static_cast<char *>(malloc(argPtrSize));
179183
if (sysctl(mib, 4, argPtr, &argPtrSize, nullptr, 0) == -1) {
180184
free(argPtr);
181185
argPtr = nullptr;
@@ -199,7 +203,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
199203
for (; curPtr < endPtr; curPtr += strlen(curPtr) + 1)
200204
argvec.push_back(strdup(curPtr));
201205
*outArgLen = argvec.size();
202-
char **outBuf = (char **)calloc(argvec.size() + 1, sizeof(char *));
206+
auto outBuf = static_cast<char **>(calloc(argvec.size() + 1, sizeof(char *)));
203207
std::copy(argvec.begin(), argvec.end(), outBuf);
204208
outBuf[argvec.size()] = nullptr;
205209

@@ -223,20 +227,24 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
223227

224228
__wasi_errno_t err;
225229

226-
size_t argv_buf_size;
227-
size_t argc;
230+
size_t argv_buf_size = 0;
231+
size_t argc = 0;
228232
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
229-
if (err != __WASI_ERRNO_SUCCESS)
233+
if (err != __WASI_ERRNO_SUCCESS) {
234+
swift::fatalError(0,
235+
"Fatal error: Could not retrieve commandline "
236+
"arguments: %d.\n", static_cast<int>(err));
230237
return nullptr;
238+
}
231239

232-
size_t num_ptrs = argc + 1;
233-
char *argv_buf = (char *)malloc(argv_buf_size);
234-
char **argv = (char **)calloc(num_ptrs, sizeof(char *));
240+
char *argv_buf = static_cast<char *>(malloc(argv_buf_size));
241+
char **argv = static_cast<char **>(calloc(argc + 1, sizeof(char *)));
235242

236243
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
237244
if (err != __WASI_ERRNO_SUCCESS) {
238-
free(argv_buf);
239-
free(argv);
245+
swift::fatalError(0,
246+
"Fatal error: Could not retrieve commandline "
247+
"arguments: %d.\n", static_cast<int>(err));
240248
return nullptr;
241249
}
242250

0 commit comments

Comments
 (0)