- djm@cvs.openbsd.org 2009/11/19 23:39:50

[session.c]
     bz#1606: error when an attempt is made to connect to a server
     with ForceCommand=internal-sftp with a shell session (i.e. not a
     subsystem session). Avoids stuck client when attempting to ssh to such a
     service. ok dtucker@
This commit is contained in:
Darren Tucker 2010-01-08 17:09:11 +11:00
parent 2944082b3f
commit d6b06a9f39
2 changed files with 24 additions and 11 deletions

View File

@ -61,6 +61,12 @@
[clientloop.c] [clientloop.c]
fix incorrect exit status when multiplexing and channel ID 0 is recycled fix incorrect exit status when multiplexing and channel ID 0 is recycled
bz#1570 reported by peter.oliver AT eon-is.co.uk; ok dtucker bz#1570 reported by peter.oliver AT eon-is.co.uk; ok dtucker
- djm@cvs.openbsd.org 2009/11/19 23:39:50
[session.c]
bz#1606: error when an attempt is made to connect to a server
with ForceCommand=internal-sftp with a shell session (i.e. not a
subsystem session). Avoids stuck client when attempting to ssh to such a
service. ok dtucker@
20091226 20091226
- (tim) [contrib/cygwin/Makefile] Install ssh-copy-id and ssh-copy-id.1 - (tim) [contrib/cygwin/Makefile] Install ssh-copy-id and ssh-copy-id.1

View File

@ -1,4 +1,4 @@
/* $OpenBSD: session.c,v 1.247 2009/10/06 04:46:40 djm Exp $ */ /* $OpenBSD: session.c,v 1.248 2009/11/19 23:39:50 djm Exp $ */
/* /*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved * All rights reserved
@ -142,9 +142,10 @@ static int sessions_first_unused = -1;
static int sessions_nalloc = 0; static int sessions_nalloc = 0;
static Session *sessions = NULL; static Session *sessions = NULL;
#define SUBSYSTEM_NONE 0 #define SUBSYSTEM_NONE 0
#define SUBSYSTEM_EXT 1 #define SUBSYSTEM_EXT 1
#define SUBSYSTEM_INT_SFTP 2 #define SUBSYSTEM_INT_SFTP 2
#define SUBSYSTEM_INT_SFTP_ERROR 3
#ifdef HAVE_LOGIN_CAP #ifdef HAVE_LOGIN_CAP
login_cap_t *lc; login_cap_t *lc;
@ -785,17 +786,19 @@ do_exec(Session *s, const char *command)
if (options.adm_forced_command) { if (options.adm_forced_command) {
original_command = command; original_command = command;
command = options.adm_forced_command; command = options.adm_forced_command;
if (IS_INTERNAL_SFTP(command)) if (IS_INTERNAL_SFTP(command)) {
s->is_subsystem = SUBSYSTEM_INT_SFTP; s->is_subsystem = s->is_subsystem ?
else if (s->is_subsystem) SUBSYSTEM_INT_SFTP : SUBSYSTEM_INT_SFTP_ERROR;
} else if (s->is_subsystem)
s->is_subsystem = SUBSYSTEM_EXT; s->is_subsystem = SUBSYSTEM_EXT;
debug("Forced command (config) '%.900s'", command); debug("Forced command (config) '%.900s'", command);
} else if (forced_command) { } else if (forced_command) {
original_command = command; original_command = command;
command = forced_command; command = forced_command;
if (IS_INTERNAL_SFTP(command)) if (IS_INTERNAL_SFTP(command)) {
s->is_subsystem = SUBSYSTEM_INT_SFTP; s->is_subsystem = s->is_subsystem ?
else if (s->is_subsystem) SUBSYSTEM_INT_SFTP : SUBSYSTEM_INT_SFTP_ERROR;
} else if (s->is_subsystem)
s->is_subsystem = SUBSYSTEM_EXT; s->is_subsystem = SUBSYSTEM_EXT;
debug("Forced command (key option) '%.900s'", command); debug("Forced command (key option) '%.900s'", command);
} }
@ -1783,7 +1786,11 @@ do_child(Session *s, const char *command)
/* restore SIGPIPE for child */ /* restore SIGPIPE for child */
signal(SIGPIPE, SIG_DFL); signal(SIGPIPE, SIG_DFL);
if (s->is_subsystem == SUBSYSTEM_INT_SFTP) { if (s->is_subsystem == SUBSYSTEM_INT_SFTP_ERROR) {
printf("This service allows sftp connections only.\n");
fflush(NULL);
exit(1);
} else if (s->is_subsystem == SUBSYSTEM_INT_SFTP) {
extern int optind, optreset; extern int optind, optreset;
int i; int i;
char *p, *args; char *p, *args;