annotate network/openssh/CVE-2019-6111.patch @ 392:8017138b628e

lib: convert packages to clang
author David Demelier <markand@malikania.fr>
date Tue, 02 Apr 2019 20:01:00 +0200
parents f2c94d482098
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 From 125924e47db3713a85a70e0f8d6c23818d2ea054 Mon Sep 17 00:00:00 2001
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 From: "djm@openbsd.org" <djm@openbsd.org>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 Date: Sat, 26 Jan 2019 22:41:28 +0000
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 Subject: upstream: check in scp client that filenames sent during
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
5
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 remote->local directory copies satisfy the wildcard specified by the user.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 This checking provides some protection against a malicious server
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 sending unexpected filenames, but it comes at a risk of rejecting wanted
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 files due to differences between client and server wildcard expansion rules.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
11
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 For this reason, this also adds a new -T flag to disable the check.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
13
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 reported by Harry Sintonen
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 fix approach suggested by markus@;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 has been in snaps for ~1wk courtesy deraadt@
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
17
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 OpenBSD-Commit-ID: 00f44b50d2be8e321973f3c6d014260f8f7a8eda
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
19
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 CVE-2019-6111
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 Origin: backport, https://anongit.mindrot.org/openssh.git/commit/?id=391ffc4b9d31fa1f4ad566499fef9176ff8a07dc
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 Last-Update: 2019-02-08
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 Patch-Name: check-filenames-in-scp-client.patch
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 ---
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 scp.1 | 12 +++++++++++-
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 scp.c | 37 +++++++++++++++++++++++++++++--------
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 2 files changed, 40 insertions(+), 9 deletions(-)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 diff --git a/scp.1 b/scp.1
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 index 0e5cc1b2d..397e77091 100644
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 --- a/scp.1
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 +++ b/scp.1
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 @@ -18,7 +18,7 @@
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 .Nd secure copy (remote file copy program)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 .Sh SYNOPSIS
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 .Nm scp
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 -.Op Fl 346BCpqrv
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 +.Op Fl 346BCpqrTv
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 .Op Fl c Ar cipher
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 .Op Fl F Ar ssh_config
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 .Op Fl i Ar identity_file
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 @@ -208,6 +208,16 @@ to use for the encrypted connection.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 The program must understand
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 .Xr ssh 1
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 options.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 +.It Fl T
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 +Disable strict filename checking.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 +By default when copying files from a remote host to a local directory
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 +.Nm
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 +checks that the received filenames match those requested on the command-line
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 +to prevent the remote end from sending unexpected or unwanted files.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 +Because of differences in how various operating systems and shells interpret
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 +filename wildcards, these checks may cause wanted files to be rejected.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 +This option disables these checks at the expense of fully trusting that
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 +the server will not send unexpected filenames.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 .It Fl v
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 Verbose mode.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 Causes
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 diff --git a/scp.c b/scp.c
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 index 1971c80cd..035037bcc 100644
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 --- a/scp.c
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 +++ b/scp.c
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 @@ -94,6 +94,7 @@
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 #include <dirent.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 #include <errno.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 #include <fcntl.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 +#include <fnmatch.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 #include <limits.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 #include <locale.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 #include <pwd.h>
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 @@ -383,14 +384,14 @@ void verifydir(char *);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 struct passwd *pwd;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 uid_t userid;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 int errs, remin, remout;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 -int pflag, iamremote, iamrecursive, targetshouldbedirectory;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 +int Tflag, pflag, iamremote, iamrecursive, targetshouldbedirectory;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 #define CMDNEEDS 64
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 char cmd[CMDNEEDS]; /* must hold "rcp -r -p -d\0" */
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 int response(void);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 void rsource(char *, struct stat *);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 -void sink(int, char *[]);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 +void sink(int, char *[], const char *);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 void source(int, char *[]);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 void tolocal(int, char *[]);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 void toremote(int, char *[]);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 @@ -429,8 +430,9 @@ main(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 addargs(&args, "-oRemoteCommand=none");
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 addargs(&args, "-oRequestTTY=no");
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 - fflag = tflag = 0;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 - while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q12346S:o:F:")) != -1)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 + fflag = Tflag = tflag = 0;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 + while ((ch = getopt(argc, argv,
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 + "dfl:prtTvBCc:i:P:q12346S:o:F:")) != -1) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 switch (ch) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 /* User-visible flags. */
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 case '1':
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 @@ -509,9 +511,13 @@ main(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 setmode(0, O_BINARY);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 #endif
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 break;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 + case 'T':
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 + Tflag = 1;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 + break;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 default:
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 usage();
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 + }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 argc -= optind;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 argv += optind;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 @@ -542,7 +548,7 @@ main(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 if (tflag) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 /* Receive data. */
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 - sink(argc, argv);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 + sink(argc, argv, NULL);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 exit(errs != 0);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 if (argc < 2)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 @@ -800,7 +806,7 @@ tolocal(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 continue;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 free(bp);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 - sink(1, argv + argc - 1);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 + sink(1, argv + argc - 1, src);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 (void) close(remin);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 remin = remout = -1;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 @@ -976,7 +982,7 @@ rsource(char *name, struct stat *statp)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 (sizeof(type) != 4 && sizeof(type) != 8))
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 void
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 -sink(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 +sink(int argc, char **argv, const char *src)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 static BUF buffer;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 struct stat stb;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 @@ -992,6 +998,7 @@ sink(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 unsigned long long ull;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 int setimes, targisdir, wrerrno = 0;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 char ch, *cp, *np, *targ, *why, *vect[1], buf[2048], visbuf[2048];
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 + char *src_copy = NULL, *restrict_pattern = NULL;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 struct timeval tv[2];
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 #define atime tv[0]
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 @@ -1016,6 +1023,17 @@ sink(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 (void) atomicio(vwrite, remout, "", 1);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 if (stat(targ, &stb) == 0 && S_ISDIR(stb.st_mode))
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 targisdir = 1;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 + if (src != NULL && !iamrecursive && !Tflag) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 + /*
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 + * Prepare to try to restrict incoming filenames to match
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 + * the requested destination file glob.
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 + */
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 + if ((src_copy = strdup(src)) == NULL)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 + fatal("strdup failed");
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 + if ((restrict_pattern = strrchr(src_copy, '/')) != NULL) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 + *restrict_pattern++ = '\0';
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 + }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 + }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 for (first = 1;; first = 0) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 cp = buf;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 if (atomicio(read, remin, cp, 1) != 1)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 @@ -1120,6 +1138,9 @@ sink(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 run_err("error: unexpected filename: %s", cp);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 exit(1);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 + if (restrict_pattern != NULL &&
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 + fnmatch(restrict_pattern, cp, 0) != 0)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 + SCREWUP("filename does not match request");
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 if (targisdir) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 static char *namebuf;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 static size_t cursize;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 @@ -1157,7 +1178,7 @@ sink(int argc, char **argv)
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 goto bad;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 vect[0] = xstrdup(np);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 - sink(1, vect);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 + sink(1, vect, src);
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 if (setimes) {
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 setimes = 0;
f2c94d482098 network/openssh: initial import, closes #1156
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 if (utimes(vect[0], tv) < 0)