diff options
author | Damien Miller <djm@mindrot.org> | 2008-02-10 22:29:40 +1100 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2008-02-10 22:29:40 +1100 |
commit | dfc24258a75a06ea8a3f56d99d3669e1a012a1dc (patch) | |
tree | ae1f957b4a8424aed03e0d3fed2904ea3c0f1876 /sftp-server.c | |
parent | b508faa006a6bcf96f9b59f3e9b6da3c867e8a0f (diff) |
- markus@cvs.openbsd.org 2008/02/04 21:53:00
[session.c sftp-server.c sftp.h]
link sftp-server into sshd; feedback and ok djm@
Diffstat (limited to 'sftp-server.c')
-rw-r--r-- | sftp-server.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/sftp-server.c b/sftp-server.c index 5c84c728c..373bd5eda 100644 --- a/sftp-server.c +++ b/sftp-server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sftp-server.c,v 1.75 2008/01/21 17:24:30 djm Exp $ */ | 1 | /* $OpenBSD: sftp-server.c,v 1.76 2008/02/04 21:53:00 markus Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. | 3 | * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. |
4 | * | 4 | * |
@@ -1110,7 +1110,7 @@ process(void) | |||
1110 | if (msg_len > SFTP_MAX_MSG_LENGTH) { | 1110 | if (msg_len > SFTP_MAX_MSG_LENGTH) { |
1111 | error("bad message from %s local user %s", | 1111 | error("bad message from %s local user %s", |
1112 | client_addr, pw->pw_name); | 1112 | client_addr, pw->pw_name); |
1113 | cleanup_exit(11); | 1113 | sftp_server_cleanup_exit(11); |
1114 | } | 1114 | } |
1115 | if (buf_len < msg_len + 4) | 1115 | if (buf_len < msg_len + 4) |
1116 | return; | 1116 | return; |
@@ -1183,18 +1183,22 @@ process(void) | |||
1183 | break; | 1183 | break; |
1184 | } | 1184 | } |
1185 | /* discard the remaining bytes from the current packet */ | 1185 | /* discard the remaining bytes from the current packet */ |
1186 | if (buf_len < buffer_len(&iqueue)) | 1186 | if (buf_len < buffer_len(&iqueue)) { |
1187 | fatal("iqueue grew unexpectedly"); | 1187 | error("iqueue grew unexpectedly"); |
1188 | sftp_server_cleanup_exit(255); | ||
1189 | } | ||
1188 | consumed = buf_len - buffer_len(&iqueue); | 1190 | consumed = buf_len - buffer_len(&iqueue); |
1189 | if (msg_len < consumed) | 1191 | if (msg_len < consumed) { |
1190 | fatal("msg_len %d < consumed %d", msg_len, consumed); | 1192 | error("msg_len %d < consumed %d", msg_len, consumed); |
1193 | sftp_server_cleanup_exit(255); | ||
1194 | } | ||
1191 | if (msg_len > consumed) | 1195 | if (msg_len > consumed) |
1192 | buffer_consume(&iqueue, msg_len - consumed); | 1196 | buffer_consume(&iqueue, msg_len - consumed); |
1193 | } | 1197 | } |
1194 | 1198 | ||
1195 | /* Cleanup handler that logs active handles upon normal exit */ | 1199 | /* Cleanup handler that logs active handles upon normal exit */ |
1196 | void | 1200 | void |
1197 | cleanup_exit(int i) | 1201 | sftp_server_cleanup_exit(int i) |
1198 | { | 1202 | { |
1199 | if (pw != NULL && client_addr != NULL) { | 1203 | if (pw != NULL && client_addr != NULL) { |
1200 | handle_log_exit(); | 1204 | handle_log_exit(); |
@@ -1205,7 +1209,7 @@ cleanup_exit(int i) | |||
1205 | } | 1209 | } |
1206 | 1210 | ||
1207 | static void | 1211 | static void |
1208 | usage(void) | 1212 | sftp_server_usage(void) |
1209 | { | 1213 | { |
1210 | extern char *__progname; | 1214 | extern char *__progname; |
1211 | 1215 | ||
@@ -1215,7 +1219,7 @@ usage(void) | |||
1215 | } | 1219 | } |
1216 | 1220 | ||
1217 | int | 1221 | int |
1218 | main(int argc, char **argv) | 1222 | sftp_server_main(int argc, char **argv) |
1219 | { | 1223 | { |
1220 | fd_set *rset, *wset; | 1224 | fd_set *rset, *wset; |
1221 | int in, out, max, ch, skipargs = 0, log_stderr = 0; | 1225 | int in, out, max, ch, skipargs = 0, log_stderr = 0; |
@@ -1256,7 +1260,7 @@ main(int argc, char **argv) | |||
1256 | break; | 1260 | break; |
1257 | case 'h': | 1261 | case 'h': |
1258 | default: | 1262 | default: |
1259 | usage(); | 1263 | sftp_server_usage(); |
1260 | } | 1264 | } |
1261 | } | 1265 | } |
1262 | 1266 | ||
@@ -1264,15 +1268,19 @@ main(int argc, char **argv) | |||
1264 | 1268 | ||
1265 | if ((cp = getenv("SSH_CONNECTION")) != NULL) { | 1269 | if ((cp = getenv("SSH_CONNECTION")) != NULL) { |
1266 | client_addr = xstrdup(cp); | 1270 | client_addr = xstrdup(cp); |
1267 | if ((cp = strchr(client_addr, ' ')) == NULL) | 1271 | if ((cp = strchr(client_addr, ' ')) == NULL) { |
1268 | fatal("Malformed SSH_CONNECTION variable: \"%s\"", | 1272 | error("Malformed SSH_CONNECTION variable: \"%s\"", |
1269 | getenv("SSH_CONNECTION")); | 1273 | getenv("SSH_CONNECTION")); |
1274 | sftp_server_cleanup_exit(255); | ||
1275 | } | ||
1270 | *cp = '\0'; | 1276 | *cp = '\0'; |
1271 | } else | 1277 | } else |
1272 | client_addr = xstrdup("UNKNOWN"); | 1278 | client_addr = xstrdup("UNKNOWN"); |
1273 | 1279 | ||
1274 | if ((pw = getpwuid(getuid())) == NULL) | 1280 | if ((pw = getpwuid(getuid())) == NULL) { |
1275 | fatal("No user found for uid %lu", (u_long)getuid()); | 1281 | error("No user found for uid %lu", (u_long)getuid()); |
1282 | sftp_server_cleanup_exit(255); | ||
1283 | } | ||
1276 | pw = pwcopy(pw); | 1284 | pw = pwcopy(pw); |
1277 | 1285 | ||
1278 | logit("session opened for local user %s from [%s]", | 1286 | logit("session opened for local user %s from [%s]", |
@@ -1320,7 +1328,7 @@ main(int argc, char **argv) | |||
1320 | if (errno == EINTR) | 1328 | if (errno == EINTR) |
1321 | continue; | 1329 | continue; |
1322 | error("select: %s", strerror(errno)); | 1330 | error("select: %s", strerror(errno)); |
1323 | cleanup_exit(2); | 1331 | sftp_server_cleanup_exit(2); |
1324 | } | 1332 | } |
1325 | 1333 | ||
1326 | /* copy stdin to iqueue */ | 1334 | /* copy stdin to iqueue */ |
@@ -1328,10 +1336,10 @@ main(int argc, char **argv) | |||
1328 | len = read(in, buf, sizeof buf); | 1336 | len = read(in, buf, sizeof buf); |
1329 | if (len == 0) { | 1337 | if (len == 0) { |
1330 | debug("read eof"); | 1338 | debug("read eof"); |
1331 | cleanup_exit(0); | 1339 | sftp_server_cleanup_exit(0); |
1332 | } else if (len < 0) { | 1340 | } else if (len < 0) { |
1333 | error("read: %s", strerror(errno)); | 1341 | error("read: %s", strerror(errno)); |
1334 | cleanup_exit(1); | 1342 | sftp_server_cleanup_exit(1); |
1335 | } else { | 1343 | } else { |
1336 | buffer_append(&iqueue, buf, len); | 1344 | buffer_append(&iqueue, buf, len); |
1337 | } | 1345 | } |
@@ -1341,7 +1349,7 @@ main(int argc, char **argv) | |||
1341 | len = write(out, buffer_ptr(&oqueue), olen); | 1349 | len = write(out, buffer_ptr(&oqueue), olen); |
1342 | if (len < 0) { | 1350 | if (len < 0) { |
1343 | error("write: %s", strerror(errno)); | 1351 | error("write: %s", strerror(errno)); |
1344 | cleanup_exit(1); | 1352 | sftp_server_cleanup_exit(1); |
1345 | } else { | 1353 | } else { |
1346 | buffer_consume(&oqueue, len); | 1354 | buffer_consume(&oqueue, len); |
1347 | } | 1355 | } |