8000 Merge pull request #13 from robert-hh1/w600_ftp · retryfail/micropython@2db98d9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2db98d9

Browse files
authored
Merge pull request micropython#13 from robert-hh1/w600_ftp
ftpserver.c: Add sanity checks
2 parents dc7a80d + e0ac6c2 commit 2db98d9

File tree

1 file changed

+32
-19
lines changed

1 file changed

+32
-19
lines changed

ports/w60x/tools/ftpserver.c

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -78,31 +78,33 @@ struct ftp_session *ftp_new_session(void) {
7878

7979
session = (struct ftp_session *)tls_mem_alloc(sizeof(struct ftp_session));
8080

81-
session->sockfd = -1;
82-
session->pasv_sockfd = -1;
83-
session->pasv_acpt_sockfd = -1;
84-
85-
session->next = session_list;
86-
session_list = session;
81+
if (session != NULL) {
82+
session->sockfd = -1;
83+
session->pasv_sockfd = -1;
84+
session->pasv_acpt_sockfd = -1;
8785

86+
session->next = session_list;
87+
session_list = session;
88+
}
8889
return session;
8990
}
9091

9192
void ftp_close_session(struct ftp_session *session) {
92-
struct ftp_session *list;
93-
94-
if (session_list == session) {
95-
session_list = session_list->next;
96-
session->next = NULL;
97-
} else {
98-
list = session_list;
99-
while (list->next != session) list = list->next;
100-
101-
list->next = session->next;
102-
session->next = NULL;
93+
struct ftp_session *list = session_list;
94+
struct ftp_session *prev = NULL;
95+
96+
while (list != NULL) { // walk though the list
97+
if (list == session) { // match
98+
if (prev == NULL) { // at the head; remove it
99+
session_list = list->next; // tail will get the list
100+
} else { // Middle element
101+
prev->next = list->next; // link the tail to the head
102+
}
103+
tls_mem_free(session);
104+
break;
105+
}
106+
list = list->next;
103107
}
104-
105-
tls_mem_free(session);
106108
}
107109

108110
int ftp_get_filesize(char *filename) {
@@ -156,6 +158,9 @@ static void w600_ftps_task(void *param) {
156158
int ret;
157159
u32 addr_len = sizeof(struct sockaddr);
158160
char *buffer = (char *) tls_mem_alloc(FTP_BUFFER_SIZE);
161+
if (buffer == NULL) { // Alloc failed
162+
return;
163+
}
159164

160165
local.sin_port = htons(ftpsport);
161166
local.sin_family = PF_INET;
@@ -167,6 +172,7 @@ static void w600_ftps_task(void *param) {
167172
sockfd = socket(AF_INET, SOCK_STREAM, 0);
168173
if (sockfd < 0) {
169174
FTPS_DBG("create socket failed\n");
175+
tls_mem_free(buffer);
170176
return ;
171177
}
172178

@@ -446,6 +452,9 @@ int ftp_get_pasv_sock(struct ftp_session *session) {
446452
return 0;
447453

448454
sbuf = (char *)tls_mem_alloc(FTP_BUFFER_SIZE);
455+
if (sbuf == NULL) {
456+
return -1;
457+
}
449458

450459
tv.tv_sec = 3, tv.tv_usec = 0;
451460
FD_ZERO(&readfds);
@@ -492,6 +501,9 @@ int ftp_process_request(struct ftp_session *session, char *buf) {
492501
struct sockaddr_in local, pasvremote;
493502

494503
sbuf = (char *)tls_mem_alloc(FTP_BUFFER_SIZE);
504+
if (sbuf == NULL) { // Alloc failed
505+
return -1;
506+
}
495507

496508
tv.tv_sec = 3, tv.tv_usec = 0;
497509
local.sin_family = PF_INET;
@@ -531,6 +543,7 @@ int ftp_process_request(struct ftp_session *session, char *buf) {
531543
tls_mem_free(sbuf);
532544
return -1;
533545
}
546+
tls_mem_free(sbuf);
534547
return 0;
535548
} else if (str_begin_with(buf, "PASS") == 0) {
536549
FTPS_DBG("%s sent password \"%s\"\n", inet_ntoa(session->remote.sin_addr), parameter_ptr);

0 commit comments

Comments
 (0)
0