From c570c83a03a82c066819cc8b02209e756b665f1e Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 11 Jul 2013 17:43:41 +0000 Subject: [PATCH] Add an assortment of missing frees, and one missing file close. Mostly on error paths, although the one in PSFTP's wildcard_iterate will come up in normal usage. git-svn-id: svn://svn.tartarus.org/sgt/putty@9916 cda61777-01e9-0310-a592-d414129be87e --- pscp.c | 16 +++++++++++++++- psftp.c | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pscp.c b/pscp.c index 50bea930..a6886d76 100644 --- a/pscp.c +++ b/pscp.c @@ -773,6 +773,8 @@ void scp_sftp_listdir(char *dirname) */ for (i = 0; i < nnames; i++) printf("%s\n", ournames[i].longname); + + sfree(ournames); } } @@ -891,6 +893,7 @@ int scp_send_filename(char *name, uint64 size, int permissions) if (!scp_sftp_filehandle) { tell_user(stderr, "pscp: unable to open %s: %s", fullname, fxp_error()); + sfree(fullname); errs++; return 1; } @@ -1059,6 +1062,7 @@ int scp_send_dirname(char *name, int modes) !(attrs.permissions & 0040000)) { tell_user(stderr, "unable to create directory %s: %s", fullname, err); + sfree(fullname); errs++; return 1; } @@ -1279,6 +1283,7 @@ int scp_get_sink_action(struct scp_sink_action *act) if (!ret || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) { tell_user(stderr, "unable to identify %s: %s", fname, ret ? "file type not supplied" : fxp_error()); + if (must_free_fname) sfree(fname); errs++; return 1; } @@ -1930,27 +1935,34 @@ static void sink(char *targ, char *src) if (act.action == SCP_SINK_DIR) { if (exists && attr != FILE_TYPE_DIRECTORY) { run_err("%s: Not a directory", destfname); + sfree(destfname); continue; } if (!exists) { if (!create_directory(destfname)) { run_err("%s: Cannot create directory", destfname); + sfree(destfname); continue; } } sink(destfname, NULL); /* can we set the timestamp for directories ? */ + sfree(destfname); continue; } f = open_new_file(destfname, act.permissions); if (f == NULL) { run_err("%s: Cannot create file", destfname); + sfree(destfname); continue; } - if (scp_accept_filexfer()) + if (scp_accept_filexfer()) { + sfree(destfname); + close_wfile(f); return; + } stat_bytes = uint64_make(0, 0); stat_starttime = time(NULL); @@ -1994,9 +2006,11 @@ static void sink(char *targ, char *src) set_file_times(f, act.mtime, act.atime); } + sfree(stat_name); close_wfile(f); if (wrerror) { run_err("%s: Write error", destfname); + sfree(destfname); continue; } (void) scp_finish_filerecv(); diff --git a/psftp.c b/psftp.c index 5bc7d7c8..c7a8486b 100644 --- a/psftp.c +++ b/psftp.c @@ -922,6 +922,7 @@ int wildcard_iterate(char *filename, int (*func)(void *, char *), void *ctx) printf("%s: canonify: %s\n", newname, fxp_error()); ret = 0; } + sfree(newname); matched = TRUE; ret &= func(ctx, cname); sfree(cname); -- 2.11.0