@@ -78,31 +78,33 @@ struct ftp_session *ftp_new_session(void) {
78
78
79
79
session = (struct ftp_session * )tls_mem_alloc (sizeof (struct ftp_session ));
80
80
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 ;
87
85
86
+ session -> next = session_list ;
87
+ session_list = session ;
88
+ }
88
89
return session ;
89
90
}
90
91
91
92
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 ;
103
107
}
104
-
105
- tls_mem_free (session );
106
108
}
107
109
108
110
int ftp_get_filesize (char * filename ) {
@@ -156,6 +158,9 @@ static void w600_ftps_task(void *param) {
156
158
int ret ;
157
159
u32 addr_len = sizeof (struct sockaddr );
158
160
char * buffer = (char * ) tls_mem_alloc (FTP_BUFFER_SIZE );
161
+ if (buffer == NULL ) { // Alloc failed
162
+ return ;
163
+ }
159
164
160
165
local .sin_port = htons (ftpsport );
161
166
local .sin_family = PF_INET ;
@@ -167,6 +172,7 @@ static void w600_ftps_task(void *param) {
167
172
sockfd = socket (AF_INET , SOCK_STREAM , 0 );
168
173
if (sockfd < 0 ) {
169
174
FTPS_DBG ("create socket failed\n" );
175
+ tls_mem_free (buffer );
170
176
return ;
171
177
}
172
178
@@ -446,6 +452,9 @@ int ftp_get_pasv_sock(struct ftp_session *session) {
446
452
return 0 ;
447
453
448
454
sbuf = (char * )tls_mem_alloc (FTP_BUFFER_SIZE );
455
+ if (sbuf == NULL ) {
456
+ return -1 ;
457
+ }
449
458
450
459
tv .tv_sec = 3 , tv .tv_usec = 0 ;
451
460
FD_ZERO (& readfds );
@@ -492,6 +501,9 @@ int ftp_process_request(struct ftp_session *session, char *buf) {
492
501
struct sockaddr_in local , pasvremote ;
493
502
494
503
sbuf = (char * )tls_mem_alloc (FTP_BUFFER_SIZE );
504
+ if (sbuf == NULL ) { // Alloc failed
505
+ return -1 ;
506
+ }
495
507
496
508
tv .tv_sec = 3 , tv .tv_usec = 0 ;
497
509
local .sin_family = PF_INET ;
@@ -531,6 +543,7 @@ int ftp_process_request(struct ftp_session *session, char *buf) {
531
543
tls_mem_free (sbuf );
532
544
return -1 ;
533
545
}
546
+ tls_mem_free (sbuf );
534
547
return 0 ;
535
548
} else if (str_begin_with (buf , "PASS" ) == 0 ) {
536
549
FTPS_DBG ("%s sent password \"%s\"\n" , inet_ntoa (session -> remote .sin_addr ), parameter_ptr );
0 commit comments