@@ -89,7 +89,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
89
89
}
90
90
fclose (cmdline);
91
91
*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 *) ));
93
93
std::copy (argvec.begin (), argvec.end (), outBuf);
94
94
outBuf[argvec.size ()] = nullptr ;
95
95
@@ -121,23 +121,27 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
121
121
WideCharToMultiByte (CP_UTF8, WC_ERR_INVALID_CHARS, szArgList[i], -1 ,
122
122
nullptr , 0 , nullptr , nullptr );
123
123
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 ());
126
128
return nullptr ;
127
129
}
128
130
129
131
char *buffer = static_cast <char *>(
130
132
calloc (static_cast <size_t >(szBufferSize), sizeof (char )));
131
133
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" );
134
137
return nullptr ;
135
138
}
136
139
137
140
if (!WideCharToMultiByte (CP_UTF8, WC_ERR_INVALID_CHARS, szArgList[i], -1 ,
138
141
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" );
141
145
return nullptr ;
142
146
}
143
147
@@ -175,7 +179,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
175
179
size_t argPtrSize = 0 ;
176
180
for (int i = 0 ; i < 3 && !argPtr; ++i) { // give up after 3 tries
177
181
if (sysctl (mib, 4 , nullptr , &argPtrSize, nullptr , 0 ) != -1 ) {
178
- argPtr = ( char *) malloc (argPtrSize);
182
+ argPtr = static_cast < char *>( malloc (argPtrSize) );
179
183
if (sysctl (mib, 4 , argPtr, &argPtrSize, nullptr , 0 ) == -1 ) {
180
184
free (argPtr);
181
185
argPtr = nullptr ;
@@ -199,7 +203,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
199
203
for (; curPtr < endPtr; curPtr += strlen (curPtr) + 1 )
200
204
argvec.push_back (strdup (curPtr));
201
205
*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 *) ));
203
207
std::copy (argvec.begin (), argvec.end (), outBuf);
204
208
outBuf[argvec.size ()] = nullptr ;
205
209
@@ -223,20 +227,24 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
223
227
224
228
__wasi_errno_t err;
225
229
226
- size_t argv_buf_size;
227
- size_t argc;
230
+ size_t argv_buf_size = 0 ;
231
+ size_t argc = 0 ;
228
232
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));
230
237
return nullptr ;
238
+ }
231
239
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 *)));
235
242
236
243
err = __wasi_args_get ((uint8_t **)argv, (uint8_t *)argv_buf);
237
244
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));
240
248
return nullptr ;
241
249
}
242
250
0 commit comments