summaryrefslogtreecommitdiff
path: root/openbsd-compat
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2011-01-24 12:43:25 +0000
committerColin Watson <cjwatson@debian.org>2011-01-24 12:43:25 +0000
commit626f1d986ff72aa514da63e34744e1de9cf21b9a (patch)
treed215a5280bc2e57251e4a9e08bfd3674ad824a94 /openbsd-compat
parent6ed622cb6fe8f71bbe0d998cdd12280410bfb420 (diff)
parent0970072c89b079b022538e3c366fbfa2c53fc821 (diff)
* New upstream release (http://www.openssh.org/txt/release-5.7):
- Implement Elliptic Curve Cryptography modes for key exchange (ECDH) and host/user keys (ECDSA) as specified by RFC5656. ECDH and ECDSA offer better performance than plain DH and DSA at the same equivalent symmetric key length, as well as much shorter keys. - sftp(1)/sftp-server(8): add a protocol extension to support a hard link operation. It is available through the "ln" command in the client. The old "ln" behaviour of creating a symlink is available using its "-s" option or through the preexisting "symlink" command. - scp(1): Add a new -3 option to scp: Copies between two remote hosts are transferred through the local host (closes: #508613). - ssh(1): "atomically" create the listening mux socket by binding it on a temporary name and then linking it into position after listen() has succeeded. This allows the mux clients to determine that the server socket is either ready or stale without races (closes: #454784). Stale server sockets are now automatically removed (closes: #523250). - ssh(1): install a SIGCHLD handler to reap expired child process (closes: #594687). - ssh(1)/ssh-agent(1): honour $TMPDIR for client xauth and ssh-agent temporary directories (closes: #357469, although only if you arrange for ssh-agent to actually see $TMPDIR since the setgid bit will cause it to be stripped off).
Diffstat (limited to 'openbsd-compat')
-rw-r--r--openbsd-compat/Makefile.in4
-rw-r--r--openbsd-compat/bindresvport.c2
-rw-r--r--openbsd-compat/bsd-misc.c7
-rw-r--r--openbsd-compat/bsd-misc.h6
-rw-r--r--openbsd-compat/charclass.h31
-rw-r--r--openbsd-compat/glob.c306
-rw-r--r--openbsd-compat/glob.h13
-rw-r--r--openbsd-compat/openbsd-compat.h6
-rw-r--r--openbsd-compat/openssl-compat.c76
-rw-r--r--openbsd-compat/openssl-compat.h26
-rw-r--r--openbsd-compat/port-linux.c57
-rw-r--r--openbsd-compat/port-solaris.c32
-rw-r--r--openbsd-compat/port-solaris.h5
-rw-r--r--openbsd-compat/timingsafe_bcmp.c34
14 files changed, 488 insertions, 117 deletions
diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
index d22efd66c..41b22d837 100644
--- a/openbsd-compat/Makefile.in
+++ b/openbsd-compat/Makefile.in
@@ -1,4 +1,4 @@
1# $Id: Makefile.in,v 1.45 2010/08/16 03:15:23 dtucker Exp $ 1# $Id: Makefile.in,v 1.46 2010/10/07 11:19:24 djm Exp $
2 2
3sysconfdir=@sysconfdir@ 3sysconfdir=@sysconfdir@
4piddir=@piddir@ 4piddir=@piddir@
@@ -16,7 +16,7 @@ RANLIB=@RANLIB@
16INSTALL=@INSTALL@ 16INSTALL=@INSTALL@
17LDFLAGS=-L. @LDFLAGS@ 17LDFLAGS=-L. @LDFLAGS@
18 18
19OPENBSD=base64.o basename.o bindresvport.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o pwcache.o readpassphrase.o realpath.o rresvport.o setenv.o setproctitle.o sha2.o sigact.o strlcat.o strlcpy.o strmode.o strptime.o strsep.o strtonum.o strtoll.o strtoul.o vis.o 19OPENBSD=base64.o basename.o bindresvport.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o pwcache.o readpassphrase.o realpath.o rresvport.o setenv.o setproctitle.o sha2.o sigact.o strlcat.o strlcpy.o strmode.o strptime.o strsep.o strtonum.o strtoll.o strtoul.o timingsafe_bcmp.o vis.o
20 20
21COMPAT=bsd-arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o 21COMPAT=bsd-arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o
22 22
diff --git a/openbsd-compat/bindresvport.c b/openbsd-compat/bindresvport.c
index c0d5bdb5c..c89f21403 100644
--- a/openbsd-compat/bindresvport.c
+++ b/openbsd-compat/bindresvport.c
@@ -89,7 +89,7 @@ bindresvport_sa(int sd, struct sockaddr *sa)
89 89
90 port = ntohs(*portp); 90 port = ntohs(*portp);
91 if (port == 0) 91 if (port == 0)
92 port = (arc4random() % NPORTS) + STARTPORT; 92 port = arc4random_uniform(NPORTS) + STARTPORT;
93 93
94 /* Avoid warning */ 94 /* Avoid warning */
95 error = -1; 95 error = -1;
diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c
index 55f100ac0..3ef373f56 100644
--- a/openbsd-compat/bsd-misc.c
+++ b/openbsd-compat/bsd-misc.c
@@ -240,3 +240,10 @@ strdup(const char *str)
240 return NULL; 240 return NULL;
241} 241}
242#endif 242#endif
243
244#ifndef HAVE_ISBLANK
245int isblank(int c)
246{
247 return (c == ' ' || c == '\t');
248}
249#endif
diff --git a/openbsd-compat/bsd-misc.h b/openbsd-compat/bsd-misc.h
index b61ec4244..e70c3f9e9 100644
--- a/openbsd-compat/bsd-misc.h
+++ b/openbsd-compat/bsd-misc.h
@@ -1,4 +1,4 @@
1/* $Id: bsd-misc.h,v 1.18 2005/02/25 23:07:38 dtucker Exp $ */ 1/* $Id: bsd-misc.h,v 1.19 2010/11/08 22:26:23 tim Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> 4 * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org>
@@ -95,4 +95,8 @@ mysig_t mysignal(int sig, mysig_t act);
95 95
96#define signal(a,b) mysignal(a,b) 96#define signal(a,b) mysignal(a,b)
97 97
98#ifndef HAVE_ISBLANK
99int isblank(int);
100#endif
101
98#endif /* _BSD_MISC_H */ 102#endif /* _BSD_MISC_H */
diff --git a/openbsd-compat/charclass.h b/openbsd-compat/charclass.h
new file mode 100644
index 000000000..91f517447
--- /dev/null
+++ b/openbsd-compat/charclass.h
@@ -0,0 +1,31 @@
1/*
2 * Public domain, 2008, Todd C. Miller <Todd.Miller@courtesan.com>
3 *
4 * $OpenBSD: charclass.h,v 1.1 2008/10/01 23:04:13 millert Exp $
5 */
6
7/* OPENBSD ORIGINAL: lib/libc/gen/charclass.h */
8
9/*
10 * POSIX character class support for fnmatch() and glob().
11 */
12static struct cclass {
13 const char *name;
14 int (*isctype)(int);
15} cclasses[] = {
16 { "alnum", isalnum },
17 { "alpha", isalpha },
18 { "blank", isblank },
19 { "cntrl", iscntrl },
20 { "digit", isdigit },
21 { "graph", isgraph },
22 { "lower", islower },
23 { "print", isprint },
24 { "punct", ispunct },
25 { "space", isspace },
26 { "upper", isupper },
27 { "xdigit", isxdigit },
28 { NULL, NULL }
29};
30
31#define NCCLASSES (sizeof(cclasses) / sizeof(cclasses[0]) - 1)
diff --git a/openbsd-compat/glob.c b/openbsd-compat/glob.c
index 74b506403..0341225cd 100644
--- a/openbsd-compat/glob.c
+++ b/openbsd-compat/glob.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: glob.c,v 1.26 2005/11/28 17:50:12 deraadt Exp $ */ 1/* $OpenBSD: glob.c,v 1.35 2011/01/12 01:53:14 djm Exp $ */
2/* 2/*
3 * Copyright (c) 1989, 1993 3 * Copyright (c) 1989, 1993
4 * The Regents of the University of California. All rights reserved. 4 * The Regents of the University of California. All rights reserved.
@@ -33,36 +33,6 @@
33 33
34/* OPENBSD ORIGINAL: lib/libc/gen/glob.c */ 34/* OPENBSD ORIGINAL: lib/libc/gen/glob.c */
35 35
36#include "includes.h"
37
38#include <sys/types.h>
39#include <sys/stat.h>
40
41#include <dirent.h>
42#include <ctype.h>
43#include <errno.h>
44#include <pwd.h>
45#include <stdlib.h>
46#include <string.h>
47#include <unistd.h>
48
49#if !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) || \
50 !defined(GLOB_HAS_GL_MATCHC) || \
51 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \
52 defined(BROKEN_GLOB)
53
54static long
55get_arg_max(void)
56{
57#ifdef ARG_MAX
58 return(ARG_MAX);
59#elif defined(HAVE_SYSCONF) && defined(_SC_ARG_MAX)
60 return(sysconf(_SC_ARG_MAX));
61#else
62 return(256); /* XXX: arbitrary */
63#endif
64}
65
66/* 36/*
67 * glob(3) -- a superset of the one defined in POSIX 1003.2. 37 * glob(3) -- a superset of the one defined in POSIX 1003.2.
68 * 38 *
@@ -88,6 +58,25 @@ get_arg_max(void)
88 * Number of matches in the current invocation of glob. 58 * Number of matches in the current invocation of glob.
89 */ 59 */
90 60
61#include "includes.h"
62
63#include <sys/types.h>
64#include <sys/stat.h>
65
66#include <dirent.h>
67#include <ctype.h>
68#include <errno.h>
69#include <pwd.h>
70#include <stdlib.h>
71#include <string.h>
72#include <unistd.h>
73
74#if !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) || \
75 !defined(GLOB_HAS_GL_MATCHC) || !defined(GLOB_HAS_GL_STATV) || \
76 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \
77 defined(BROKEN_GLOB)
78
79#include "charclass.h"
91 80
92#define DOLLAR '$' 81#define DOLLAR '$'
93#define DOT '.' 82#define DOT '.'
@@ -100,7 +89,6 @@ get_arg_max(void)
100#define RBRACKET ']' 89#define RBRACKET ']'
101#define SEP '/' 90#define SEP '/'
102#define STAR '*' 91#define STAR '*'
103#undef TILDE /* Some platforms may already define it */
104#define TILDE '~' 92#define TILDE '~'
105#define UNDERSCORE '_' 93#define UNDERSCORE '_'
106#define LBRACE '{' 94#define LBRACE '{'
@@ -137,26 +125,39 @@ typedef char Char;
137#define M_ONE META('?') 125#define M_ONE META('?')
138#define M_RNG META('-') 126#define M_RNG META('-')
139#define M_SET META('[') 127#define M_SET META('[')
128#define M_CLASS META(':')
140#define ismeta(c) (((c)&M_QUOTE) != 0) 129#define ismeta(c) (((c)&M_QUOTE) != 0)
141 130
131#define GLOB_LIMIT_MALLOC 65536
132#define GLOB_LIMIT_STAT 128
133#define GLOB_LIMIT_READDIR 16384
134
135struct glob_lim {
136 size_t glim_malloc;
137 size_t glim_stat;
138 size_t glim_readdir;
139};
142 140
143static int compare(const void *, const void *); 141static int compare(const void *, const void *);
144static int g_Ctoc(const Char *, char *, u_int); 142static int g_Ctoc(const Char *, char *, u_int);
145static int g_lstat(Char *, struct stat *, glob_t *); 143static int g_lstat(Char *, struct stat *, glob_t *);
146static DIR *g_opendir(Char *, glob_t *); 144static DIR *g_opendir(Char *, glob_t *);
147static Char *g_strchr(Char *, int); 145static Char *g_strchr(const Char *, int);
146static int g_strncmp(const Char *, const char *, size_t);
148static int g_stat(Char *, struct stat *, glob_t *); 147static int g_stat(Char *, struct stat *, glob_t *);
149static int glob0(const Char *, glob_t *); 148static int glob0(const Char *, glob_t *, struct glob_lim *);
150static int glob1(Char *, Char *, glob_t *, size_t *); 149static int glob1(Char *, Char *, glob_t *, struct glob_lim *);
151static int glob2(Char *, Char *, Char *, Char *, Char *, Char *, 150static int glob2(Char *, Char *, Char *, Char *, Char *, Char *,
152 glob_t *, size_t *); 151 glob_t *, struct glob_lim *);
153static int glob3(Char *, Char *, Char *, Char *, Char *, 152static int glob3(Char *, Char *, Char *, Char *, Char *,
154 Char *, Char *, glob_t *, size_t *); 153 Char *, Char *, glob_t *, struct glob_lim *);
155static int globextend(const Char *, glob_t *, size_t *); 154static int globextend(const Char *, glob_t *, struct glob_lim *,
155 struct stat *);
156static const Char * 156static const Char *
157 globtilde(const Char *, Char *, size_t, glob_t *); 157 globtilde(const Char *, Char *, size_t, glob_t *);
158static int globexp1(const Char *, glob_t *); 158static int globexp1(const Char *, glob_t *, struct glob_lim *);
159static int globexp2(const Char *, const Char *, glob_t *, int *); 159static int globexp2(const Char *, const Char *, glob_t *,
160 struct glob_lim *);
160static int match(Char *, Char *, Char *); 161static int match(Char *, Char *, Char *);
161#ifdef DEBUG 162#ifdef DEBUG
162static void qprintf(const char *, Char *); 163static void qprintf(const char *, Char *);
@@ -169,11 +170,13 @@ glob(const char *pattern, int flags, int (*errfunc)(const char *, int),
169 const u_char *patnext; 170 const u_char *patnext;
170 int c; 171 int c;
171 Char *bufnext, *bufend, patbuf[MAXPATHLEN]; 172 Char *bufnext, *bufend, patbuf[MAXPATHLEN];
173 struct glob_lim limit = { 0, 0, 0 };
172 174
173 patnext = (u_char *) pattern; 175 patnext = (u_char *) pattern;
174 if (!(flags & GLOB_APPEND)) { 176 if (!(flags & GLOB_APPEND)) {
175 pglob->gl_pathc = 0; 177 pglob->gl_pathc = 0;
176 pglob->gl_pathv = NULL; 178 pglob->gl_pathv = NULL;
179 pglob->gl_statv = NULL;
177 if (!(flags & GLOB_DOOFFS)) 180 if (!(flags & GLOB_DOOFFS))
178 pglob->gl_offs = 0; 181 pglob->gl_offs = 0;
179 } 182 }
@@ -181,6 +184,11 @@ glob(const char *pattern, int flags, int (*errfunc)(const char *, int),
181 pglob->gl_errfunc = errfunc; 184 pglob->gl_errfunc = errfunc;
182 pglob->gl_matchc = 0; 185 pglob->gl_matchc = 0;
183 186
187 if (pglob->gl_offs < 0 || pglob->gl_pathc < 0 ||
188 pglob->gl_offs >= INT_MAX || pglob->gl_pathc >= INT_MAX ||
189 pglob->gl_pathc >= INT_MAX - pglob->gl_offs - 1)
190 return GLOB_NOSPACE;
191
184 bufnext = patbuf; 192 bufnext = patbuf;
185 bufend = bufnext + MAXPATHLEN - 1; 193 bufend = bufnext + MAXPATHLEN - 1;
186 if (flags & GLOB_NOESCAPE) 194 if (flags & GLOB_NOESCAPE)
@@ -201,9 +209,9 @@ glob(const char *pattern, int flags, int (*errfunc)(const char *, int),
201 *bufnext = EOS; 209 *bufnext = EOS;
202 210
203 if (flags & GLOB_BRACE) 211 if (flags & GLOB_BRACE)
204 return globexp1(patbuf, pglob); 212 return globexp1(patbuf, pglob, &limit);
205 else 213 else
206 return glob0(patbuf, pglob); 214 return glob0(patbuf, pglob, &limit);
207} 215}
208 216
209/* 217/*
@@ -212,20 +220,18 @@ glob(const char *pattern, int flags, int (*errfunc)(const char *, int),
212 * characters 220 * characters
213 */ 221 */
214static int 222static int
215globexp1(const Char *pattern, glob_t *pglob) 223globexp1(const Char *pattern, glob_t *pglob, struct glob_lim *limitp)
216{ 224{
217 const Char* ptr = pattern; 225 const Char* ptr = pattern;
218 int rv;
219 226
220 /* Protect a single {}, for find(1), like csh */ 227 /* Protect a single {}, for find(1), like csh */
221 if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) 228 if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS)
222 return glob0(pattern, pglob); 229 return glob0(pattern, pglob, limitp);
223 230
224 while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL) 231 if ((ptr = (const Char *) g_strchr(ptr, LBRACE)) != NULL)
225 if (!globexp2(ptr, pattern, pglob, &rv)) 232 return globexp2(ptr, pattern, pglob, limitp);
226 return rv;
227 233
228 return glob0(pattern, pglob); 234 return glob0(pattern, pglob, limitp);
229} 235}
230 236
231 237
@@ -235,9 +241,10 @@ globexp1(const Char *pattern, glob_t *pglob)
235 * If it fails then it tries to glob the rest of the pattern and returns. 241 * If it fails then it tries to glob the rest of the pattern and returns.
236 */ 242 */
237static int 243static int
238globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv) 244globexp2(const Char *ptr, const Char *pattern, glob_t *pglob,
245 struct glob_lim *limitp)
239{ 246{
240 int i; 247 int i, rv;
241 Char *lm, *ls; 248 Char *lm, *ls;
242 const Char *pe, *pm, *pl; 249 const Char *pe, *pm, *pl;
243 Char patbuf[MAXPATHLEN]; 250 Char patbuf[MAXPATHLEN];
@@ -270,10 +277,8 @@ globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv)
270 } 277 }
271 278
272 /* Non matching braces; just glob the pattern */ 279 /* Non matching braces; just glob the pattern */
273 if (i != 0 || *pe == EOS) { 280 if (i != 0 || *pe == EOS)
274 *rv = glob0(patbuf, pglob); 281 return glob0(patbuf, pglob, limitp);
275 return 0;
276 }
277 282
278 for (i = 0, pl = pm = ptr; pm <= pe; pm++) { 283 for (i = 0, pl = pm = ptr; pm <= pe; pm++) {
279 switch (*pm) { 284 switch (*pm) {
@@ -319,7 +324,9 @@ globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv)
319#ifdef DEBUG 324#ifdef DEBUG
320 qprintf("globexp2:", patbuf); 325 qprintf("globexp2:", patbuf);
321#endif 326#endif
322 *rv = globexp1(patbuf, pglob); 327 rv = globexp1(patbuf, pglob, limitp);
328 if (rv && rv != GLOB_NOMATCH)
329 return rv;
323 330
324 /* move after the comma, to the next string */ 331 /* move after the comma, to the next string */
325 pl = pm + 1; 332 pl = pm + 1;
@@ -330,7 +337,6 @@ globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv)
330 break; 337 break;
331 } 338 }
332 } 339 }
333 *rv = 0;
334 return 0; 340 return 0;
335} 341}
336 342
@@ -399,6 +405,47 @@ globtilde(const Char *pattern, Char *patbuf, size_t patbuf_len, glob_t *pglob)
399 return patbuf; 405 return patbuf;
400} 406}
401 407
408static int
409g_strncmp(const Char *s1, const char *s2, size_t n)
410{
411 int rv = 0;
412
413 while (n--) {
414 rv = *(Char *)s1 - *(const unsigned char *)s2++;
415 if (rv)
416 break;
417 if (*s1++ == '\0')
418 break;
419 }
420 return rv;
421}
422
423static int
424g_charclass(const Char **patternp, Char **bufnextp)
425{
426 const Char *pattern = *patternp + 1;
427 Char *bufnext = *bufnextp;
428 const Char *colon;
429 struct cclass *cc;
430 size_t len;
431
432 if ((colon = g_strchr(pattern, ':')) == NULL || colon[1] != ']')
433 return 1; /* not a character class */
434
435 len = (size_t)(colon - pattern);
436 for (cc = cclasses; cc->name != NULL; cc++) {
437 if (!g_strncmp(pattern, cc->name, len) && cc->name[len] == '\0')
438 break;
439 }
440 if (cc->name == NULL)
441 return -1; /* invalid character class */
442 *bufnext++ = M_CLASS;
443 *bufnext++ = (Char)(cc - &cclasses[0]);
444 *bufnextp = bufnext;
445 *patternp += len + 3;
446
447 return 0;
448}
402 449
403/* 450/*
404 * The main glob() routine: compiles the pattern (optionally processing 451 * The main glob() routine: compiles the pattern (optionally processing
@@ -408,12 +455,11 @@ globtilde(const Char *pattern, Char *patbuf, size_t patbuf_len, glob_t *pglob)
408 * to find no matches. 455 * to find no matches.
409 */ 456 */
410static int 457static int
411glob0(const Char *pattern, glob_t *pglob) 458glob0(const Char *pattern, glob_t *pglob, struct glob_lim *limitp)
412{ 459{
413 const Char *qpatnext; 460 const Char *qpatnext;
414 int c, err, oldpathc; 461 int c, err, oldpathc;
415 Char *bufnext, patbuf[MAXPATHLEN]; 462 Char *bufnext, patbuf[MAXPATHLEN];
416 size_t limit = 0;
417 463
418 qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob); 464 qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob);
419 oldpathc = pglob->gl_pathc; 465 oldpathc = pglob->gl_pathc;
@@ -427,7 +473,7 @@ glob0(const Char *pattern, glob_t *pglob)
427 if (c == NOT) 473 if (c == NOT)
428 ++qpatnext; 474 ++qpatnext;
429 if (*qpatnext == EOS || 475 if (*qpatnext == EOS ||
430 g_strchr((Char *) qpatnext+1, RBRACKET) == NULL) { 476 g_strchr(qpatnext+1, RBRACKET) == NULL) {
431 *bufnext++ = LBRACKET; 477 *bufnext++ = LBRACKET;
432 if (c == NOT) 478 if (c == NOT)
433 --qpatnext; 479 --qpatnext;
@@ -438,6 +484,20 @@ glob0(const Char *pattern, glob_t *pglob)
438 *bufnext++ = M_NOT; 484 *bufnext++ = M_NOT;
439 c = *qpatnext++; 485 c = *qpatnext++;
440 do { 486 do {
487 if (c == LBRACKET && *qpatnext == ':') {
488 do {
489 err = g_charclass(&qpatnext,
490 &bufnext);
491 if (err)
492 break;
493 c = *qpatnext++;
494 } while (c == LBRACKET && *qpatnext == ':');
495 if (err == -1 &&
496 !(pglob->gl_flags & GLOB_NOCHECK))
497 return GLOB_NOMATCH;
498 if (c == RBRACKET)
499 break;
500 }
441 *bufnext++ = CHAR(c); 501 *bufnext++ = CHAR(c);
442 if (*qpatnext == RANGE && 502 if (*qpatnext == RANGE &&
443 (c = qpatnext[1]) != RBRACKET) { 503 (c = qpatnext[1]) != RBRACKET) {
@@ -471,7 +531,7 @@ glob0(const Char *pattern, glob_t *pglob)
471 qprintf("glob0:", patbuf); 531 qprintf("glob0:", patbuf);
472#endif 532#endif
473 533
474 if ((err = glob1(patbuf, patbuf+MAXPATHLEN-1, pglob, &limit)) != 0) 534 if ((err = glob1(patbuf, patbuf+MAXPATHLEN-1, pglob, limitp)) != 0)
475 return(err); 535 return(err);
476 536
477 /* 537 /*
@@ -484,7 +544,7 @@ glob0(const Char *pattern, glob_t *pglob)
484 if ((pglob->gl_flags & GLOB_NOCHECK) || 544 if ((pglob->gl_flags & GLOB_NOCHECK) ||
485 ((pglob->gl_flags & GLOB_NOMAGIC) && 545 ((pglob->gl_flags & GLOB_NOMAGIC) &&
486 !(pglob->gl_flags & GLOB_MAGCHAR))) 546 !(pglob->gl_flags & GLOB_MAGCHAR)))
487 return(globextend(pattern, pglob, &limit)); 547 return(globextend(pattern, pglob, limitp, NULL));
488 else 548 else
489 return(GLOB_NOMATCH); 549 return(GLOB_NOMATCH);
490 } 550 }
@@ -501,7 +561,7 @@ compare(const void *p, const void *q)
501} 561}
502 562
503static int 563static int
504glob1(Char *pattern, Char *pattern_last, glob_t *pglob, size_t *limitp) 564glob1(Char *pattern, Char *pattern_last, glob_t *pglob, struct glob_lim *limitp)
505{ 565{
506 Char pathbuf[MAXPATHLEN]; 566 Char pathbuf[MAXPATHLEN];
507 567
@@ -520,7 +580,7 @@ glob1(Char *pattern, Char *pattern_last, glob_t *pglob, size_t *limitp)
520 */ 580 */
521static int 581static int
522glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, 582glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
523 Char *pattern, Char *pattern_last, glob_t *pglob, size_t *limitp) 583 Char *pattern, Char *pattern_last, glob_t *pglob, struct glob_lim *limitp)
524{ 584{
525 struct stat sb; 585 struct stat sb;
526 Char *p, *q; 586 Char *p, *q;
@@ -536,6 +596,14 @@ glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
536 if (g_lstat(pathbuf, &sb, pglob)) 596 if (g_lstat(pathbuf, &sb, pglob))
537 return(0); 597 return(0);
538 598
599 if ((pglob->gl_flags & GLOB_LIMIT) &&
600 limitp->glim_stat++ >= GLOB_LIMIT_STAT) {
601 errno = 0;
602 *pathend++ = SEP;
603 *pathend = EOS;
604 return(GLOB_NOSPACE);
605 }
606
539 if (((pglob->gl_flags & GLOB_MARK) && 607 if (((pglob->gl_flags & GLOB_MARK) &&
540 pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || 608 pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) ||
541 (S_ISLNK(sb.st_mode) && 609 (S_ISLNK(sb.st_mode) &&
@@ -547,7 +615,7 @@ glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
547 *pathend = EOS; 615 *pathend = EOS;
548 } 616 }
549 ++pglob->gl_matchc; 617 ++pglob->gl_matchc;
550 return(globextend(pathbuf, pglob, limitp)); 618 return(globextend(pathbuf, pglob, limitp, &sb));
551 } 619 }
552 620
553 /* Find end of next segment, copy tentatively to pathend. */ 621 /* Find end of next segment, copy tentatively to pathend. */
@@ -581,7 +649,7 @@ glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
581static int 649static int
582glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, 650glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
583 Char *pattern, Char *restpattern, Char *restpattern_last, glob_t *pglob, 651 Char *pattern, Char *restpattern, Char *restpattern_last, glob_t *pglob,
584 size_t *limitp) 652 struct glob_lim *limitp)
585{ 653{
586 struct dirent *dp; 654 struct dirent *dp;
587 DIR *dirp; 655 DIR *dirp;
@@ -624,6 +692,14 @@ glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
624 u_char *sc; 692 u_char *sc;
625 Char *dc; 693 Char *dc;
626 694
695 if ((pglob->gl_flags & GLOB_LIMIT) &&
696 limitp->glim_readdir++ >= GLOB_LIMIT_READDIR) {
697 errno = 0;
698 *pathend++ = SEP;
699 *pathend = EOS;
700 return(GLOB_NOSPACE);
701 }
702
627 /* Initial DOT must be matched literally. */ 703 /* Initial DOT must be matched literally. */
628 if (dp->d_name[0] == DOT && *pattern != DOT) 704 if (dp->d_name[0] == DOT && *pattern != DOT)
629 continue; 705 continue;
@@ -670,25 +746,44 @@ glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
670 * gl_pathv points to (gl_offs + gl_pathc + 1) items. 746 * gl_pathv points to (gl_offs + gl_pathc + 1) items.
671 */ 747 */
672static int 748static int
673globextend(const Char *path, glob_t *pglob, size_t *limitp) 749globextend(const Char *path, glob_t *pglob, struct glob_lim *limitp,
750 struct stat *sb)
674{ 751{
675 char **pathv; 752 char **pathv;
676 int i; 753 ssize_t i;
677 u_int newsize, len; 754 size_t newn, len;
678 char *copy; 755 char *copy = NULL;
679 const Char *p; 756 const Char *p;
680 757 struct stat **statv;
681 newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); 758
682 pathv = pglob->gl_pathv ? realloc((char *)pglob->gl_pathv, newsize) : 759 newn = 2 + pglob->gl_pathc + pglob->gl_offs;
683 malloc(newsize); 760 if (pglob->gl_offs >= INT_MAX ||
684 if (pathv == NULL) { 761 pglob->gl_pathc >= INT_MAX ||
762 newn >= INT_MAX ||
763 SIZE_MAX / sizeof(*pathv) <= newn ||
764 SIZE_MAX / sizeof(*statv) <= newn) {
765 nospace:
766 for (i = pglob->gl_offs; i < (ssize_t)(newn - 2); i++) {
767 if (pglob->gl_pathv && pglob->gl_pathv[i])
768 free(pglob->gl_pathv[i]);
769 if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0 &&
770 pglob->gl_pathv && pglob->gl_pathv[i])
771 free(pglob->gl_statv[i]);
772 }
685 if (pglob->gl_pathv) { 773 if (pglob->gl_pathv) {
686 free(pglob->gl_pathv); 774 free(pglob->gl_pathv);
687 pglob->gl_pathv = NULL; 775 pglob->gl_pathv = NULL;
688 } 776 }
777 if (pglob->gl_statv) {
778 free(pglob->gl_statv);
779 pglob->gl_statv = NULL;
780 }
689 return(GLOB_NOSPACE); 781 return(GLOB_NOSPACE);
690 } 782 }
691 783
784 pathv = realloc(pglob->gl_pathv, newn * sizeof(*pathv));
785 if (pathv == NULL)
786 goto nospace;
692 if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { 787 if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) {
693 /* first time around -- clear initial gl_offs items */ 788 /* first time around -- clear initial gl_offs items */
694 pathv += pglob->gl_offs; 789 pathv += pglob->gl_offs;
@@ -697,10 +792,39 @@ globextend(const Char *path, glob_t *pglob, size_t *limitp)
697 } 792 }
698 pglob->gl_pathv = pathv; 793 pglob->gl_pathv = pathv;
699 794
795 if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0) {
796 statv = realloc(pglob->gl_statv, newn * sizeof(*statv));
797 if (statv == NULL)
798 goto nospace;
799 if (pglob->gl_statv == NULL && pglob->gl_offs > 0) {
800 /* first time around -- clear initial gl_offs items */
801 statv += pglob->gl_offs;
802 for (i = pglob->gl_offs; --i >= 0; )
803 *--statv = NULL;
804 }
805 pglob->gl_statv = statv;
806 if (sb == NULL)
807 statv[pglob->gl_offs + pglob->gl_pathc] = NULL;
808 else {
809 limitp->glim_malloc += sizeof(**statv);
810 if ((pglob->gl_flags & GLOB_LIMIT) &&
811 limitp->glim_malloc >= GLOB_LIMIT_MALLOC) {
812 errno = 0;
813 return(GLOB_NOSPACE);
814 }
815 if ((statv[pglob->gl_offs + pglob->gl_pathc] =
816 malloc(sizeof(**statv))) == NULL)
817 goto copy_error;
818 memcpy(statv[pglob->gl_offs + pglob->gl_pathc], sb,
819 sizeof(*sb));
820 }
821 statv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL;
822 }
823
700 for (p = path; *p++;) 824 for (p = path; *p++;)
701 ; 825 ;
702 len = (size_t)(p - path); 826 len = (size_t)(p - path);
703 *limitp += len; 827 limitp->glim_malloc += len;
704 if ((copy = malloc(len)) != NULL) { 828 if ((copy = malloc(len)) != NULL) {
705 if (g_Ctoc(path, copy, len)) { 829 if (g_Ctoc(path, copy, len)) {
706 free(copy); 830 free(copy);
@@ -711,11 +835,12 @@ globextend(const Char *path, glob_t *pglob, size_t *limitp)
711 pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; 835 pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
712 836
713 if ((pglob->gl_flags & GLOB_LIMIT) && 837 if ((pglob->gl_flags & GLOB_LIMIT) &&
714 newsize + *limitp >= (u_int) get_arg_max()) { 838 (newn * sizeof(*pathv)) + limitp->glim_malloc >
839 GLOB_LIMIT_MALLOC) {
715 errno = 0; 840 errno = 0;
716 return(GLOB_NOSPACE); 841 return(GLOB_NOSPACE);
717 } 842 }
718 843 copy_error:
719 return(copy == NULL ? GLOB_NOSPACE : 0); 844 return(copy == NULL ? GLOB_NOSPACE : 0);
720} 845}
721 846
@@ -751,13 +876,21 @@ match(Char *name, Char *pat, Char *patend)
751 return(0); 876 return(0);
752 if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) 877 if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS)
753 ++pat; 878 ++pat;
754 while (((c = *pat++) & M_MASK) != M_END) 879 while (((c = *pat++) & M_MASK) != M_END) {
880 if ((c & M_MASK) == M_CLASS) {
881 Char idx = *pat & M_MASK;
882 if (idx < NCCLASSES &&
883 cclasses[idx].isctype(k))
884 ok = 1;
885 ++pat;
886 }
755 if ((*pat & M_MASK) == M_RNG) { 887 if ((*pat & M_MASK) == M_RNG) {
756 if (c <= k && k <= pat[1]) 888 if (c <= k && k <= pat[1])
757 ok = 1; 889 ok = 1;
758 pat += 2; 890 pat += 2;
759 } else if (c == k) 891 } else if (c == k)
760 ok = 1; 892 ok = 1;
893 }
761 if (ok == negate_range) 894 if (ok == negate_range)
762 return(0); 895 return(0);
763 break; 896 break;
@@ -785,6 +918,14 @@ globfree(glob_t *pglob)
785 free(pglob->gl_pathv); 918 free(pglob->gl_pathv);
786 pglob->gl_pathv = NULL; 919 pglob->gl_pathv = NULL;
787 } 920 }
921 if (pglob->gl_statv != NULL) {
922 for (i = 0; i < pglob->gl_pathc; i++) {
923 if (pglob->gl_statv[i] != NULL)
924 free(pglob->gl_statv[i]);
925 }
926 free(pglob->gl_statv);
927 pglob->gl_statv = NULL;
928 }
788} 929}
789 930
790static DIR * 931static DIR *
@@ -830,11 +971,11 @@ g_stat(Char *fn, struct stat *sb, glob_t *pglob)
830} 971}
831 972
832static Char * 973static Char *
833g_strchr(Char *str, int ch) 974g_strchr(const Char *str, int ch)
834{ 975{
835 do { 976 do {
836 if (*str == ch) 977 if (*str == ch)
837 return (str); 978 return ((Char *)str);
838 } while (*str++); 979 } while (*str++);
839 return (NULL); 980 return (NULL);
840} 981}
@@ -870,5 +1011,4 @@ qprintf(const char *str, Char *s)
870#endif 1011#endif
871 1012
872#endif /* !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) || 1013#endif /* !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) ||
873 !defined(GLOB_HAS_GL_MATCHC) */ 1014 !defined(GLOB_HAS_GL_MATCHC) || !defined(GLOB_HAS_GL_STATV) */
874
diff --git a/openbsd-compat/glob.h b/openbsd-compat/glob.h
index a2b36f974..f8a7fa5ff 100644
--- a/openbsd-compat/glob.h
+++ b/openbsd-compat/glob.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: glob.h,v 1.10 2005/12/13 00:35:22 millert Exp $ */ 1/* $OpenBSD: glob.h,v 1.11 2010/09/24 13:32:55 djm Exp $ */
2/* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */ 2/* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */
3 3
4/* 4/*
@@ -38,13 +38,15 @@
38/* OPENBSD ORIGINAL: include/glob.h */ 38/* OPENBSD ORIGINAL: include/glob.h */
39 39
40#if !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) || \ 40#if !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) || \
41 !defined(GLOB_HAS_GL_MATCHC) || \ 41 !defined(GLOB_HAS_GL_MATCHC) || !defined(GLOB_HAS_GL_STATV) || \
42 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \ 42 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \
43 defined(BROKEN_GLOB) 43 defined(BROKEN_GLOB)
44 44
45#ifndef _GLOB_H_ 45#ifndef _GLOB_H_
46#define _GLOB_H_ 46#define _GLOB_H_
47 47
48#include <sys/stat.h>
49
48struct stat; 50struct stat;
49typedef struct { 51typedef struct {
50 int gl_pathc; /* Count of total paths so far. */ 52 int gl_pathc; /* Count of total paths so far. */
@@ -52,6 +54,7 @@ typedef struct {
52 int gl_offs; /* Reserved at beginning of gl_pathv. */ 54 int gl_offs; /* Reserved at beginning of gl_pathv. */
53 int gl_flags; /* Copy of flags parameter to glob. */ 55 int gl_flags; /* Copy of flags parameter to glob. */
54 char **gl_pathv; /* List of paths matching pattern. */ 56 char **gl_pathv; /* List of paths matching pattern. */
57 struct stat **gl_statv; /* Stat entries corresponding to gl_pathv */
55 /* Copy of errfunc parameter to glob. */ 58 /* Copy of errfunc parameter to glob. */
56 int (*gl_errfunc)(const char *, int); 59 int (*gl_errfunc)(const char *, int);
57 60
@@ -75,12 +78,10 @@ typedef struct {
75#define GLOB_NOSORT 0x0020 /* Don't sort. */ 78#define GLOB_NOSORT 0x0020 /* Don't sort. */
76#define GLOB_NOESCAPE 0x1000 /* Disable backslash escaping. */ 79#define GLOB_NOESCAPE 0x1000 /* Disable backslash escaping. */
77 80
78/* Error values returned by glob(3) */
79#define GLOB_NOSPACE (-1) /* Malloc call failed. */ 81#define GLOB_NOSPACE (-1) /* Malloc call failed. */
80#define GLOB_ABORTED (-2) /* Unignored error. */ 82#define GLOB_ABORTED (-2) /* Unignored error. */
81#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK not set. */ 83#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK not set. */
82#define GLOB_NOSYS (-4) /* Function not supported. */ 84#define GLOB_NOSYS (-4) /* Function not supported. */
83#define GLOB_ABEND GLOB_ABORTED
84 85
85#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ 86#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */
86#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ 87#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */
@@ -89,6 +90,8 @@ typedef struct {
89#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ 90#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */
90#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ 91#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */
91#define GLOB_LIMIT 0x2000 /* Limit pattern match output to ARG_MAX */ 92#define GLOB_LIMIT 0x2000 /* Limit pattern match output to ARG_MAX */
93#define GLOB_KEEPSTAT 0x4000 /* Retain stat data for paths in gl_statv. */
94#define GLOB_ABEND GLOB_ABORTED /* backward compatibility */
92 95
93int glob(const char *, int, int (*)(const char *, int), glob_t *); 96int glob(const char *, int, int (*)(const char *, int), glob_t *);
94void globfree(glob_t *); 97void globfree(glob_t *);
@@ -96,5 +99,5 @@ void globfree(glob_t *);
96#endif /* !_GLOB_H_ */ 99#endif /* !_GLOB_H_ */
97 100
98#endif /* !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) || 101#endif /* !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) ||
99 !defined(GLOB_HAS_GL_MATCHC */ 102 !defined(GLOB_HAS_GL_MATCHC) || !defined(GLOH_HAS_GL_STATV) */
100 103
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index e15d2bd96..77c5ed2b1 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -1,4 +1,4 @@
1/* $Id: openbsd-compat.h,v 1.50 2010/08/16 03:15:23 dtucker Exp $ */ 1/* $Id: openbsd-compat.h,v 1.51 2010/10/07 10:25:29 djm Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1999-2003 Damien Miller. All rights reserved. 4 * Copyright (c) 1999-2003 Damien Miller. All rights reserved.
@@ -213,6 +213,10 @@ char *user_from_uid(uid_t, int);
213char *group_from_gid(gid_t, int); 213char *group_from_gid(gid_t, int);
214#endif 214#endif
215 215
216#ifndef HAVE_TIMINGSAFE_BCMP
217int timingsafe_bcmp(const void *, const void *, size_t);
218#endif
219
216void *xmmap(size_t size); 220void *xmmap(size_t size);
217char *xcrypt(const char *password, const char *salt); 221char *xcrypt(const char *password, const char *salt);
218char *shadow_pw(struct passwd *pw); 222char *shadow_pw(struct passwd *pw);
diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c
index 420496caa..b617fdf19 100644
--- a/openbsd-compat/openssl-compat.c
+++ b/openbsd-compat/openssl-compat.c
@@ -1,4 +1,4 @@
1/* $Id: openssl-compat.c,v 1.9 2010/01/28 23:54:11 dtucker Exp $ */ 1/* $Id: openssl-compat.c,v 1.13 2011/01/21 22:37:06 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> 4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au>
@@ -18,10 +18,20 @@
18 18
19#include "includes.h" 19#include "includes.h"
20 20
21#include <stdarg.h>
22#include <string.h>
23
21#ifdef USE_OPENSSL_ENGINE 24#ifdef USE_OPENSSL_ENGINE
22# include <openssl/engine.h> 25# include <openssl/engine.h>
26# include <openssl/conf.h>
27#endif
28
29#ifndef HAVE_RSA_GET_DEFAULT_METHOD
30# include <openssl/rsa.h>
23#endif 31#endif
24 32
33#include "log.h"
34
25#define SSH_DONT_OVERLOAD_OPENSSL_FUNCS 35#define SSH_DONT_OVERLOAD_OPENSSL_FUNCS
26#include "openssl-compat.h" 36#include "openssl-compat.h"
27 37
@@ -58,6 +68,70 @@ ssh_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt)
58} 68}
59#endif 69#endif
60 70
71#ifndef HAVE_BN_IS_PRIME_EX
72int
73BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, void *cb)
74{
75 if (cb != NULL)
76 fatal("%s: callback args not supported", __func__);
77 return BN_is_prime(p, nchecks, NULL, ctx, NULL);
78}
79#endif
80
81#ifndef HAVE_RSA_GENERATE_KEY_EX
82int
83RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *bn_e, void *cb)
84{
85 RSA *new_rsa, tmp_rsa;
86 unsigned long e;
87
88 if (cb != NULL)
89 fatal("%s: callback args not supported", __func__);
90 e = BN_get_word(bn_e);
91 if (e == 0xffffffffL)
92 fatal("%s: value of e too large", __func__);
93 new_rsa = RSA_generate_key(bits, e, NULL, NULL);
94 if (new_rsa == NULL)
95 return 0;
96 /* swap rsa/new_rsa then free new_rsa */
97 tmp_rsa = *rsa;
98 *rsa = *new_rsa;
99 *new_rsa = tmp_rsa;
100 RSA_free(new_rsa);
101 return 1;
102}
103#endif
104
105#ifndef HAVE_DSA_GENERATE_PARAMETERS_EX
106int
107DSA_generate_parameters_ex(DSA *dsa, int bits, const unsigned char *seed,
108 int seed_len, int *counter_ret, unsigned long *h_ret, void *cb)
109{
110 DSA *new_dsa, tmp_dsa;
111
112 if (cb != NULL)
113 fatal("%s: callback args not supported", __func__);
114 new_dsa = DSA_generate_parameters(bits, (unsigned char *)seed, seed_len,
115 counter_ret, h_ret, NULL, NULL);
116 if (new_dsa == NULL)
117 return 0;
118 /* swap dsa/new_dsa then free new_dsa */
119 tmp_dsa = *dsa;
120 *dsa = *new_dsa;
121 *new_dsa = tmp_dsa;
122 DSA_free(new_dsa);
123 return 1;
124}
125#endif
126
127#ifndef HAVE_RSA_GET_DEFAULT_METHOD
128RSA_METHOD *
129RSA_get_default_method(void)
130{
131 return RSA_PKCS1_SSLeay();
132}
133#endif
134
61#ifdef USE_OPENSSL_ENGINE 135#ifdef USE_OPENSSL_ENGINE
62void 136void
63ssh_SSLeay_add_all_algorithms(void) 137ssh_SSLeay_add_all_algorithms(void)
diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h
index b7caa650c..6d4f3f215 100644
--- a/openbsd-compat/openssl-compat.h
+++ b/openbsd-compat/openssl-compat.h
@@ -1,4 +1,4 @@
1/* $Id: openssl-compat.h,v 1.15 2010/05/12 07:50:02 djm Exp $ */ 1/* $Id: openssl-compat.h,v 1.18 2011/01/21 22:37:06 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> 4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au>
@@ -17,6 +17,7 @@
17 */ 17 */
18 18
19#include "includes.h" 19#include "includes.h"
20#include <openssl/opensslv.h>
20#include <openssl/evp.h> 21#include <openssl/evp.h>
21#include <openssl/rsa.h> 22#include <openssl/rsa.h>
22#include <openssl/dsa.h> 23#include <openssl/dsa.h>
@@ -39,6 +40,12 @@
39# define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data) 40# define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)
40#endif 41#endif
41 42
43#if OPENSSL_VERSION_NUMBER < 0x1000000fL
44# define LIBCRYPTO_EVP_INL_TYPE unsigned int
45#else
46# define LIBCRYPTO_EVP_INL_TYPE size_t
47#endif
48
42#if (OPENSSL_VERSION_NUMBER < 0x00907000L) || defined(OPENSSL_LOBOTOMISED_AES) 49#if (OPENSSL_VERSION_NUMBER < 0x00907000L) || defined(OPENSSL_LOBOTOMISED_AES)
43# define USE_BUILTIN_RIJNDAEL 50# define USE_BUILTIN_RIJNDAEL
44#endif 51#endif
@@ -71,6 +78,10 @@ extern const EVP_CIPHER *evp_acss(void);
71# define EVP_CIPHER_CTX_key_length(c) ((c)->key_len) 78# define EVP_CIPHER_CTX_key_length(c) ((c)->key_len)
72#endif 79#endif
73 80
81#ifndef HAVE_RSA_GET_DEFAULT_METHOD
82RSA_METHOD *RSA_get_default_method(void);
83#endif
84
74/* 85/*
75 * We overload some of the OpenSSL crypto functions with ssh_* equivalents 86 * We overload some of the OpenSSL crypto functions with ssh_* equivalents
76 * which cater for older and/or less featureful OpenSSL version. 87 * which cater for older and/or less featureful OpenSSL version.
@@ -101,6 +112,19 @@ extern const EVP_CIPHER *evp_acss(void);
101# define SSLeay_add_all_algorithms() ssh_SSLeay_add_all_algorithms() 112# define SSLeay_add_all_algorithms() ssh_SSLeay_add_all_algorithms()
102# endif 113# endif
103 114
115# ifndef HAVE_BN_IS_PRIME_EX
116int BN_is_prime_ex(const BIGNUM *, int, BN_CTX *, void *);
117# endif
118
119# ifndef HAVE_DSA_GENERATE_PARAMETERS_EX
120int DSA_generate_parameters_ex(DSA *, int, const unsigned char *, int, int *,
121 unsigned long *, void *);
122# endif
123
124# ifndef HAVE_RSA_GENERATE_KEY_EX
125int RSA_generate_key_ex(RSA *, int, BIGNUM *, void *);
126# endif
127
104int ssh_EVP_CipherInit(EVP_CIPHER_CTX *, const EVP_CIPHER *, unsigned char *, 128int ssh_EVP_CipherInit(EVP_CIPHER_CTX *, const EVP_CIPHER *, unsigned char *,
105 unsigned char *, int); 129 unsigned char *, int);
106int ssh_EVP_Cipher(EVP_CIPHER_CTX *, char *, char *, int); 130int ssh_EVP_Cipher(EVP_CIPHER_CTX *, char *, char *, int);
diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c
index c0ac9065e..86a7146a6 100644
--- a/openbsd-compat/port-linux.c
+++ b/openbsd-compat/port-linux.c
@@ -1,4 +1,4 @@
1/* $Id: port-linux.c,v 1.8 2010/03/01 04:52:50 dtucker Exp $ */ 1/* $Id: port-linux.c,v 1.11 2011/01/17 07:50:24 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com> 4 * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
@@ -53,7 +53,7 @@ ssh_selinux_enabled(void)
53 static int enabled = -1; 53 static int enabled = -1;
54 54
55 if (enabled == -1) { 55 if (enabled == -1) {
56 enabled = is_selinux_enabled(); 56 enabled = (is_selinux_enabled() == 1);
57 debug("SELinux support %s", enabled ? "enabled" : "disabled"); 57 debug("SELinux support %s", enabled ? "enabled" : "disabled");
58 } 58 }
59 59
@@ -225,14 +225,22 @@ ssh_selinux_change_context(const char *newname)
225#endif /* WITH_SELINUX */ 225#endif /* WITH_SELINUX */
226 226
227#ifdef LINUX_OOM_ADJUST 227#ifdef LINUX_OOM_ADJUST
228#define OOM_ADJ_PATH "/proc/self/oom_adj"
229/* 228/*
230 * The magic "don't kill me", as documented in eg: 229 * The magic "don't kill me" values, old and new, as documented in eg:
231 * http://lxr.linux.no/#linux+v2.6.32/Documentation/filesystems/proc.txt 230 * http://lxr.linux.no/#linux+v2.6.32/Documentation/filesystems/proc.txt
231 * http://lxr.linux.no/#linux+v2.6.36/Documentation/filesystems/proc.txt
232 */ 232 */
233#define OOM_ADJ_NOKILL -17
234 233
235static int oom_adj_save = INT_MIN; 234static int oom_adj_save = INT_MIN;
235static char *oom_adj_path = NULL;
236struct {
237 char *path;
238 int value;
239} oom_adjust[] = {
240 {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */
241 {"/proc/self/oom_adj", -17}, /* kernels <= 2.6.35 */
242 {NULL, 0},
243};
236 244
237/* 245/*
238 * Tell the kernel's out-of-memory killer to avoid sshd. 246 * Tell the kernel's out-of-memory killer to avoid sshd.
@@ -241,23 +249,31 @@ static int oom_adj_save = INT_MIN;
241void 249void
242oom_adjust_setup(void) 250oom_adjust_setup(void)
243{ 251{
252 int i, value;
244 FILE *fp; 253 FILE *fp;
245 254
246 debug3("%s", __func__); 255 debug3("%s", __func__);
247 if ((fp = fopen(OOM_ADJ_PATH, "r+")) != NULL) { 256 for (i = 0; oom_adjust[i].path != NULL; i++) {
248 if (fscanf(fp, "%d", &oom_adj_save) != 1) 257 oom_adj_path = oom_adjust[i].path;
249 verbose("error reading %s: %s", OOM_ADJ_PATH, strerror(errno)); 258 value = oom_adjust[i].value;
250 else { 259 if ((fp = fopen(oom_adj_path, "r+")) != NULL) {
251 rewind(fp); 260 if (fscanf(fp, "%d", &oom_adj_save) != 1)
252 if (fprintf(fp, "%d\n", OOM_ADJ_NOKILL) <= 0) 261 verbose("error reading %s: %s", oom_adj_path,
253 verbose("error writing %s: %s", 262 strerror(errno));
254 OOM_ADJ_PATH, strerror(errno)); 263 else {
255 else 264 rewind(fp);
256 verbose("Set %s from %d to %d", 265 if (fprintf(fp, "%d\n", value) <= 0)
257 OOM_ADJ_PATH, oom_adj_save, OOM_ADJ_NOKILL); 266 verbose("error writing %s: %s",
267 oom_adj_path, strerror(errno));
268 else
269 verbose("Set %s from %d to %d",
270 oom_adj_path, oom_adj_save, value);
271 }
272 fclose(fp);
273 return;
258 } 274 }
259 fclose(fp);
260 } 275 }
276 oom_adj_path = NULL;
261} 277}
262 278
263/* Restore the saved OOM adjustment */ 279/* Restore the saved OOM adjustment */
@@ -267,13 +283,14 @@ oom_adjust_restore(void)
267 FILE *fp; 283 FILE *fp;
268 284
269 debug3("%s", __func__); 285 debug3("%s", __func__);
270 if (oom_adj_save == INT_MIN || (fp = fopen(OOM_ADJ_PATH, "w")) == NULL) 286 if (oom_adj_save == INT_MIN || oom_adj_path == NULL ||
287 (fp = fopen(oom_adj_path, "w")) == NULL)
271 return; 288 return;
272 289
273 if (fprintf(fp, "%d\n", oom_adj_save) <= 0) 290 if (fprintf(fp, "%d\n", oom_adj_save) <= 0)
274 verbose("error writing %s: %s", OOM_ADJ_PATH, strerror(errno)); 291 verbose("error writing %s: %s", oom_adj_path, strerror(errno));
275 else 292 else
276 verbose("Set %s to %d", OOM_ADJ_PATH, oom_adj_save); 293 verbose("Set %s to %d", oom_adj_path, oom_adj_save);
277 294
278 fclose(fp); 295 fclose(fp);
279 return; 296 return;
diff --git a/openbsd-compat/port-solaris.c b/openbsd-compat/port-solaris.c
index 2ab64d487..25382f1c9 100644
--- a/openbsd-compat/port-solaris.c
+++ b/openbsd-compat/port-solaris.c
@@ -1,4 +1,4 @@
1/* $Id: port-solaris.c,v 1.3 2006/10/31 23:28:49 dtucker Exp $ */ 1/* $Id: port-solaris.c,v 1.4 2010/11/05 01:03:05 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2006 Chad Mynhier. 4 * Copyright (c) 2006 Chad Mynhier.
@@ -197,3 +197,33 @@ solaris_contract_post_fork_parent(pid_t pid)
197 close(ctl_fd); 197 close(ctl_fd);
198} 198}
199#endif 199#endif
200
201#ifdef USE_SOLARIS_PROJECTS
202#include <sys/task.h>
203#include <project.h>
204
205/*
206 * Get/set solaris default project.
207 * If we fail, just run along gracefully.
208 */
209void
210solaris_set_default_project(struct passwd *pw)
211{
212 struct project *defaultproject;
213 struct project tempproject;
214 char buf[1024];
215
216 /* get default project, if we fail just return gracefully */
217 if ((defaultproject = getdefaultproj(pw->pw_name, &tempproject, &buf,
218 sizeof(buf))) > 0) {
219 /* set default project */
220 if (setproject(defaultproject->pj_name, pw->pw_name,
221 TASK_NORMAL) != 0)
222 debug("setproject(%s): %s", defaultproject->pj_name,
223 strerror(errno));
224 } else {
225 /* debug on getdefaultproj() error */
226 debug("getdefaultproj(%s): %s", pw->pw_name, strerror(errno));
227 }
228}
229#endif /* USE_SOLARIS_PROJECTS */
diff --git a/openbsd-compat/port-solaris.h b/openbsd-compat/port-solaris.h
index 4c324871e..cd442e78b 100644
--- a/openbsd-compat/port-solaris.h
+++ b/openbsd-compat/port-solaris.h
@@ -1,4 +1,4 @@
1/* $Id: port-solaris.h,v 1.1 2006/08/30 17:24:42 djm Exp $ */ 1/* $Id: port-solaris.h,v 1.2 2010/11/05 01:03:05 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2006 Chad Mynhier. 4 * Copyright (c) 2006 Chad Mynhier.
@@ -20,8 +20,11 @@
20 20
21#include <sys/types.h> 21#include <sys/types.h>
22 22
23#include <pwd.h>
24
23void solaris_contract_pre_fork(void); 25void solaris_contract_pre_fork(void);
24void solaris_contract_post_fork_child(void); 26void solaris_contract_post_fork_child(void);
25void solaris_contract_post_fork_parent(pid_t pid); 27void solaris_contract_post_fork_parent(pid_t pid);
28void solaris_set_default_project(struct passwd *);
26 29
27#endif 30#endif
diff --git a/openbsd-compat/timingsafe_bcmp.c b/openbsd-compat/timingsafe_bcmp.c
new file mode 100644
index 000000000..7e28c0e2a
--- /dev/null
+++ b/openbsd-compat/timingsafe_bcmp.c
@@ -0,0 +1,34 @@
1/* $OpenBSD: timingsafe_bcmp.c,v 1.1 2010/09/24 13:33:00 matthew Exp $ */
2/*
3 * Copyright (c) 2010 Damien Miller. All rights reserved.
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* OPENBSD ORIGINAL: lib/libc/string/timingsafe_bcmp.c */
19
20#include "includes.h"
21#ifndef HAVE_TIMINGSAFE_BCMP
22
23int
24timingsafe_bcmp(const void *b1, const void *b2, size_t n)
25{
26 const unsigned char *p1 = b1, *p2 = b2;
27 int ret = 0;
28
29 for (; n > 0; n--)
30 ret |= *p1++ ^ *p2++;
31 return (ret != 0);
32}
33
34#endif /* TIMINGSAFE_BCMP */