Solaris 11에서 빈 변수를 사용하여 Perl에서 syswrite 호출을 수행하면 OpenSSH 세션이 종료됩니다.

Solaris 11에서 빈 변수를 사용하여 Perl에서 syswrite 호출을 수행하면 OpenSSH 세션이 종료됩니다.

Solaris 11.4에서 이상한 문제가 발생했습니다.

Perl에서 다음 코드를 실행할 때 문제가 발생합니다.

my $emptystring = "";
syswrite STDOUT, $emptystring;

빈 변수를 사용하여 syswrite 호출을 실행하면 다음이 발생합니다.OpenSSH 세션이 종료되었습니다.:-(

이 문제는 우리에게 새로운 문제로, Solaris 11.3에서 Solaris 11.3으로 마이그레이션한 후에 나타났습니다.솔라리스 11.4 및 OpenSSH 8.1(7.9 이전 버전에서는 이 문제가 발생하지 않습니다.)

이 오류가 발생합니다출력이 표준 출력인 경우에만. 스크립트의 출력이 파일로 리디렉션되면 모든 것이 잘 작동합니다.

스크립트를 추적하고 truss다음과 같은 호출에서 오류가 발생하는 경우:write

23886:  write(1, 0x004B6450, 0)             = 0

표시된 쓰기 호출은 모든 것이 제대로 작동하는 동안 이루어지며 오류가 발생하면 세션이 종료되고 트러스 출력이 중지되며 이 줄 이후의 모든 내용은 표시되지 않습니다.


추가 정보:우리는 Solaris 11.3용으로 컴파일된 바이너리를 테스트했으며 작동합니다! 따라서 분명히 문제는 우리의 편집에서 비롯된 것 같지만 아직 이유는 알 수 없습니다...계속...


추가 정보:la 컴파일에는 큰 차이가 없습니다. 이것OpenSSH 서버 로그보여주다NULL 값은 EOF로 처리됩니다.아래 이미지에 표시된 것처럼 이 오류가 발생한 OpenSSH와 올바르게 작동하는 다른 OpenSSH의 차이점을 보여줍니다.

여기에 이미지 설명을 입력하세요.

이를 보여주는 행은 다음과 같습니다.

debug2: channel 0: read<=0 rfd 16 len 0
debug2: channel 0: read failed
debug2: channel 0: chan_shutdown_read (i0 o0 sock -1 wfd 16 efd -1 [closed])
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug3: send packet: type 96
debug2: channel 0: input drain -> closed

어떤 아이디어가 있나요?

답변1

해결책을 찾았습니다! :-) 간단히 말해서, 우리는C 플래그 설정PTY_ZEROREAD컴파일의 구성 단계 중.

channels.c소스 코드 파일 에서 오류가 발생하는 위치를 확인할 수 있습니다.

#ifndef PTY_ZEROREAD
    if (len <= 0) {
#else
    if ((!c->isatty && len <= 0) ||
        (c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
#endif
        debug2("channel %d: read<=0 rfd %d len %zd",
            c->self, c->rfd, len);
        if (c->type != SSH_CHANNEL_OPEN) {
            debug2("channel %d: not open", c->self);
            chan_mark_dead(ssh, c);
            return -1;
        } else {
            chan_read_failed(ssh, c);
        }
        return -1;
    }

컴파일 플래그를 볼 수 있습니다PTY_ZEROREAD터미널에서 길이가 0인 메시지를 처리하는 방식을 변경합니다.

문제를 해결하려면 configure다음 명령의 마지막 줄에 표시된 대로 명령이 C 플래그를 설정해야 합니다.

./configure --with-zlib           \
        --with-pam                \
        --with-md5-passwords      \
        CFLAGS="-DPTY_ZEROREAD=1"

관련 정보