View | Details | Raw Unified | Return to bug 536 | Differences between
and this patch

Collapse All | Expand All

(-)acconfig.h (-2 / +2 lines)
Lines 374-381 Link Here
374
/* Some systems put this outside of libc */
374
/* Some systems put this outside of libc */
375
#undef HAVE_NANOSLEEP
375
#undef HAVE_NANOSLEEP
376
376
377
/* Pushing STREAMS modules incorrectly acquires a controlling TTY */
377
/* Define if sshd somehow reacquires a controlling TTY after setsid() */
378
#undef STREAMS_PUSH_ACQUIRES_CTTY
378
#undef SSHD_ACQUIRES_CTTY
379
379
380
/* Define if cmsg_type is not passed correctly */
380
/* Define if cmsg_type is not passed correctly */
381
#undef BROKEN_CMSG_TYPE
381
#undef BROKEN_CMSG_TYPE
(-)configure.ac (-7 / +49 lines)
Lines 188-202 Link Here
188
	AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_CLOBBER_ARGV)
188
	AC_DEFINE(SETPROCTITLE_STRATEGY,PS_USE_CLOBBER_ARGV)
189
	AC_DEFINE(SETPROCTITLE_PS_PADDING, '\0')
189
	AC_DEFINE(SETPROCTITLE_PS_PADDING, '\0')
190
	inet6_default_4in6=yes
190
	inet6_default_4in6=yes
191
	AC_MSG_CHECKING(for broken cmsg_type)
191
	# openpty can be in libutil, needed for controlling tty test
192
	AC_SEARCH_LIBS(openpty, util)
193
	# make sure that openpty does not reacquire controlling terminal
194
	AC_MSG_CHECKING(if openpty correctly handles controlling tty)
195
	AC_TRY_RUN(
196
		[
197
#include <stdio.h>
198
#include <sys/fcntl.h>
199
#include <sys/types.h>
200
#include <sys/wait.h>
201
202
int
203
main()
204
{
205
	pid_t pid;
206
	int fd, ptyfd, ttyfd, status;
207
208
	pid = fork();
209
	if (pid < 0) {		/* failed */
210
		exit(1);
211
	} else if (pid > 0) {	/* parent */
212
		waitpid(pid, &status, 0);
213
		if (WIFEXITED(status)) 
214
			exit(WEXITSTATUS(status));
215
		else
216
			exit(2);
217
	} else {		/* child */
218
		close(0); close(1); close(2);
219
		setsid();
220
		openpty(&ptyfd, &ttyfd, NULL, NULL, NULL);
221
		fd = open("/dev/tty", O_RDWR | O_NOCTTY);
222
		if (fd >= 0)
223
			exit(3);	/* Acquired ctty: broken */
224
		else
225
			exit(0);	/* Did not acquire ctty: OK */
226
	}
227
}
228
		],
229
		[
230
			AC_MSG_RESULT(yes)
231
		],
232
		[
233
			AC_MSG_RESULT(no)
234
			AC_DEFINE(SSHD_ACQUIRES_CTTY)
235
		]
236
	)
192
	case `uname -r` in
237
	case `uname -r` in
193
	2.0.*)
238
	1.*|2.0.*)
194
		AC_MSG_RESULT(yes)
195
		AC_DEFINE(BROKEN_CMSG_TYPE)
239
		AC_DEFINE(BROKEN_CMSG_TYPE)
196
		;;
240
		;;
197
	*)
198
		AC_MSG_RESULT(no)
199
		;;
200
	esac
241
	esac
201
	;;
242
	;;
202
mips-sony-bsd|mips-sony-newsos4)
243
mips-sony-bsd|mips-sony-newsos4)
Lines 230-236 Link Here
230
	AC_DEFINE(LOGIN_NEEDS_UTMPX)
271
	AC_DEFINE(LOGIN_NEEDS_UTMPX)
231
	AC_DEFINE(LOGIN_NEEDS_TERM)
272
	AC_DEFINE(LOGIN_NEEDS_TERM)
232
	AC_DEFINE(PAM_TTY_KLUDGE)
273
	AC_DEFINE(PAM_TTY_KLUDGE)
233
	AC_DEFINE(STREAMS_PUSH_ACQUIRES_CTTY)
274
	# Pushing STREAMS modules will cause sshd to acquire a controlling tty.
275
	AC_DEFINE(SSHD_ACQUIRES_CTTY)
234
	# hardwire lastlog location (can't detect it on some versions)
276
	# hardwire lastlog location (can't detect it on some versions)
235
	conf_lastlog_location="/var/adm/lastlog"
277
	conf_lastlog_location="/var/adm/lastlog"
236
	AC_MSG_CHECKING(for obsolete utmp and wtmp in solaris2.x)
278
	AC_MSG_CHECKING(for obsolete utmp and wtmp in solaris2.x)
(-)sshd.c (-4 / +4 lines)
Lines 1400-1410 Link Here
1400
	 * setlogin() affects the entire process group.  We don't
1400
	 * setlogin() affects the entire process group.  We don't
1401
	 * want the child to be able to affect the parent.
1401
	 * want the child to be able to affect the parent.
1402
	 */
1402
	 */
1403
#if !defined(STREAMS_PUSH_ACQUIRES_CTTY)
1403
#if !defined(SSHD_ACQUIRES_CTTY)
1404
	/*
1404
	/*
1405
	 * If setsid is called on Solaris, sshd will acquire the controlling
1405
	 * If setsid is called, on some platforms sshd will later acquire a
1406
	 * terminal while pushing STREAMS modules. This will prevent the
1406
	 * controlling terminal which will result in "could not set
1407
	 * shell from acquiring it later.
1407
	 * controlling tty" errors.
1408
	 */
1408
	 */
1409
	if (!debug_flag && !inetd_flag && setsid() < 0)
1409
	if (!debug_flag && !inetd_flag && setsid() < 0)
1410
		error("setsid: %.100s", strerror(errno));
1410
		error("setsid: %.100s", strerror(errno));

Return to bug 536