Skip to content

Commit 0d23640

Browse files
Fix the resource management
1 parent e8f54ae commit 0d23640

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

src/wolfsftp.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,17 +2172,17 @@ int wolfSSH_SFTP_RecvOpen(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
21722172
}
21732173
#endif
21742174

2175-
if (ret == WS_SUCCESS) {
2176-
/* create packet */
2177-
out = (byte*)WMALLOC(outSz, ssh->ctx->heap, DYNTYPE_BUFFER);
2178-
if (out == NULL) {
2175+
/* create packet */
2176+
out = (byte*)WMALLOC(outSz, ssh->ctx->heap, DYNTYPE_BUFFER);
2177+
if (out == NULL) {
2178+
if (ret == WS_SUCCESS) {
21792179
#ifdef MICROCHIP_MPLAB_HARMONY
21802180
WFCLOSE(ssh->fs, &fd);
21812181
#else
21822182
WCLOSE(ssh->fs, fd);
21832183
#endif
2184-
return WS_MEMORY_E;
21852184
}
2185+
return WS_MEMORY_E;
21862186
}
21872187
if (ret == WS_SUCCESS) {
21882188
if (SFTP_CreatePacket(ssh, WOLFSSH_FTP_HANDLE, out, outSz,
@@ -2192,20 +2192,21 @@ int wolfSSH_SFTP_RecvOpen(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
21922192
#else
21932193
WCLOSE(ssh->fs, fd);
21942194
#endif
2195+
WFREE(out, ssh->ctx->heap, DYNTYPE_BUFFER);
21952196
return WS_FATAL_ERROR;
21962197
}
21972198
}
21982199
else {
2200+
if (fd >= 0) {
2201+
#ifdef MICROCHIP_MPLAB_HARMONY
2202+
WFCLOSE(ssh->fs, &fd);
2203+
#else
2204+
WCLOSE(ssh->fs, fd);
2205+
#endif
2206+
}
21992207
if (wolfSSH_SFTP_CreateStatus(ssh, WOLFSSH_FTP_FAILURE, reqId, res,
22002208
"English", out, &outSz) != WS_SUCCESS) {
22012209
WFREE(out, ssh->ctx->heap, DYNTYPE_BUFFER);
2202-
if (fd >= 0) {
2203-
#ifdef MICROCHIP_MPLAB_HARMONY
2204-
WFCLOSE(ssh->fs, &fd);
2205-
#else
2206-
WCLOSE(ssh->fs, fd);
2207-
#endif
2208-
}
22092210
return WS_FATAL_ERROR;
22102211
}
22112212
}
@@ -2311,30 +2312,41 @@ int wolfSSH_SFTP_RecvOpen(WOLFSSH* ssh, int reqId, byte* data, word32 maxSz)
23112312
}
23122313

23132314
#ifdef WOLFSSH_STOREHANDLE
2314-
if (SFTP_AddHandleNode(ssh,
2315-
(byte*)&fileHandle, sizeof(HANDLE), dir) != WS_SUCCESS) {
2315+
if (ret == WS_SUCCESS) {
2316+
if (SFTP_AddHandleNode(ssh,
2317+
(byte*)&fileHandle, sizeof(HANDLE), dir) != WS_SUCCESS) {
23162318
WLOG(WS_LOG_SFTP, "Unable to store handle");
23172319
res = ier;
23182320
if (wolfSSH_SFTP_CreateStatus(ssh, WOLFSSH_FTP_FAILURE, reqId, res,
23192321
"English", NULL, &outSz) != WS_SIZE_ONLY) {
2322+
CloseHandle(fileHandle);
23202323
return WS_FATAL_ERROR;
23212324
}
23222325
ret = WS_FATAL_ERROR;
2326+
}
23232327
}
23242328
#endif
23252329

23262330
/* create packet */
23272331
out = (byte*)WMALLOC(outSz, ssh->ctx->heap, DYNTYPE_BUFFER);
23282332
if (out == NULL) {
2333+
if (ret == WS_SUCCESS) {
2334+
CloseHandle(fileHandle);
2335+
}
23292336
return WS_MEMORY_E;
23302337
}
23312338
if (ret == WS_SUCCESS) {
23322339
if (SFTP_CreatePacket(ssh, WOLFSSH_FTP_HANDLE, out, outSz,
23332340
(byte*)&fileHandle, sizeof(HANDLE)) != WS_SUCCESS) {
2341+
CloseHandle(fileHandle);
2342+
WFREE(out, ssh->ctx->heap, DYNTYPE_BUFFER);
23342343
return WS_FATAL_ERROR;
23352344
}
23362345
}
23372346
else {
2347+
if (fileHandle != INVALID_HANDLE_VALUE) {
2348+
CloseHandle(fileHandle);
2349+
}
23382350
if (wolfSSH_SFTP_CreateStatus(ssh, WOLFSSH_FTP_FAILURE, reqId, res,
23392351
"English", out, &outSz) != WS_SUCCESS) {
23402352
WFREE(out, ssh->ctx->heap, DYNTYPE_BUFFER);

0 commit comments

Comments
 (0)