annotate dbutil.c @ 1861:2b3a8026a6ce

Add re-exec for server This allows ASLR to re-randomize the address space for every connection, preventing some vulnerabilities from being exploitable by repeated probing. Overhead (memory and time) is yet to be confirmed. At present this is only enabled on Linux. Other BSD platforms with fexecve() would probably also work though have not been tested.
author Matt Johnston <matt@ucc.asn.au>
date Sun, 30 Jan 2022 10:14:56 +0800
parents 7f549ee3df48
children 180e580778df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
1 /*
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
2 * Dropbear - a SSH2 server
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
3 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
4 * Copyright (c) 2002,2003 Matt Johnston
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
5 * All rights reserved.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
6 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
8 * of this software and associated documentation files (the "Software"), to deal
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
9 * in the Software without restriction, including without limitation the rights
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
11 * copies of the Software, and to permit persons to whom the Software is
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12 * furnished to do so, subject to the following conditions:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
13 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
14 * The above copyright notice and this permission notice shall be included in
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
15 * all copies or substantial portions of the Software.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
16 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
23 * SOFTWARE.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
24 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
25 * strlcat() is copyright as follows:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
26 * Copyright (c) 1998 Todd C. Miller <[email protected]>
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
27 * All rights reserved.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
28 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
29 * Redistribution and use in source and binary forms, with or without
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
30 * modification, are permitted provided that the following conditions
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
31 * are met:
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
32 * 1. Redistributions of source code must retain the above copyright
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
33 * notice, this list of conditions and the following disclaimer.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
34 * 2. Redistributions in binary form must reproduce the above copyright
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
35 * notice, this list of conditions and the following disclaimer in the
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
36 * documentation and/or other materials provided with the distribution.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
37 * 3. The name of the author may not be used to endorse or promote products
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
38 * derived from this software without specific prior written permission.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
39 *
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
40 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
41 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
42 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
43 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
44 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
45 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
46 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
47 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
49 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
50
928
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
51 #include "config.h"
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
52
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
53 #ifdef __linux__
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
54 #define _GNU_SOURCE
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
55 /* To call clock_gettime() directly */
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
56 #include <sys/syscall.h>
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
57 #endif /* __linux */
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
58
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
59 #ifdef HAVE_MACH_MACH_TIME_H
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
60 #include <mach/mach_time.h>
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
61 #include <mach/mach.h>
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
62 #endif
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
63
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
64 #include "includes.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
65 #include "dbutil.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
66 #include "buffer.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
67 #include "session.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
68 #include "atomicio.h"
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
69
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
70 #define MAX_FMT 100
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
71
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
72 static void generic_dropbear_exit(int exitcode, const char* format,
614
00eca37e47e8 Add noreturn and format attribute hints for some functions.
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
73 va_list param) ATTRIB_NORETURN;
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
74 static void generic_dropbear_log(int priority, const char* format,
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
75 va_list param);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
76
614
00eca37e47e8 Add noreturn and format attribute hints for some functions.
Matt Johnston <matt@ucc.asn.au>
parents: 594
diff changeset
77 void (*_dropbear_exit)(int exitcode, const char* format, va_list param) ATTRIB_NORETURN
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
78 = generic_dropbear_exit;
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
79 void (*_dropbear_log)(int priority, const char* format, va_list param)
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
80 = generic_dropbear_log;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
81
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1283
diff changeset
82 #if DEBUG_TRACE
94
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
83 int debug_trace = 0;
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
84 #endif
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
85
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
86 #ifndef DISABLE_SYSLOG
1211
6ecc133fb2ee Allow setting syslog identifier via startsyslog().
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1134
diff changeset
87 void startsyslog(const char *ident) {
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
88
1211
6ecc133fb2ee Allow setting syslog identifier via startsyslog().
Konstantin Tokarev <ktokarev@smartlabs.tv>
parents: 1134
diff changeset
89 openlog(ident, LOG_PID, LOG_AUTHPRIV);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
92 #endif /* DISABLE_SYSLOG */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
93
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
94 /* the "format" string must be <= 100 characters */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
95 void dropbear_close(const char* format, ...) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
96
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
97 va_list param;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
98
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
99 va_start(param, format);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
100 _dropbear_exit(EXIT_SUCCESS, format, param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
101 va_end(param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
102
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
103 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
104
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
105 void dropbear_exit(const char* format, ...) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
106
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
107 va_list param;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
108
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
109 va_start(param, format);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
110 _dropbear_exit(EXIT_FAILURE, format, param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
111 va_end(param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
112 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
113
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
114 static void generic_dropbear_exit(int exitcode, const char* format,
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
115 va_list param) {
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
116
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
117 char fmtbuf[300];
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
118
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
119 snprintf(fmtbuf, sizeof(fmtbuf), "Exited: %s", format);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
120
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
121 _dropbear_log(LOG_INFO, fmtbuf, param);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
122
1558
2f64cb3d3007 - #if not #ifdef for DROPBEAR_FUZZ
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
123 #if DROPBEAR_FUZZ
1385
6c92e97553f1 Add a flag whether to longjmp, missed that last commit
Matt Johnston <matt@ucc.asn.au>
parents: 1383
diff changeset
124 if (fuzz.do_jmp) {
1369
ddfcadca3c4c fuzzer-pubkey
Matt Johnston <matt@ucc.asn.au>
parents: 1361
diff changeset
125 longjmp(fuzz.jmp, 1);
ddfcadca3c4c fuzzer-pubkey
Matt Johnston <matt@ucc.asn.au>
parents: 1361
diff changeset
126 }
ddfcadca3c4c fuzzer-pubkey
Matt Johnston <matt@ucc.asn.au>
parents: 1361
diff changeset
127 #endif
ddfcadca3c4c fuzzer-pubkey
Matt Johnston <matt@ucc.asn.au>
parents: 1361
diff changeset
128
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
129 exit(exitcode);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
130 }
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
131
241
c5d3ef11155f * use own assertions which should get logged properly
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
132 void fail_assert(const char* expr, const char* file, int line) {
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 568
diff changeset
133 dropbear_exit("Failed assertion (%s:%d): `%s'", file, line, expr);
241
c5d3ef11155f * use own assertions which should get logged properly
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
134 }
c5d3ef11155f * use own assertions which should get logged properly
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
135
108
10f4d3319780 - added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents: 107
diff changeset
136 static void generic_dropbear_log(int UNUSED(priority), const char* format,
73
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
137 va_list param) {
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
138
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
139 char printbuf[1024];
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
140
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
141 vsnprintf(printbuf, sizeof(printbuf), format, param);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
142
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
143 fprintf(stderr, "%s\n", printbuf);
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
144
0bf5cebe622c Dropbearkey can now print out pubkey portions
Matt Johnston <matt@ucc.asn.au>
parents: 70
diff changeset
145 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
146
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
147 /* this is what can be called to write arbitrary log messages */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
148 void dropbear_log(int priority, const char* format, ...) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
149
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
150 va_list param;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
151
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
152 va_start(param, format);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
153 _dropbear_log(priority, format, param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
154 va_end(param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
155 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
156
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
157
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1283
diff changeset
158 #if DEBUG_TRACE
1016
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
159
1021
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
160 static double debug_start_time = -1;
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
161
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
162 void debug_start_net()
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
163 {
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
164 if (getenv("DROPBEAR_DEBUG_NET_TIMESTAMP"))
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
165 {
1250
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
166 /* Timestamps start from first network activity */
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
167 struct timeval tv;
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
168 gettimeofday(&tv, NULL);
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
169 debug_start_time = tv.tv_sec + (tv.tv_usec / 1000000.0);
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
170 TRACE(("Resetting Dropbear TRACE timestamps"))
1021
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
171 }
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
172 }
24135c8e1d46 Add envirnonment variable for debug timestamps to roughly match
Matt Johnston <matt@ucc.asn.au>
parents: 1018
diff changeset
173
1016
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
174 static double time_since_start()
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
175 {
1250
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
176 double nowf;
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
177 struct timeval tv;
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
178 gettimeofday(&tv, NULL);
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
179 nowf = tv.tv_sec + (tv.tv_usec / 1000000.0);
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
180 if (debug_start_time < 0)
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
181 {
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
182 debug_start_time = nowf;
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
183 return 0;
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
184 }
2bb4c662d1c2 more hard tab
Francois Perrad <francois.perrad@gadz.org>
parents: 1211
diff changeset
185 return nowf - debug_start_time;
1016
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
186 }
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
187
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
188 void dropbear_trace(const char* format, ...) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
189 va_list param;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
190
1319
21156be2bb26 ses.debug_trace is wrong
Matt Johnston <matt@ucc.asn.au>
parents: 1295
diff changeset
191 if (!debug_trace) {
94
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
192 return;
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
193 }
c85c88500ea6 DEBUG_TRACE now only triggers with -v on the cmdline
Matt Johnston <matt@ucc.asn.au>
parents: 73
diff changeset
194
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
195 va_start(param, format);
1016
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
196 fprintf(stderr, "TRACE (%d) %f: ", getpid(), time_since_start());
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
197 vfprintf(stderr, format, param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
198 fprintf(stderr, "\n");
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
199 va_end(param);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
200 }
753
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
201
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
202 void dropbear_trace2(const char* format, ...) {
753
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
203 static int trace_env = -1;
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
204 va_list param;
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
205
753
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
206 if (trace_env == -1) {
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
207 trace_env = getenv("DROPBEAR_TRACE2") ? 1 : 0;
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
208 }
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
209
d63ef1e211ea Take transmit and receive keys into use separately
Matt Johnston <matt@ucc.asn.au>
parents: 731
diff changeset
210 if (!(debug_trace && trace_env)) {
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
211 return;
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
212 }
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
213
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
214 va_start(param, format);
1016
257f7d5fca97 piggyback data on acks when making connections on linux
Matt Johnston <matt@ucc.asn.au>
parents: 995
diff changeset
215 fprintf(stderr, "TRACE2 (%d) %f: ", getpid(), time_since_start());
731
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
216 vfprintf(stderr, format, param);
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
217 fprintf(stderr, "\n");
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
218 va_end(param);
9a5438271556 Move the more verbose TRACE() statements into TRACE2()
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
219 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
220 #endif /* DEBUG_TRACE */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
221
547
cf376c696dfc Make it compile, update for changes in channel structure.
Matt Johnston <matt@ucc.asn.au>
parents: 500
diff changeset
222 /* Connect to a given unix socket. The socket is blocking */
1499
2d450c1056e3 options: Complete the transition to numeric toggles (`#if')
Michael Witten <mfwitten@gmail.com>
parents: 1468
diff changeset
223 #if ENABLE_CONNECT_UNIX
550
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
224 int connect_unix(const char* path) {
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
225 struct sockaddr_un addr;
225
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
226 int fd = -1;
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
227
550
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
228 memset((void*)&addr, 0x0, sizeof(addr));
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
229 addr.sun_family = AF_UNIX;
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
230 strlcpy(addr.sun_path, path, sizeof(addr.sun_path));
225
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
231 fd = socket(PF_UNIX, SOCK_STREAM, 0);
550
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
232 if (fd < 0) {
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
233 TRACE(("Failed to open unix socket"))
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
234 return -1;
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
235 }
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
236 if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
237 TRACE(("Failed to connect to '%s' socket", path))
615
e3ac0a426bd0 Fix FD leak if connect() fails, found by Klocwork
Matt Johnston <matt@ucc.asn.au>
parents: 614
diff changeset
238 m_close(fd);
550
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
239 return -1;
61c3513825b0 Talking to the agent works now. Can't interpret the pubkeys.
Matt Johnston <matt@ucc.asn.au>
parents: 547
diff changeset
240 }
225
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
241 return fd;
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
242 }
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
243 #endif
ca7e76d981d9 - progress towards client agent forwarding
Matt Johnston <matt@ucc.asn.au>
parents: 198
diff changeset
244
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
245 /* Sets up a pipe for a, returning three non-blocking file descriptors
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
246 * and the pid. exec_fn is the function that will actually execute the child process,
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
247 * it will be run after the child has fork()ed, and is passed exec_data.
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
248 * If ret_errfd == NULL then stderr will not be captured.
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
249 * ret_pid can be passed as NULL to discard the pid. */
1460
58a74cb829b8 Pointer parameter could be declared as pointing to const (callback)
Francois Perrad <francois.perrad@gadz.org>
parents: 1343
diff changeset
250 int spawn_command(void(*exec_fn)(const void *user_data), const void *exec_data,
482
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
251 int *ret_writefd, int *ret_readfd, int *ret_errfd, pid_t *ret_pid) {
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
252 int infds[2];
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
253 int outfds[2];
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
254 int errfds[2];
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
255 pid_t pid;
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
256
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
257 const int FDIN = 0;
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
258 const int FDOUT = 1;
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
259
1740
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
260 #if DROPBEAR_FUZZ
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
261 if (fuzz.fuzzing) {
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
262 return fuzz_spawn_command(ret_writefd, ret_readfd, ret_errfd, ret_pid);
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
263 }
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
264 #endif
dfbe947bdf0d Make wrapfd share a common buffer for all FDs
Matt Johnston <matt@ucc.asn.au>
parents: 1622
diff changeset
265
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
266 /* redirect stdin/stdout/stderr */
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
267 if (pipe(infds) != 0) {
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
268 return DROPBEAR_FAILURE;
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
269 }
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
270 if (pipe(outfds) != 0) {
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
271 return DROPBEAR_FAILURE;
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
272 }
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
273 if (ret_errfd && pipe(errfds) != 0) {
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
274 return DROPBEAR_FAILURE;
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
275 }
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
276
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1283
diff changeset
277 #if DROPBEAR_VFORK
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
278 pid = vfork();
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
279 #else
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
280 pid = fork();
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
281 #endif
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
282
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
283 if (pid < 0) {
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
284 return DROPBEAR_FAILURE;
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
285 }
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
286
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
287 if (!pid) {
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
288 /* child */
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
289
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
290 TRACE(("back to normal sigchld"))
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
291 /* Revert to normal sigchld handling */
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
292 if (signal(SIGCHLD, SIG_DFL) == SIG_ERR) {
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
293 dropbear_exit("signal() error");
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
294 }
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
295
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
296 /* redirect stdin/stdout */
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
297
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
298 if ((dup2(infds[FDIN], STDIN_FILENO) < 0) ||
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
299 (dup2(outfds[FDOUT], STDOUT_FILENO) < 0) ||
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
300 (ret_errfd && dup2(errfds[FDOUT], STDERR_FILENO) < 0)) {
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
301 TRACE(("leave noptycommand: error redirecting FDs"))
594
a98a2138364a Improve capitalisation for all logged strings
Matt Johnston <matt@ucc.asn.au>
parents: 568
diff changeset
302 dropbear_exit("Child dup2() failure");
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
303 }
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
304
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
305 close(infds[FDOUT]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
306 close(infds[FDIN]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
307 close(outfds[FDIN]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
308 close(outfds[FDOUT]);
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
309 if (ret_errfd)
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
310 {
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
311 close(errfds[FDIN]);
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
312 close(errfds[FDOUT]);
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
313 }
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
314
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
315 exec_fn(exec_data);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
316 /* not reached */
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
317 return DROPBEAR_FAILURE;
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
318 } else {
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
319 /* parent */
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
320 close(infds[FDIN]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
321 close(outfds[FDOUT]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
322
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
323 setnonblocking(outfds[FDIN]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
324 setnonblocking(infds[FDOUT]);
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
325
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
326 if (ret_errfd) {
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
327 close(errfds[FDOUT]);
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
328 setnonblocking(errfds[FDIN]);
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
329 }
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
330
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
331 if (ret_pid) {
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
332 *ret_pid = pid;
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
333 }
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
334
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
335 *ret_writefd = infds[FDOUT];
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
336 *ret_readfd = outfds[FDIN];
484
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
337 if (ret_errfd) {
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
338 *ret_errfd = errfds[FDIN];
effb4a25b1ae Don't capture stderr from spawned processes in proxycommand mode
Matt Johnston <matt@ucc.asn.au>
parents: 482
diff changeset
339 }
481
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
340 return DROPBEAR_SUCCESS;
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
341 }
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
342 }
357a2e2e9bcc - Generalise spawn_command function
Matt Johnston <matt@ucc.asn.au>
parents: 433
diff changeset
343
482
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
344 /* Runs a command with "sh -c". Will close FDs (except stdin/stdout/stderr) and
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
345 * re-enabled SIGPIPE. If cmd is NULL, will run a login shell.
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
346 */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
347 void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell) {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
348 char * argv[4];
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
349 char * baseshell = NULL;
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
350 unsigned int i;
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
351
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
352 baseshell = basename(usershell);
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
353
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
354 if (cmd != NULL) {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
355 argv[0] = baseshell;
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
356 } else {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
357 /* a login shell should be "-bash" for "/bin/bash" etc */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
358 int len = strlen(baseshell) + 2; /* 2 for "-" */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
359 argv[0] = (char*)m_malloc(len);
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
360 snprintf(argv[0], len, "-%s", baseshell);
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
361 }
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
362
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
363 if (cmd != NULL) {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
364 argv[1] = "-c";
492
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
365 argv[2] = (char*)cmd;
482
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
366 argv[3] = NULL;
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
367 } else {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
368 /* construct a shell of the form "-bash" etc */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
369 argv[1] = NULL;
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
370 }
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
371
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
372 /* Re-enable SIGPIPE for the executed process */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
373 if (signal(SIGPIPE, SIG_DFL) == SIG_ERR) {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
374 dropbear_exit("signal() error");
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
375 }
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
376
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
377 /* close file descriptors except stdin/stdout/stderr
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
378 * Need to be sure FDs are closed here to avoid reading files as root */
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
379 for (i = 3; i <= maxfd; i++) {
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
380 m_close(i);
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
381 }
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
382
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
383 execv(usershell, argv);
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
384 }
7ad49f34a122 - Add run_shell_command() function to run a "sh -c" command, handling
Matt Johnston <matt@ucc.asn.au>
parents: 481
diff changeset
385
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1283
diff changeset
386 #if DEBUG_TRACE
198
65585699d980 * add a "label" argument to printhex()
Matt Johnston <matt@ucc.asn.au>
parents: 173
diff changeset
387 void printhex(const char * label, const unsigned char * buf, int len) {
1764
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
388 int i, j;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
389
198
65585699d980 * add a "label" argument to printhex()
Matt Johnston <matt@ucc.asn.au>
parents: 173
diff changeset
390 fprintf(stderr, "%s\n", label);
1764
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
391 /* for each 16 byte line */
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
392 for (j = 0; j < len; j += 16) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
393 const int linelen = MIN(16, len - j);
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
394
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
395 /* print hex digits */
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
396 for (i = 0; i < 16; i++) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
397 if (i < linelen) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
398 fprintf(stderr, "%02x", buf[j+i]);
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
399 } else {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
400 fprintf(stderr, " ");
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
401 }
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
402 // separator between pairs
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
403 if (i % 2 ==1) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
404 fprintf(stderr, " ");
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
405 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
406 }
1764
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
407
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
408 /* print characters */
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
409 fprintf(stderr, " ");
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
410 for (i = 0; i < linelen; i++) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
411 char c = buf[j+i];
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
412 if (!isprint(c)) {
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
413 c = '.';
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
414 }
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
415 fputc(c, stderr);
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
416 }
1764
a339b1c4b9f2 Print ascii in printhex too
Matt Johnston <matt@ucc.asn.au>
parents: 1740
diff changeset
417 fprintf(stderr, "\n");
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
418 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
419 }
764
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
420
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
421 void printmpint(const char *label, mp_int *mp) {
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
422 buffer *buf = buf_new(1000);
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
423 buf_putmpint(buf, mp);
1432
41dca1e5ea34 fix dss debug printing
Matt Johnston <matt@ucc.asn.au>
parents: 1385
diff changeset
424 fprintf(stderr, "%d bits ", mp_count_bits(mp));
764
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
425 printhex(label, buf->data, buf->len);
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
426 buf_free(buf);
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
427
2202e854d187 add printmpint() for debugging
Matt Johnston <matt@ucc.asn.au>
parents: 667
diff changeset
428 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
429 #endif
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
430
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
431 /* Strip all control characters from text (a null-terminated string), except
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
432 * for '\n', '\r' and '\t'.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
433 * The result returned is a newly allocated string, this must be free()d after
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
434 * use */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
435 char * stripcontrol(const char * text) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
436
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
437 char * ret;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
438 int len, pos;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
439 int i;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
440
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
441 len = strlen(text);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
442 ret = m_malloc(len+1);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
443
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
444 pos = 0;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
445 for (i = 0; i < len; i++) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
446 if ((text[i] <= '~' && text[i] >= ' ') /* normal printable range */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
447 || text[i] == '\n' || text[i] == '\r' || text[i] == '\t') {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
448 ret[pos] = text[i];
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
449 pos++;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
450 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
451 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
452 ret[pos] = 0x0;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
453 return ret;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
454 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
455
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
456
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
457 /* reads the contents of filename into the buffer buf, from the current
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
458 * position, either to the end of the file, or the buffer being full.
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
459 * Returns DROPBEAR_SUCCESS or DROPBEAR_FAILURE */
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
460 int buf_readfile(buffer* buf, const char* filename) {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
461
357
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
462 int fd = -1;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
463 int len;
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
464 int maxlen;
358
e81d3bc1dc78 Forgot variable declaration.
Matt Johnston <matt@ucc.asn.au>
parents: 357
diff changeset
465 int ret = DROPBEAR_FAILURE;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
466
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
467 fd = open(filename, O_RDONLY);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
468
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
469 if (fd < 0) {
357
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
470 goto out;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
471 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
472
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
473 do {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
474 maxlen = buf->size - buf->pos;
357
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
475 len = read(fd, buf_getwriteptr(buf, maxlen), maxlen);
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
476 if (len < 0) {
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
477 if (errno == EINTR || errno == EAGAIN) {
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
478 continue;
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
479 }
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
480 goto out;
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
481 }
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
482 buf_incrwritepos(buf, len);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
483 } while (len < maxlen && len > 0);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
484
357
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
485 ret = DROPBEAR_SUCCESS;
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
486
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
487 out:
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
488 if (fd >= 0) {
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
489 m_close(fd);
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
490 }
9e2ad1023978 Handle failure reading a file (such as a key file)
Matt Johnston <matt@ucc.asn.au>
parents: 335
diff changeset
491 return ret;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
492 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
493
51
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
494 /* get a line from the file into buffer in the style expected for an
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
495 * authkeys file.
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
496 * Will return DROPBEAR_SUCCESS if data is read, or DROPBEAR_FAILURE on EOF.*/
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
497 /* Only used for ~/.ssh/known_hosts and ~/.ssh/authorized_keys */
1295
750ec4ec4cbe Convert #ifdef to #if, other build changes
Matt Johnston <matt@ucc.asn.au>
parents: 1283
diff changeset
498 #if DROPBEAR_CLIENT || DROPBEAR_SVR_PUBKEY_AUTH
51
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
499 int buf_getline(buffer * line, FILE * authfile) {
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
500
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
501 int c = EOF;
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
502
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
503 buf_setpos(line, 0);
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
504 buf_setlen(line, 0);
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
505
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
506 while (line->pos < line->size) {
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
507
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
508 c = fgetc(authfile); /*getc() is weird with some uClibc systems*/
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
509 if (c == EOF || c == '\n' || c == '\r') {
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
510 goto out;
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
511 }
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
512
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
513 buf_putbyte(line, (unsigned char)c);
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
514 }
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
515
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 161
diff changeset
516 TRACE(("leave getauthline: line too long"))
51
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
517 /* We return success, but the line length will be zeroed - ie we just
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
518 * ignore that line */
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
519 buf_setlen(line, 0);
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
520
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
521 out:
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
522
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
523
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
524 /* if we didn't read anything before EOF or error, exit */
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
525 if (c == EOF && line->pos == 0) {
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
526 return DROPBEAR_FAILURE;
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
527 } else {
117
e0acad552a92 Read the last line of a file without a finishing '\n' correctly
Matt Johnston <matt@ucc.asn.au>
parents: 109
diff changeset
528 buf_setpos(line, 0);
51
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
529 return DROPBEAR_SUCCESS;
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
530 }
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
531
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
532 }
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
533 #endif
095d689fed16 - Hostkey checking is mostly there, just aren't appending yet.
Matt Johnston <matt@ucc.asn.au>
parents: 45
diff changeset
534
277
044bc108b9b3 * Per-IP connection unauthed connection limits
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
535 /* make sure that the socket closes */
044bc108b9b3 * Per-IP connection unauthed connection limits
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
536 void m_close(int fd) {
1038
d3925ed45a85 Fix for old compilers, variable declarations at beginning of functions
Thorsten Horstmann <thorsten.horstmann@web.de>
parents: 1022
diff changeset
537 int val;
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
538
1453
336cae2238ca test close < 0, from Marco Wenzel
Matt Johnston <matt@ucc.asn.au>
parents: 1343
diff changeset
539 if (fd < 0) {
883
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 871
diff changeset
540 return;
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 871
diff changeset
541 }
ff597bf2cfb0 DROPBEAR_CLI_AUTH_IMMEDIATE fixed, now enabled by default
Matt Johnston <matt@ucc.asn.au>
parents: 871
diff changeset
542
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
543 do {
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
544 val = close(fd);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
545 } while (val < 0 && errno == EINTR);
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
546
277
044bc108b9b3 * Per-IP connection unauthed connection limits
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
547 if (val < 0 && errno != EBADF) {
044bc108b9b3 * Per-IP connection unauthed connection limits
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
548 /* Linux says EIO can happen */
044bc108b9b3 * Per-IP connection unauthed connection limits
Matt Johnston <matt@ucc.asn.au>
parents: 258
diff changeset
549 dropbear_exit("Error closing fd %d, %s", fd, strerror(errno));
4
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
550 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
551 }
fe6bca95afa7 Makefile.in contains updated files required
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
552
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
553 void setnonblocking(int fd) {
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
554
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 161
diff changeset
555 TRACE(("setnonblocking: %d", fd))
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
556
1558
2f64cb3d3007 - #if not #ifdef for DROPBEAR_FUZZ
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
557 #if DROPBEAR_FUZZ
1383
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
558 if (fuzz.fuzzing) {
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
559 return;
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
560 }
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
561 #endif
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
562
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
563 if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
173
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
564 if (errno == ENODEV) {
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
565 /* Some devices (like /dev/null redirected in)
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
566 * can't be set to non-blocking */
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
567 TRACE(("ignoring ENODEV for setnonblocking"))
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
568 } else {
1383
f03cfe9c76ac Disable setnonblocking(), get_socket_address(), set_sock_priority()
Matt Johnston <matt@ucc.asn.au>
parents: 1375
diff changeset
569 {
173
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
570 dropbear_exit("Couldn't set nonblocking");
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
571 }
257f09a63dab * add SSH_ASKPASS support (based on patch from Paul Whittaker
Matt Johnston <matt@ucc.asn.au>
parents: 172
diff changeset
572 }
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
573 }
165
0cfba3034be5 Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents: 161
diff changeset
574 TRACE(("leave setnonblocking"))
109
2e9d1f29c50f merge of 50be59810e462f9f44f55e421227d6aa0b31982b
Matt Johnston <matt@ucc.asn.au>
parents: 108
diff changeset
575 }
425
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
576
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
577 void disallow_core() {
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
578 struct rlimit lim;
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
579 lim.rlim_cur = lim.rlim_max = 0;
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
580 setrlimit(RLIMIT_CORE, &lim);
1afa503e33f5 Disable core dumps
Matt Johnston <matt@ucc.asn.au>
parents: 410
diff changeset
581 }
492
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
582
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
583 /* Returns DROPBEAR_SUCCESS or DROPBEAR_FAILURE, with the result in *val */
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
584 int m_str_to_uint(const char* str, unsigned int *val) {
864
30ab30e46452 Fix some warnings
Matt Johnston <matt@ucc.asn.au>
parents: 835
diff changeset
585 unsigned long l;
1833
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
586 char *endp;
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
587
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
588 l = strtoul(str, &endp, 10);
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
589
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
590 if (endp == str || *endp != '\0') {
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
591 // parse error
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
592 return DROPBEAR_FAILURE;
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
593 }
870f6e386a0b Partial strings from strtoul should return error
Matt Johnston <matt@codeconstruct.com.au>
parents: 1764
diff changeset
594
492
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
595 /* The c99 spec doesn't actually seem to define EINVAL, but most platforms
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
596 * I've looked at mention it in their manpage */
864
30ab30e46452 Fix some warnings
Matt Johnston <matt@ucc.asn.au>
parents: 835
diff changeset
597 if ((l == 0 && errno == EINVAL)
30ab30e46452 Fix some warnings
Matt Johnston <matt@ucc.asn.au>
parents: 835
diff changeset
598 || (l == ULONG_MAX && errno == ERANGE)
30ab30e46452 Fix some warnings
Matt Johnston <matt@ucc.asn.au>
parents: 835
diff changeset
599 || (l > UINT_MAX)) {
492
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
600 return DROPBEAR_FAILURE;
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
601 } else {
864
30ab30e46452 Fix some warnings
Matt Johnston <matt@ucc.asn.au>
parents: 835
diff changeset
602 *val = l;
492
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
603 return DROPBEAR_SUCCESS;
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
604 }
b956d6151600 Replace calls to strtoul() with a helper m_str_to_uint()
Matt Johnston <matt@ucc.asn.au>
parents: 490
diff changeset
605 }
817
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
606
1134
36557295418e change DROPBEAR_DEFAULT_CLI_AUTHKEY to just prepend homedir
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
607 /* Returns malloced path. inpath beginning with '/' is returned as-is,
36557295418e change DROPBEAR_DEFAULT_CLI_AUTHKEY to just prepend homedir
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
608 otherwise home directory is prepended */
36557295418e change DROPBEAR_DEFAULT_CLI_AUTHKEY to just prepend homedir
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
609 char * expand_homedir_path(const char *inpath) {
995
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
610 struct passwd *pw = NULL;
1134
36557295418e change DROPBEAR_DEFAULT_CLI_AUTHKEY to just prepend homedir
Matt Johnston <matt@ucc.asn.au>
parents: 1049
diff changeset
611 if (inpath[0] != '/') {
1851
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
612 char *homedir = getenv("HOME");
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
613
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
614 if (!homedir) {
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
615 pw = getpwuid(getuid());
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
616 if (pw) {
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
617 homedir = pw->pw_dir;
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
618 }
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
619 }
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
620
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
621 if (homedir) {
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
622 int len = strlen(inpath) + strlen(homedir) + 2;
995
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
623 char *buf = m_malloc(len);
1851
7f549ee3df48 Use HOME before /etc/passwd to find id_dropbear (#137)
Matt Robinson <git@nerdoftheherd.com>
parents: 1835
diff changeset
624 snprintf(buf, len, "%s/%s", homedir, inpath);
995
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
625 return buf;
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
626 }
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
627 }
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
628
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
629 /* Fallback */
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
630 return m_strdup(inpath);
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
631 }
6fb4c010c448 Default client key path ~/.ssh/id_dropbear
Matt Johnston <matt@ucc.asn.au>
parents: 962
diff changeset
632
817
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
633 int constant_time_memcmp(const void* a, const void *b, size_t n)
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
634 {
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
635 const char *xa = a, *xb = b;
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
636 uint8_t c = 0;
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
637 size_t i;
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
638 for (i = 0; i < n; i++)
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
639 {
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
640 c |= (xa[i] ^ xb[i]);
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
641 }
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
642 return c;
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
643 }
a625f9e135a4 Constant time memcmp for the hmac and password crypt
Matt Johnston <matt@ucc.asn.au>
parents: 753
diff changeset
644
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
645 /* higher-resolution monotonic timestamp, falls back to gettimeofday */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
646 void gettime_wrapper(struct timespec *now) {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
647 struct timeval tv;
1558
2f64cb3d3007 - #if not #ifdef for DROPBEAR_FUZZ
Matt Johnston <matt@ucc.asn.au>
parents: 1511
diff changeset
648 #if DROPBEAR_FUZZ
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
649 if (fuzz.fuzzing) {
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
650 /* time stands still when fuzzing */
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
651 now->tv_sec = 5;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
652 now->tv_nsec = 0;
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
653 }
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
654 #endif
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
655
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
656 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
657 /* POSIX monotonic clock. Newer Linux, BSD, MacOSX >10.12 */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
658 if (clock_gettime(CLOCK_MONOTONIC, now) == 0) {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
659 return;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
660 }
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
661 #endif
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
662
952
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
663 #if defined(__linux__) && defined(SYS_clock_gettime)
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
664 {
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
665 /* Old linux toolchain - kernel might support it but not the build headers */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
666 /* Also glibc <2.17 requires -lrt which we neglect to add */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
667 static int linux_monotonic_failed = 0;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
668 if (!linux_monotonic_failed) {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
669 /* CLOCK_MONOTONIC isn't in some headers */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
670 int clock_source_monotonic = 1;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
671 if (syscall(SYS_clock_gettime, clock_source_monotonic, now) == 0) {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
672 return;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
673 } else {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
674 /* Don't try again */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
675 linux_monotonic_failed = 1;
952
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
676 }
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
677 }
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
678 }
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
679 #endif /* linux fallback clock_gettime */
952
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
680
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
681 #if defined(HAVE_MACH_ABSOLUTE_TIME)
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
682 {
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
683 /* OS X pre 10.12, see https://developer.apple.com/library/mac/qa/qa1398/_index.html */
930
8f04e36622c0 Fix monotonic_now() on OS X
Matt Johnston <matt@ucc.asn.au>
parents: 928
diff changeset
684 static mach_timebase_info_data_t timebase_info;
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
685 uint64_t scaled_time;
928
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
686 if (timebase_info.denom == 0) {
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
687 mach_timebase_info(&timebase_info);
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
688 }
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
689 scaled_time = mach_absolute_time() * timebase_info.numer / timebase_info.denom;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
690 now->tv_sec = scaled_time / 1000000000;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
691 now->tv_nsec = scaled_time % 1000000000;
1375
d8215479a58a fuzzing has a constant time
Matt Johnston <matt@ucc.asn.au>
parents: 1369
diff changeset
692 }
952
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
693 #endif /* osx mach_absolute_time */
ef8d939de3dd Fix clock_gettime handling
Matt Johnston <matt@ucc.asn.au>
parents: 936
diff changeset
694
928
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
695 /* Fallback for everything else - this will sometimes go backwards */
1622
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
696 gettimeofday(&tv, NULL);
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
697 now->tv_sec = tv.tv_sec;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
698 now->tv_nsec = 1000*tv.tv_usec;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
699 }
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
700
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
701 /* second-resolution monotonic timestamp */
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
702 time_t monotonic_now() {
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
703 struct timespec ts;
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
704 gettime_wrapper(&ts);
e11ed628708b - Add adaptive authentication failure delay
Matt Johnston <matt@ucc.asn.au>
parents: 1575
diff changeset
705 return ts.tv_sec;
928
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
706 }
7cd89d4e0335 Add new monotonic_now() wrapper so that timeouts are unaffected by
Matt Johnston <matt@ucc.asn.au>
parents: 883
diff changeset
707
1329
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
708 void fsync_parent_dir(const char* fn) {
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
709 #ifdef HAVE_LIBGEN_H
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
710 char *fn_dir = m_strdup(fn);
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
711 char *dir = dirname(fn_dir);
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
712 int dirfd = open(dir, O_RDONLY);
1024
aac0095dc3b4 work in progress for async connect
Matt Johnston <matt@ucc.asn.au>
parents: 1023
diff changeset
713
1329
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
714 if (dirfd != -1) {
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
715 if (fsync(dirfd) != 0) {
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
716 TRACE(("fsync of directory %s failed: %s", dir, strerror(errno)))
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
717 }
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
718 m_close(dirfd);
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
719 } else {
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
720 TRACE(("error opening directory %s for fsync: %s", dir, strerror(errno)))
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
721 }
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
722
1575
e75dab5bec71 some linting after fuzz merge (#60)
François Perrad <francois.perrad@gadz.org>
parents: 1559
diff changeset
723 m_free(fn_dir);
1329
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
724 #endif
185c14fa504d Use atomic key generation in all cases
Matt Johnston <matt@ucc.asn.au>
parents: 1319
diff changeset
725 }
1835
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
726
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
727 int fd_read_pending(int fd) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
728 fd_set fds;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
729 struct timeval timeout;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
730
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
731 DROPBEAR_FD_ZERO(&fds);
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
732 FD_SET(fd, &fds);
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
733 while (1) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
734 timeout.tv_sec = 0;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
735 timeout.tv_usec = 0;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
736 if (select(fd+1, &fds, NULL, NULL, &timeout) < 0) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
737 if (errno == EINTR) {
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
738 continue;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
739 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
740 return 0;
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
741 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
742 return FD_ISSET(fd, &fds);
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
743 }
90ac15aeac43 Bring back recently removed channel->flushing
Matt Johnston <matt@codeconstruct.com.au>
parents: 1833
diff changeset
744 }