~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add some more precautionary assertions, just in case anything wildly
[sgt/putty]
/
pscp.c
diff --git
a/pscp.c
b/pscp.c
index
4c6aba7
..
6f38a20
100644
(file)
--- a/
pscp.c
+++ b/
pscp.c
@@
-129,6
+129,19
@@
void modalfatalbox(char *fmt, ...)
cleanup_exit(1);
}
cleanup_exit(1);
}
+void nonfatal(char *fmt, ...)
+{
+ char *str, *str2;
+ va_list ap;
+ va_start(ap, fmt);
+ str = dupvprintf(fmt, ap);
+ str2 = dupcat("Error: ", str, "\n", NULL);
+ sfree(str);
+ va_end(ap);
+ tell_str(stderr, str2);
+ sfree(str2);
+ errs++;
+}
void connection_fatal(void *frontend, char *fmt, ...)
{
char *str, *str2;
void connection_fatal(void *frontend, char *fmt, ...)
{
char *str, *str2;
@@
-526,7
+539,7
@@
static void do_cmd(char *host, char *user, char *cmd)
console_provide_logctx(logctx);
ssh_scp_init();
if (verbose && realhost != NULL && errs == 0)
console_provide_logctx(logctx);
ssh_scp_init();
if (verbose && realhost != NULL && errs == 0)
- tell_user(stderr, "Connected to %s
\n
", realhost);
+ tell_user(stderr, "Connected to %s", realhost);
sfree(realhost);
}
sfree(realhost);
}
@@
-675,7
+688,7
@@
static int response(void)
} while (p < sizeof(rbuf) && ch != '\n');
rbuf[p - 1] = '\0';
if (resp == 1)
} while (p < sizeof(rbuf) && ch != '\n');
rbuf[p - 1] = '\0';
if (resp == 1)
- tell_user(stderr, "%s
\n
", rbuf);
+ tell_user(stderr, "%s", rbuf);
else
bump("%s", rbuf);
errs++;
else
bump("%s", rbuf);
errs++;
@@
-773,6
+786,8
@@
void scp_sftp_listdir(char *dirname)
*/
for (i = 0; i < nnames; i++)
printf("%s\n", ournames[i].longname);
*/
for (i = 0; i < nnames; i++)
printf("%s\n", ournames[i].longname);
+
+ sfree(ournames);
}
}
}
}
@@
-891,6
+906,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());
if (!scp_sftp_filehandle) {
tell_user(stderr, "pscp: unable to open %s: %s",
fullname, fxp_error());
+ sfree(fullname);
errs++;
return 1;
}
errs++;
return 1;
}
@@
-927,7
+943,9
@@
int scp_send_filedata(char *data, int len)
pktin = sftp_recv();
ret = xfer_upload_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
pktin = sftp_recv();
ret = xfer_upload_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
- tell_user(stderr, "error while writing: %s\n", fxp_error());
+ tell_user(stderr, "error while writing: %s", fxp_error());
+ if (ret == INT_MIN) /* pktin not even freed */
+ sfree(pktin);
errs++;
return 1;
}
errs++;
return 1;
}
@@
-968,7
+986,9
@@
int scp_send_finish(void)
pktin = sftp_recv();
ret = xfer_upload_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
pktin = sftp_recv();
ret = xfer_upload_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
- tell_user(stderr, "error while writing: %s\n", fxp_error());
+ tell_user(stderr, "error while writing: %s", fxp_error());
+ if (ret == INT_MIN) /* pktin not even freed */
+ sfree(pktin);
errs++;
return 1;
}
errs++;
return 1;
}
@@
-986,7
+1006,7
@@
int scp_send_finish(void)
pktin = sftp_wait_for_reply(req);
ret = fxp_fsetstat_recv(pktin, req);
if (!ret) {
pktin = sftp_wait_for_reply(req);
ret = fxp_fsetstat_recv(pktin, req);
if (!ret) {
- tell_user(stderr, "unable to set file times: %s
\n
", fxp_error());
+ tell_user(stderr, "unable to set file times: %s", fxp_error());
errs++;
}
}
errs++;
}
}
@@
-1055,6
+1075,7
@@
int scp_send_dirname(char *name, int modes)
!(attrs.permissions & 0040000)) {
tell_user(stderr, "unable to create directory %s: %s",
fullname, err);
!(attrs.permissions & 0040000)) {
tell_user(stderr, "unable to create directory %s: %s",
fullname, err);
+ sfree(fullname);
errs++;
return 1;
}
errs++;
return 1;
}
@@
-1110,6
+1131,9
@@
int scp_sink_setup(char *source, int preserve, int recursive)
if (!wc_unescape(newsource, source)) {
/* Yes, here we go; it's a wildcard. Bah. */
char *dupsource, *lastpart, *dirpart, *wildcard;
if (!wc_unescape(newsource, source)) {
/* Yes, here we go; it's a wildcard. Bah. */
char *dupsource, *lastpart, *dirpart, *wildcard;
+
+ sfree(newsource);
+
dupsource = dupstr(source);
lastpart = stripslashes(dupsource, 0);
wildcard = dupstr(lastpart);
dupsource = dupstr(source);
lastpart = stripslashes(dupsource, 0);
wildcard = dupstr(lastpart);
@@
-1275,6
+1299,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 (!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;
}
errs++;
return 1;
}
@@
-1328,7
+1353,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
dirhandle = fxp_opendir_recv(pktin, req);
if (!dirhandle) {
dirhandle = fxp_opendir_recv(pktin, req);
if (!dirhandle) {
- tell_user(stderr, "scp: unable to open directory %s: %s",
+ tell_user(stderr, "
p
scp: unable to open directory %s: %s",
fname, fxp_error());
if (must_free_fname) sfree(fname);
errs++;
fname, fxp_error());
if (must_free_fname) sfree(fname);
errs++;
@@
-1346,7
+1371,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
if (names == NULL) {
if (fxp_error_type() == SSH_FX_EOF)
break;
if (names == NULL) {
if (fxp_error_type() == SSH_FX_EOF)
break;
- tell_user(stderr, "
scp: reading directory %s: %s\n
",
+ tell_user(stderr, "
pscp: reading directory %s: %s
",
fname, fxp_error());
req = fxp_close_send(dirhandle);
fname, fxp_error());
req = fxp_close_send(dirhandle);
@@
-1376,7
+1401,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
*/
} else if (!vet_filename(names->names[i].filename)) {
tell_user(stderr, "ignoring potentially dangerous server-"
*/
} else if (!vet_filename(names->names[i].filename)) {
tell_user(stderr, "ignoring potentially dangerous server-"
- "supplied filename '%s'
\n
",
+ "supplied filename '%s'",
names->names[i].filename);
} else
ournames[nnames++] = names->names[i];
names->names[i].filename);
} else
ournames[nnames++] = names->names[i];
@@
-1479,7
+1504,7
@@
int scp_get_sink_action(struct scp_sink_action *act)
act->buf[i - 1] = '\0';
switch (action) {
case '\01': /* error */
act->buf[i - 1] = '\0';
switch (action) {
case '\01': /* error */
- tell_user(stderr, "%s
\n
", act->buf);
+ tell_user(stderr, "%s", act->buf);
errs++;
continue; /* go round again */
case '\02': /* fatal error */
errs++;
continue; /* go round again */
case '\02': /* fatal error */
@@
-1566,6
+1591,8
@@
int scp_recv_filedata(char *data, int len)
ret = xfer_download_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
tell_user(stderr, "pscp: error while reading: %s", fxp_error());
ret = xfer_download_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
tell_user(stderr, "pscp: error while reading: %s", fxp_error());
+ if (ret == INT_MIN) /* pktin not even freed */
+ sfree(pktin);
errs++;
return -1;
}
errs++;
return -1;
}
@@
-1611,6
+1638,8
@@
int scp_finish_filerecv(void)
ret = xfer_download_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
tell_user(stderr, "pscp: error while reading: %s", fxp_error());
ret = xfer_download_gotpkt(scp_sftp_xfer, pktin);
if (ret <= 0) {
tell_user(stderr, "pscp: error while reading: %s", fxp_error());
+ if (ret == INT_MIN) /* pktin not even freed */
+ sfree(pktin);
errs++;
return -1;
}
errs++;
return -1;
}
@@
-1640,7
+1669,7
@@
static void run_err(const char *fmt, ...)
va_start(ap, fmt);
errs++;
str = dupvprintf(fmt, ap);
va_start(ap, fmt);
errs++;
str = dupvprintf(fmt, ap);
- str2 = dupcat("scp: ", str, "\n", NULL);
+ str2 = dupcat("
p
scp: ", str, "\n", NULL);
sfree(str);
scp_send_errmsg(str2);
tell_user(stderr, "%s", str2);
sfree(str);
scp_send_errmsg(str2);
tell_user(stderr, "%s", str2);
@@
-1709,8
+1738,10
@@
static void source(char *src)
return;
}
if (preserve) {
return;
}
if (preserve) {
- if (scp_send_filetimes(mtime, atime))
+ if (scp_send_filetimes(mtime, atime)) {
+ close_rfile(f);
return;
return;
+ }
}
if (verbose) {
}
if (verbose) {
@@
-1718,8
+1749,10
@@
static void source(char *src)
uint64_decimal(size, sizestr);
tell_user(stderr, "Sending file %s, size=%s", last, sizestr);
}
uint64_decimal(size, sizestr);
tell_user(stderr, "Sending file %s, size=%s", last, sizestr);
}
- if (scp_send_filename(last, size, permissions))
+ if (scp_send_filename(last, size, permissions)) {
+ close_rfile(f);
return;
return;
+ }
stat_bytes = uint64_make(0,0);
stat_starttime = time(NULL);
stat_bytes = uint64_make(0,0);
stat_starttime = time(NULL);
@@
-1922,27
+1955,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);
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);
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 ? */
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);
continue;
}
f = open_new_file(destfname, act.permissions);
if (f == NULL) {
run_err("%s: Cannot create file", destfname);
+ sfree(destfname);
continue;
}
continue;
}
- if (scp_accept_filexfer())
+ if (scp_accept_filexfer()) {
+ sfree(destfname);
+ close_wfile(f);
return;
return;
+ }
stat_bytes = uint64_make(0, 0);
stat_starttime = time(NULL);
stat_bytes = uint64_make(0, 0);
stat_starttime = time(NULL);
@@
-1989,6
+2029,7
@@
static void sink(char *targ, char *src)
close_wfile(f);
if (wrerror) {
run_err("%s: Write error", destfname);
close_wfile(f);
if (wrerror) {
run_err("%s: Write error", destfname);
+ sfree(destfname);
continue;
}
(void) scp_finish_filerecv();
continue;
}
(void) scp_finish_filerecv();