瀏覽代碼

ftp: improved error handling

fixing subsequent erroring requests
Sergey Alirzaev 4 年之前
父節點
當前提交
198d1bce67
共有 1 個文件被更改,包括 21 次插入10 次删除
  1. 21 10
      modules/ftp.c

+ 21 - 10
modules/ftp.c

@@ -553,26 +553,36 @@ err_t lwftp_retr(lwftp_session_t *s)
   err_t error;
 
   // Check user supplied data
-  if ( (s->control_state!=LWFTP_CLOSED) ||
-       !s->settings->remote_path ||
-       s->control_pcb ||
-       s->data_pcb ||
-       !s->settings->user ||
-       !s->settings->pass )
-  {
-    LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:invalid session data\n"));
+  if (s->control_state != LWFTP_CLOSED || s->control_pcb) {
+    s->error = "previous connection is incomplete";
+    return ERR_ARG;
+  }
+  if (!s->settings->remote_path) {
+    s->error = "empty remote path";
     return ERR_ARG;
   }
+  if (!s->settings->user) {
+    s->error = "empty user name";
+    return ERR_ARG;
+  }
+  if (!s->settings->pass) {
+    s->error = "empty password";
+    return ERR_ARG;
+  }
+  if (s->data_pcb) {
+    lwftp_pcb_close(s->data_pcb);
+  }
+
   // Get sessions pcb
   s->control_pcb = tcp_new();
   if (!s->control_pcb) {
-    LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:cannot alloc control_pcb (low memory?)\n"));
+    s->error = "cannot alloc control_pcb (low memory?)";
     error = ERR_MEM;
     goto exit;
   }
   s->data_pcb = tcp_new();
   if (!s->data_pcb) {
-    LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:cannot alloc data_pcb (low memory?)\n"));
+    s->error = "cannot alloc data_pcb (low memory?)";
     error = ERR_MEM;
     goto close_pcb;
   }
@@ -585,6 +595,7 @@ err_t lwftp_retr(lwftp_session_t *s)
   if ( error == ERR_OK ) goto exit;
 
   LWIP_DEBUGF(LWFTP_SERIOUS, ("lwftp:cannot connect control_pcb (%s)\n", lwip_strerr(error)));
+  s->error = "cannot connet control_pcb";
 
 close_pcb:
   // Release pcbs in case of failure