projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty]
/
pscp.c
diff --git
a/pscp.c
b/pscp.c
index
a6886d7
..
3209932
100644
(file)
--- a/
pscp.c
+++ b/
pscp.c
@@
-41,6
+41,7
@@
static int try_sftp = 1;
static int main_cmd_is_sftp = 0;
static int fallback_cmd_is_sftp = 0;
static int using_sftp = 0;
static int main_cmd_is_sftp = 0;
static int fallback_cmd_is_sftp = 0;
static int using_sftp = 0;
+static int uploading = 0;
static Backend *back;
static void *backhandle;
static Backend *back;
static void *backhandle;
@@
-129,6
+130,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;
@@
-218,11
+232,12
@@
int from_backend_untrusted(void *frontend_handle, const char *data, int len)
int from_backend_eof(void *frontend)
{
/*
int from_backend_eof(void *frontend)
{
/*
- * We expect to be the party deciding when to close the
+ * We
usually
expect to be the party deciding when to close the
* connection, so if we see EOF before we sent it ourselves, we
* connection, so if we see EOF before we sent it ourselves, we
- * should panic.
+ * should panic. The exception is if we're using old-style scp and
+ * downloading rather than uploading.
*/
*/
- if (!sent_eof) {
+ if (
(using_sftp || uploading) &&
!sent_eof) {
connection_fatal(frontend,
"Received unexpected end-of-file from server");
}
connection_fatal(frontend,
"Received unexpected end-of-file from server");
}
@@
-1118,6
+1133,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);
@@
-1722,8
+1740,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) {
@@
-1731,8
+1751,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);
@@
-2006,7
+2028,6
@@
static void sink(char *targ, char *src)
set_file_times(f, act.mtime, act.atime);
}
set_file_times(f, act.mtime, act.atime);
}
- sfree(stat_name);
close_wfile(f);
if (wrerror) {
run_err("%s: Write error", destfname);
close_wfile(f);
if (wrerror) {
run_err("%s: Write error", destfname);
@@
-2028,6
+2049,8
@@
static void toremote(int argc, char *argv[])
char *cmd;
int i, wc_type;
char *cmd;
int i, wc_type;
+ uploading = 1;
+
targ = argv[argc - 1];
/* Separate host from filename */
targ = argv[argc - 1];
/* Separate host from filename */
@@
-2117,6
+2140,8
@@
static void tolocal(int argc, char *argv[])
char *src, *targ, *host, *user;
char *cmd;
char *src, *targ, *host, *user;
char *cmd;
+ uploading = 0;
+
if (argc != 2)
bump("More than one remote source not supported");
if (argc != 2)
bump("More than one remote source not supported");