/* easy-to-use macro: */
#define FTPSENDF(x,y,z) if((result = Curl_ftpsendf(x,y,z))) return result
+static void freedirs(struct FTP *ftp)
+{
+ int i;
+ for (i=0; ftp->dirs[i]; i++){
+ free(ftp->dirs[i]);
+ ftp->dirs[i]=NULL;
+ }
+}
+
/***********************************************************************
*
* AllowServerConnect()
int ftpcode;
CURLcode result=CURLE_OK;
+ /* free the dir tree parts */
+ freedirs(ftp);
+
+ if(ftp->file) {
+ free(ftp->file);
+ ftp->file = NULL;
+ }
+
if(data->set.upload) {
if((-1 != data->set.infilesize) &&
(data->set.infilesize != *ftp->bytecountp) &&
if (!ftp->dirs[path_part]) { /* run out of memory ... */
failf(data, "no memory");
- retcode = CURLE_OUT_OF_MEMORY;
+ freedirs(ftp);
+ return CURLE_OUT_OF_MEMORY;
}
}
else {
/* too deep, we need the last entry to be kept NULL at all
times to signal end of list */
failf(data, "too deep dir hierarchy");
- retcode = CURLE_URL_MALFORMAT;
+ freedirs(ftp);
+ return CURLE_URL_MALFORMAT;
}
}
- if (retcode) {
- int i;
- for (i=0;i<path_part;i++) { /* free previous parts */
- free(ftp->dirs[i]);
- ftp->dirs[i]=NULL;
- }
- return retcode; /* failure */
- }
}
ftp->file = cur_pos; /* the rest is the file name */
if(*ftp->file) {
ftp->file = curl_unescape(ftp->file, 0);
if(NULL == ftp->file) {
- int i;
- for (i=0;i<path_part;i++){
- free(ftp->dirs[i]);
- ftp->dirs[i]=NULL;
- }
+ freedirs(ftp);
failf(data, "no memory");
return CURLE_OUT_OF_MEMORY;
}
CURLcode Curl_ftp_disconnect(struct connectdata *conn)
{
struct FTP *ftp= conn->proto.ftp;
- int i;
/* The FTP session may or may not have been allocated/setup at this point! */
if(ftp) {
if(ftp->entrypath)
free(ftp->entrypath);
- if(ftp->cache)
+ if(ftp->cache) {
free(ftp->cache);
- if(ftp->file)
+ ftp->cache = NULL;
+ }
+ if(ftp->file) {
free(ftp->file);
- for (i=0;ftp->dirs[i];i++){
- free(ftp->dirs[i]);
- ftp->dirs[i]=NULL;
+ ftp->file = NULL; /* zero */
}
-
- ftp->file = NULL; /* zero */
+ freedirs(ftp);
}
return CURLE_OK;
}