]> granicus.if.org Git - curl/commitdiff
Fixed some out of memory handling issues.
authorDan Fandrich <dan@coneharvesters.com>
Wed, 11 Apr 2007 00:25:41 +0000 (00:25 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Wed, 11 Apr 2007 00:25:41 +0000 (00:25 +0000)
lib/ftp.c
lib/tftp.c

index 4007bb0918302b3e7ad1ab225cd44784b60991cb..a30b6ac08edf708b1767aa3f288bdfa24e24824f 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -3647,7 +3647,6 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
 static
 CURLcode ftp_parse_url_path(struct connectdata *conn)
 {
-  CURLcode retcode = CURLE_OK;
   struct SessionHandle *data = conn->data;
   /* the ftp struct is already inited in ftp_connect() */
   struct FTP *ftp = data->reqdata.proto.ftp;
@@ -3720,6 +3719,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
           return CURLE_OUT_OF_MEMORY;
         }
         if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
+          free(ftpc->dirs[ftpc->dirdepth]);
           freedirs(conn);
           return CURLE_URL_MALFORMAT;
         }
@@ -3729,20 +3729,17 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
         continue;
       }
 
-      if(!retcode) {
-        cur_pos = slash_pos + 1; /* jump to the rest of the string */
-        if(++ftpc->dirdepth >= ftpc->diralloc) {
-          /* enlarge array */
-          char *bigger;
-          ftpc->diralloc *= 2; /* double the size each time */
-          bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
-          if(!bigger) {
-            ftpc->dirdepth--;
-            freedirs(conn);
-            return CURLE_OUT_OF_MEMORY;
-          }
-          ftpc->dirs = (char **)bigger;
-        }
+      cur_pos = slash_pos + 1; /* jump to the rest of the string */
+      if(++ftpc->dirdepth >= ftpc->diralloc) {
+       /* enlarge array */
+       char *bigger;
+       ftpc->diralloc *= 2; /* double the size each time */
+       bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
+       if(!bigger) {
+         freedirs(conn);
+         return CURLE_OUT_OF_MEMORY;
+       }
+       ftpc->dirs = (char **)bigger;
       }
     }
 
@@ -3790,7 +3787,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
     free(path);
   }
 
-  return retcode;
+  return CURLE_OK;
 }
 
 /* call this when the DO phase has completed */
index ed631fad80eafbd93ce2b851cec9eaa5f6f7c2e9..18c9472d3631c36ff8ac9375bf5ab6751255169e 100644 (file)
@@ -286,6 +286,9 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event)
     file name so we skip the always-present first letter of the path string. */
     filename = curl_easy_unescape(data, &state->conn->data->reqdata.path[1], 0,
                                   NULL);
+    if (!filename)
+      return CURLE_OUT_OF_MEMORY;
+
     snprintf((char *)&state->spacket.data[2],
              TFTP_BLOCKSIZE,
              "%s%c%s%c", filename, '\0',  mode, '\0');
@@ -673,9 +676,9 @@ CURLcode Curl_tftp(struct connectdata *conn, bool *done)
   }
 
   /* Run the TFTP State Machine */
-  for(tftp_state_machine(state, TFTP_EVENT_INIT);
-      state->state != TFTP_STATE_FIN;
-      tftp_state_machine(state, event) ) {
+  for(code=tftp_state_machine(state, TFTP_EVENT_INIT);
+      (state->state != TFTP_STATE_FIN) && (code == CURLE_OK);
+      code=tftp_state_machine(state, event) ) {
 
     /* Wait until ready to read or timeout occurs */
     rc=Curl_socket_ready(state->sockfd, CURL_SOCKET_BAD, state->retry_time * 1000);
@@ -761,6 +764,8 @@ CURLcode Curl_tftp(struct connectdata *conn, bool *done)
     }
 
   }
+  if(code)
+    return code;
 
   /* Tell curl we're done */
   code = Curl_setup_transfer(conn, -1, -1, FALSE, NULL, -1, NULL);