mirror of
https://github.com/clearml/dropbear
synced 2025-04-19 05:35:05 +00:00
merge from main
--HG-- branch : fuzz
This commit is contained in:
commit
88ce30beb6
21
.gitignore
vendored
Normal file
21
.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
*~
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.da
|
||||||
|
*.bb
|
||||||
|
*.bbg
|
||||||
|
*.prof
|
||||||
|
/autom4te.cache
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/dbclient
|
||||||
|
/dropbear
|
||||||
|
/dropbearconvert
|
||||||
|
/dropbearkey
|
||||||
|
/dropbearmulti
|
||||||
|
/scp
|
||||||
|
/scp-progress
|
||||||
|
Makefile
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
configure
|
2
CHANGES
2
CHANGES
@ -5,6 +5,7 @@
|
|||||||
dropbear is running with -a (Allow connections to forwarded ports from any host)
|
dropbear is running with -a (Allow connections to forwarded ports from any host)
|
||||||
This could potentially allow arbitrary code execution as root by an authenticated user.
|
This could potentially allow arbitrary code execution as root by an authenticated user.
|
||||||
Affects versions 2013.56 to 2016.74. Thanks to Mark Shepard for reporting the crash.
|
Affects versions 2013.56 to 2016.74. Thanks to Mark Shepard for reporting the crash.
|
||||||
|
CVE-2017-9078 https://secure.ucc.asn.au/hg/dropbear/rev/c8114a48837c
|
||||||
|
|
||||||
- Security: Fix information disclosure with ~/.ssh/authorized_keys symlink.
|
- Security: Fix information disclosure with ~/.ssh/authorized_keys symlink.
|
||||||
Dropbear parsed authorized_keys as root, even if it were a symlink. The fix
|
Dropbear parsed authorized_keys as root, even if it were a symlink. The fix
|
||||||
@ -16,6 +17,7 @@
|
|||||||
contents of that file.
|
contents of that file.
|
||||||
This information disclosure is to an already authenticated user.
|
This information disclosure is to an already authenticated user.
|
||||||
Thanks to Jann Horn of Google Project Zero for reporting this.
|
Thanks to Jann Horn of Google Project Zero for reporting this.
|
||||||
|
CVE-2017-9079 https://secure.ucc.asn.au/hg/dropbear/rev/0d889b068123
|
||||||
|
|
||||||
- Generate hostkeys with dropbearkey atomically and flush to disk with fsync
|
- Generate hostkeys with dropbearkey atomically and flush to disk with fsync
|
||||||
Thanks to Andrei Gherzan for a patch
|
Thanks to Andrei Gherzan for a patch
|
||||||
|
@ -106,7 +106,7 @@ static void printhelp() {
|
|||||||
|
|
||||||
void cli_getopts(int argc, char ** argv) {
|
void cli_getopts(int argc, char ** argv) {
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
char ** next = 0;
|
char ** next = NULL;
|
||||||
enum {
|
enum {
|
||||||
OPT_EXTENDED_OPTIONS,
|
OPT_EXTENDED_OPTIONS,
|
||||||
#if DROPBEAR_CLI_PUBKEY_AUTH
|
#if DROPBEAR_CLI_PUBKEY_AUTH
|
||||||
|
@ -81,7 +81,7 @@ static const packettype cli_packettypes[] = {
|
|||||||
{SSH_MSG_REQUEST_SUCCESS, ignore_recv_response},
|
{SSH_MSG_REQUEST_SUCCESS, ignore_recv_response},
|
||||||
{SSH_MSG_REQUEST_FAILURE, ignore_recv_response},
|
{SSH_MSG_REQUEST_FAILURE, ignore_recv_response},
|
||||||
#endif
|
#endif
|
||||||
{0, 0} /* End */
|
{0, NULL} /* End */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ChanType *cli_chantypes[] = {
|
static const struct ChanType *cli_chantypes[] = {
|
||||||
@ -287,7 +287,7 @@ static void cli_sessionloop() {
|
|||||||
int devnull;
|
int devnull;
|
||||||
/* keeping stdin open steals input from the terminal and
|
/* keeping stdin open steals input from the terminal and
|
||||||
is confusing, though stdout/stderr could be useful. */
|
is confusing, though stdout/stderr could be useful. */
|
||||||
devnull = open(_PATH_DEVNULL, O_RDONLY);
|
devnull = open(DROPBEAR_PATH_DEVNULL, O_RDONLY);
|
||||||
if (devnull < 0) {
|
if (devnull < 0) {
|
||||||
dropbear_exit("Opening /dev/null: %d %s",
|
dropbear_exit("Opening /dev/null: %d %s",
|
||||||
errno, strerror(errno));
|
errno, strerror(errno));
|
||||||
|
@ -782,7 +782,7 @@ static void finish_kexhashbuf(void) {
|
|||||||
hash_desc->done(&hs, buf_getwriteptr(ses.hash, hash_desc->hashsize));
|
hash_desc->done(&hs, buf_getwriteptr(ses.hash, hash_desc->hashsize));
|
||||||
buf_setlen(ses.hash, hash_desc->hashsize);
|
buf_setlen(ses.hash, hash_desc->hashsize);
|
||||||
|
|
||||||
#if (DEBUG_KEXHASH) && (DEBUG_TRACE)
|
#if defined(DEBUG_KEXHASH) && DEBUG_TRACE
|
||||||
if (!debug_trace) {
|
if (!debug_trace) {
|
||||||
printhex("kexhashbuf", ses.kexhashbuf->data, ses.kexhashbuf->len);
|
printhex("kexhashbuf", ses.kexhashbuf->data, ses.kexhashbuf->len);
|
||||||
printhex("kexhash", ses.hash->data, ses.hash->len);
|
printhex("kexhash", ses.hash->data, ses.hash->len);
|
||||||
|
2
compat.c
2
compat.c
@ -174,7 +174,7 @@ int daemon(int nochdir, int noclose) {
|
|||||||
if (!nochdir)
|
if (!nochdir)
|
||||||
(void)chdir("/");
|
(void)chdir("/");
|
||||||
|
|
||||||
if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
|
if (!noclose && (fd = open(DROPBEAR_PATH_DEVNULL, O_RDWR, 0)) != -1) {
|
||||||
(void)dup2(fd, STDIN_FILENO);
|
(void)dup2(fd, STDIN_FILENO);
|
||||||
(void)dup2(fd, STDOUT_FILENO);
|
(void)dup2(fd, STDOUT_FILENO);
|
||||||
(void)dup2(fd, STDERR_FILENO);
|
(void)dup2(fd, STDERR_FILENO);
|
||||||
|
90
configure.ac
90
configure.ac
@ -45,8 +45,8 @@ case "$host" in
|
|||||||
sol2ver=`echo "$host"| sed -e 's/.*[[0-9]]\.//'`
|
sol2ver=`echo "$host"| sed -e 's/.*[[0-9]]\.//'`
|
||||||
if test "$sol2ver" -ge 8; then
|
if test "$sol2ver" -ge 8; then
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(DISABLE_UTMP,,Disable utmp)
|
AC_DEFINE(DISABLE_UTMP,1,Disable utmp)
|
||||||
AC_DEFINE(DISABLE_WTMP,,Disable wtmp)
|
AC_DEFINE(DISABLE_WTMP,1,Disable wtmp)
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
fi
|
fi
|
||||||
@ -55,18 +55,18 @@ case "$host" in
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
*-*-aix*)
|
*-*-aix*)
|
||||||
AC_DEFINE(AIX,,Using AIX)
|
AC_DEFINE(AIX,1,Using AIX)
|
||||||
# OpenSSH thinks it's broken. If it isn't, let me know.
|
# OpenSSH thinks it's broken. If it isn't, let me know.
|
||||||
AC_DEFINE(BROKEN_GETADDRINFO,,Broken getaddrinfo)
|
AC_DEFINE(BROKEN_GETADDRINFO,1,Broken getaddrinfo)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-*-hpux*)
|
*-*-hpux*)
|
||||||
LIBS="$LIBS -lsec"
|
LIBS="$LIBS -lsec"
|
||||||
# It's probably broken.
|
# It's probably broken.
|
||||||
AC_DEFINE(BROKEN_GETADDRINFO,,Broken getaddrinfo)
|
AC_DEFINE(BROKEN_GETADDRINFO,1,Broken getaddrinfo)
|
||||||
;;
|
;;
|
||||||
*-dec-osf*)
|
*-dec-osf*)
|
||||||
AC_DEFINE(BROKEN_GETADDRINFO,,Broken getaddrinfo)
|
AC_DEFINE(BROKEN_GETADDRINFO,1,Broken getaddrinfo)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ AC_CHECK_DECL(__UCLIBC__,
|
|||||||
[
|
[
|
||||||
no_loginfunc_check=1
|
no_loginfunc_check=1
|
||||||
AC_MSG_NOTICE([Using uClibc - login() and logout() probably don't work, so we won't use them.])
|
AC_MSG_NOTICE([Using uClibc - login() and logout() probably don't work, so we won't use them.])
|
||||||
],,,)
|
],,)
|
||||||
|
|
||||||
dnl We test for crypt() specially. On Linux (and others?) it resides in libcrypt
|
dnl We test for crypt() specially. On Linux (and others?) it resides in libcrypt
|
||||||
dnl but we don't want link all binaries to -lcrypt, just dropbear server.
|
dnl but we don't want link all binaries to -lcrypt, just dropbear server.
|
||||||
@ -118,7 +118,7 @@ AC_ARG_ENABLE(zlib,
|
|||||||
[ --disable-zlib Don't include zlib support],
|
[ --disable-zlib Don't include zlib support],
|
||||||
[
|
[
|
||||||
if test "x$enableval" = "xno"; then
|
if test "x$enableval" = "xno"; then
|
||||||
AC_DEFINE(DISABLE_ZLIB,, Use zlib)
|
AC_DEFINE(DISABLE_ZLIB,1,Use zlib)
|
||||||
AC_MSG_NOTICE(Disabling zlib)
|
AC_MSG_NOTICE(Disabling zlib)
|
||||||
else
|
else
|
||||||
AC_CHECK_LIB(z, deflate, , AC_MSG_ERROR([*** zlib missing - install first or check config.log ***]))
|
AC_CHECK_LIB(z, deflate, , AC_MSG_ERROR([*** zlib missing - install first or check config.log ***]))
|
||||||
@ -159,13 +159,13 @@ AC_ARG_ENABLE(pam,
|
|||||||
AC_MSG_NOTICE(Enabling PAM)
|
AC_MSG_NOTICE(Enabling PAM)
|
||||||
AC_CHECK_FUNCS(pam_fail_delay)
|
AC_CHECK_FUNCS(pam_fail_delay)
|
||||||
else
|
else
|
||||||
AC_DEFINE(DISABLE_PAM,, Use PAM)
|
AC_DEFINE(DISABLE_PAM,1,Use PAM)
|
||||||
AC_MSG_NOTICE(Disabling PAM)
|
AC_MSG_NOTICE(Disabling PAM)
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
# disable it by default
|
# disable it by default
|
||||||
AC_DEFINE(DISABLE_PAM,, Use PAM)
|
AC_DEFINE(DISABLE_PAM,1,Use PAM)
|
||||||
AC_MSG_NOTICE(Disabling PAM)
|
AC_MSG_NOTICE(Disabling PAM)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -177,7 +177,7 @@ AC_ARG_ENABLE(openpty,
|
|||||||
AC_MSG_NOTICE(Not using openpty)
|
AC_MSG_NOTICE(Not using openpty)
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE(Using openpty if available)
|
AC_MSG_NOTICE(Using openpty if available)
|
||||||
AC_SEARCH_LIBS(openpty, util, [AC_DEFINE(HAVE_OPENPTY,,Have openpty() function)])
|
AC_SEARCH_LIBS(openpty, util, [AC_DEFINE(HAVE_OPENPTY,1,[Have openpty() function])])
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -191,7 +191,7 @@ AC_ARG_ENABLE(syslog,
|
|||||||
[ --disable-syslog Don't include syslog support],
|
[ --disable-syslog Don't include syslog support],
|
||||||
[
|
[
|
||||||
if test "x$enableval" = "xno"; then
|
if test "x$enableval" = "xno"; then
|
||||||
AC_DEFINE(DISABLE_SYSLOG,, Using syslog)
|
AC_DEFINE(DISABLE_SYSLOG,1,Using syslog)
|
||||||
AC_MSG_NOTICE(Disabling syslog)
|
AC_MSG_NOTICE(Disabling syslog)
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE(Enabling syslog)
|
AC_MSG_NOTICE(Enabling syslog)
|
||||||
@ -308,7 +308,7 @@ AC_CACHE_CHECK([for struct sockaddr_in6], ac_cv_have_struct_sockaddr_in6, [
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then
|
if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then
|
||||||
AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6,,Have struct sockaddr_in6)
|
AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6,1,Have struct sockaddr_in6)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
|
AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
|
||||||
@ -322,7 +322,7 @@ AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then
|
if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then
|
||||||
AC_DEFINE(HAVE_STRUCT_IN6_ADDR,,Have struct in6_addr)
|
AC_DEFINE(HAVE_STRUCT_IN6_ADDR,1,Have struct in6_addr)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
|
AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
|
||||||
@ -337,7 +337,7 @@ AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
|
if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
|
||||||
AC_DEFINE(HAVE_STRUCT_ADDRINFO,,Have struct addrinfo)
|
AC_DEFINE(HAVE_STRUCT_ADDRINFO,1,Have struct addrinfo)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@ -401,21 +401,21 @@ AC_ARG_ENABLE(bundled-libtom,
|
|||||||
AC_MSG_NOTICE(Forcing bundled libtom*)
|
AC_MSG_NOTICE(Forcing bundled libtom*)
|
||||||
else
|
else
|
||||||
BUNDLED_LIBTOM=0
|
BUNDLED_LIBTOM=0
|
||||||
AC_CHECK_LIB(tommath, mp_exptmod, LIBTOM_LIBS="$LIBTOM_LIBS -ltommath",
|
AC_CHECK_LIB(tommath, mp_exptmod, LIBTOM_LIBS="-ltommath $LIBTOM_LIBS",
|
||||||
[AC_MSG_ERROR([Missing system libtommath and --disable-bundled-libtom was specified])] )
|
[AC_MSG_ERROR([Missing system libtommath and --disable-bundled-libtom was specified])] )
|
||||||
AC_CHECK_LIB(tomcrypt, register_cipher, LIBTOM_LIBS="$LIBTOM_LIBS -ltomcrypt",
|
AC_CHECK_LIB(tomcrypt, register_cipher, LIBTOM_LIBS="-ltomcrypt $LIBTOM_LIBS",
|
||||||
[AC_MSG_ERROR([Missing system libtomcrypt and --disable-bundled-libtom was specified])] )
|
[AC_MSG_ERROR([Missing system libtomcrypt and --disable-bundled-libtom was specified])] )
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
BUNDLED_LIBTOM=0
|
BUNDLED_LIBTOM=0
|
||||||
AC_CHECK_LIB(tommath, mp_exptmod, LIBTOM_LIBS="$LIBTOM_LIBS -ltommath", BUNDLED_LIBTOM=1)
|
AC_CHECK_LIB(tommath, mp_exptmod, LIBTOM_LIBS="-ltommath $LIBTOM_LIBS", BUNDLED_LIBTOM=1)
|
||||||
AC_CHECK_LIB(tomcrypt, register_cipher, LIBTOM_LIBS="$LIBTOM_LIBS -ltomcrypt", BUNDLED_LIBTOM=1)
|
AC_CHECK_LIB(tomcrypt, register_cipher, LIBTOM_LIBS="-ltomcrypt $LIBTOM_LIBS", BUNDLED_LIBTOM=1)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
if test $BUNDLED_LIBTOM = 1 ; then
|
if test $BUNDLED_LIBTOM = 1 ; then
|
||||||
AC_DEFINE(BUNDLED_LIBTOM,,Use bundled libtom)
|
AC_DEFINE(BUNDLED_LIBTOM,1,Use bundled libtom)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_SUBST(LIBTOM_LIBS)
|
AC_SUBST(LIBTOM_LIBS)
|
||||||
@ -426,36 +426,64 @@ dnl Added from OpenSSH 3.6.1p2's configure.ac
|
|||||||
dnl allow user to disable some login recording features
|
dnl allow user to disable some login recording features
|
||||||
AC_ARG_ENABLE(lastlog,
|
AC_ARG_ENABLE(lastlog,
|
||||||
[ --disable-lastlog Disable use of lastlog even if detected [no]],
|
[ --disable-lastlog Disable use of lastlog even if detected [no]],
|
||||||
[ AC_DEFINE(DISABLE_LASTLOG,,Disable use of lastlog()) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_LASTLOG,1,Disable use of lastlog())
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(utmp,
|
AC_ARG_ENABLE(utmp,
|
||||||
[ --disable-utmp Disable use of utmp even if detected [no]],
|
[ --disable-utmp Disable use of utmp even if detected [no]],
|
||||||
[ AC_DEFINE(DISABLE_UTMP,,Disable use of utmp) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_UTMP,1,Disable use of utmp)
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(utmpx,
|
AC_ARG_ENABLE(utmpx,
|
||||||
[ --disable-utmpx Disable use of utmpx even if detected [no]],
|
[ --disable-utmpx Disable use of utmpx even if detected [no]],
|
||||||
[ AC_DEFINE(DISABLE_UTMPX,,Disable use of utmpx) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_UTMPX,1,Disable use of utmpx)
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(wtmp,
|
AC_ARG_ENABLE(wtmp,
|
||||||
[ --disable-wtmp Disable use of wtmp even if detected [no]],
|
[ --disable-wtmp Disable use of wtmp even if detected [no]],
|
||||||
[ AC_DEFINE(DISABLE_WTMP,,Disable use of wtmp) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_WTMP,1,Disable use of wtmp)
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(wtmpx,
|
AC_ARG_ENABLE(wtmpx,
|
||||||
[ --disable-wtmpx Disable use of wtmpx even if detected [no]],
|
[ --disable-wtmpx Disable use of wtmpx even if detected [no]],
|
||||||
[ AC_DEFINE(DISABLE_WTMPX,,Disable use of wtmpx) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_WTMPX,1,Disable use of wtmpx)
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(loginfunc,
|
AC_ARG_ENABLE(loginfunc,
|
||||||
[ --disable-loginfunc Disable use of login() etc. [no]],
|
[ --disable-loginfunc Disable use of login() etc. [no]],
|
||||||
[ no_loginfunc_check=1
|
[ no_loginfunc_check=1
|
||||||
AC_MSG_NOTICE(Not using login() etc) ]
|
AC_MSG_NOTICE([Not using login() etc]) ]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(pututline,
|
AC_ARG_ENABLE(pututline,
|
||||||
[ --disable-pututline Disable use of pututline() etc. ([uw]tmp) [no]],
|
[ --disable-pututline Disable use of pututline() etc. ([uw]tmp) [no]],
|
||||||
[ AC_DEFINE(DISABLE_PUTUTLINE,,Disable use of pututline()) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_PUTUTLINE,1,Disable use of pututline())
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_ENABLE(pututxline,
|
AC_ARG_ENABLE(pututxline,
|
||||||
[ --disable-pututxline Disable use of pututxline() etc. ([uw]tmpx) [no]],
|
[ --disable-pututxline Disable use of pututxline() etc. ([uw]tmpx) [no]],
|
||||||
[ AC_DEFINE(DISABLE_PUTUTXLINE,,Disable use of pututxline()) ]
|
[
|
||||||
|
if test "x$enableval" = "xno" ; then
|
||||||
|
AC_DEFINE(DISABLE_PUTUTXLINE,1,Disable use of pututxline())
|
||||||
|
fi
|
||||||
|
]
|
||||||
)
|
)
|
||||||
AC_ARG_WITH(lastlog,
|
AC_ARG_WITH(lastlog,
|
||||||
[ --with-lastlog=FILE|DIR specify lastlog location [common locations]],
|
[ --with-lastlog=FILE|DIR specify lastlog location [common locations]],
|
||||||
@ -470,7 +498,7 @@ AC_ARG_WITH(lastlog,
|
|||||||
|
|
||||||
if test -z "$no_loginfunc_check"; then
|
if test -z "$no_loginfunc_check"; then
|
||||||
dnl Checks for libutil functions (login(), logout() etc, not openpty() )
|
dnl Checks for libutil functions (login(), logout() etc, not openpty() )
|
||||||
AC_SEARCH_LIBS(login, util bsd, [AC_DEFINE(HAVE_LOGIN,,Have login() function)])
|
AC_SEARCH_LIBS(login, util bsd, [AC_DEFINE(HAVE_LOGIN,1,[Have login() function])])
|
||||||
AC_CHECK_FUNCS(logout updwtmp logwtmp)
|
AC_CHECK_FUNCS(logout updwtmp logwtmp)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -666,7 +694,7 @@ AC_SEARCH_LIBS(basename, gen, AC_DEFINE(HAVE_BASENAME))
|
|||||||
if test -z "$no_ptmx_check" ; then
|
if test -z "$no_ptmx_check" ; then
|
||||||
if test x"$cross_compiling" = x"no" ; then
|
if test x"$cross_compiling" = x"no" ; then
|
||||||
if test -e /dev/ptmx ; then
|
if test -e /dev/ptmx ; then
|
||||||
AC_DEFINE(USE_DEV_PTMX,,Use /dev/ptmx)
|
AC_DEFINE(USE_DEV_PTMX,1,Use /dev/ptmx)
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE([Not checking for /dev/ptmx, we're cross-compiling])
|
AC_MSG_NOTICE([Not checking for /dev/ptmx, we're cross-compiling])
|
||||||
@ -676,7 +704,7 @@ fi
|
|||||||
if test -z "$no_ptc_check" ; then
|
if test -z "$no_ptc_check" ; then
|
||||||
if test x"$cross_compiling" = x"no" ; then
|
if test x"$cross_compiling" = x"no" ; then
|
||||||
if test -e /dev/ptc ; then
|
if test -e /dev/ptc ; then
|
||||||
AC_DEFINE(HAVE_DEV_PTS_AND_PTC,,Use /dev/ptc & /dev/pts)
|
AC_DEFINE(HAVE_DEV_PTS_AND_PTC,1,Use /dev/ptc & /dev/pts)
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
AC_MSG_NOTICE([Not checking for /dev/ptc & /dev/pts since we're cross-compiling])
|
AC_MSG_NOTICE([Not checking for /dev/ptc & /dev/pts since we're cross-compiling])
|
||||||
|
@ -59,7 +59,7 @@ process_file(hash_state *hs, const char *filename,
|
|||||||
unsigned int readcount;
|
unsigned int readcount;
|
||||||
int ret = DROPBEAR_FAILURE;
|
int ret = DROPBEAR_FAILURE;
|
||||||
|
|
||||||
#if DROPBEAR_PRNGD_SOCKET
|
#ifdef DROPBEAR_PRNGD_SOCKET
|
||||||
if (prngd)
|
if (prngd)
|
||||||
{
|
{
|
||||||
readfd = connect_unix(filename);
|
readfd = connect_unix(filename);
|
||||||
@ -107,7 +107,7 @@ process_file(hash_state *hs, const char *filename,
|
|||||||
wantread = MIN(sizeof(readbuf), len-readcount);
|
wantread = MIN(sizeof(readbuf), len-readcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DROPBEAR_PRNGD_SOCKET
|
#ifdef DROPBEAR_PRNGD_SOCKET
|
||||||
if (prngd)
|
if (prngd)
|
||||||
{
|
{
|
||||||
char egdcmd[2];
|
char egdcmd[2];
|
||||||
@ -215,7 +215,7 @@ void seedrandom() {
|
|||||||
/* existing state */
|
/* existing state */
|
||||||
sha1_process(&hs, (void*)hashpool, sizeof(hashpool));
|
sha1_process(&hs, (void*)hashpool, sizeof(hashpool));
|
||||||
|
|
||||||
#if DROPBEAR_PRNGD_SOCKET
|
#ifdef DROPBEAR_PRNGD_SOCKET
|
||||||
if (process_file(&hs, DROPBEAR_PRNGD_SOCKET, INIT_SEED_SIZE, 1)
|
if (process_file(&hs, DROPBEAR_PRNGD_SOCKET, INIT_SEED_SIZE, 1)
|
||||||
!= DROPBEAR_SUCCESS) {
|
!= DROPBEAR_SUCCESS) {
|
||||||
dropbear_exit("Failure reading random device %s",
|
dropbear_exit("Failure reading random device %s",
|
||||||
|
@ -134,7 +134,7 @@ int main(int argc, char ** argv) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
char ** next = 0;
|
char ** next = NULL;
|
||||||
char * filename = NULL;
|
char * filename = NULL;
|
||||||
enum signkey_type keytype = DROPBEAR_SIGNKEY_NONE;
|
enum signkey_type keytype = DROPBEAR_SIGNKEY_NONE;
|
||||||
char * typetext = NULL;
|
char * typetext = NULL;
|
||||||
|
8
dss.c
8
dss.c
@ -181,6 +181,10 @@ int buf_dss_verify(buffer* buf, dropbear_dss_key *key, buffer *data_buf) {
|
|||||||
TRACE(("verify failed, s' >= q"))
|
TRACE(("verify failed, s' >= q"))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
if (mp_cmp_d(&val1, 0) != MP_GT) {
|
||||||
|
TRACE(("verify failed, s' <= 0"))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
/* let val2 = w = (s')^-1 mod q*/
|
/* let val2 = w = (s')^-1 mod q*/
|
||||||
if (mp_invmod(&val1, key->q, &val2) != MP_OKAY) {
|
if (mp_invmod(&val1, key->q, &val2) != MP_OKAY) {
|
||||||
goto out;
|
goto out;
|
||||||
@ -202,6 +206,10 @@ int buf_dss_verify(buffer* buf, dropbear_dss_key *key, buffer *data_buf) {
|
|||||||
TRACE(("verify failed, r' >= q"))
|
TRACE(("verify failed, r' >= q"))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
if (mp_cmp_d(&val1, 0) != MP_GT) {
|
||||||
|
TRACE(("verify failed, r' <= 0"))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
/* let val4 = u2 = ((r')w) mod q */
|
/* let val4 = u2 = ((r')w) mod q */
|
||||||
if (mp_mulmod(&val1, &val2, key->q, &val4) != MP_OKAY) {
|
if (mp_mulmod(&val1, &val2, key->q, &val4) != MP_OKAY) {
|
||||||
goto out;
|
goto out;
|
||||||
|
10
keyimport.c
10
keyimport.c
@ -694,7 +694,7 @@ static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
|
|||||||
&id, &len, &flags);
|
&id, &len, &flags);
|
||||||
p += ret;
|
p += ret;
|
||||||
/* id==4 for octet string */
|
/* id==4 for octet string */
|
||||||
if (ret < 0 || id != 4 || len < 0 ||
|
if (ret < 0 || id != 4 || len < 0 ||
|
||||||
key->keyblob+key->keyblob_len-p < len) {
|
key->keyblob+key->keyblob_len-p < len) {
|
||||||
errmsg = "ASN.1 decoding failure";
|
errmsg = "ASN.1 decoding failure";
|
||||||
goto error;
|
goto error;
|
||||||
@ -708,7 +708,7 @@ static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
|
|||||||
&id, &len, &flags);
|
&id, &len, &flags);
|
||||||
p += ret;
|
p += ret;
|
||||||
/* id==0 */
|
/* id==0 */
|
||||||
if (ret < 0 || id != 0 || len < 0) {
|
if (ret < 0 || id != 0 || len < 0) {
|
||||||
errmsg = "ASN.1 decoding failure";
|
errmsg = "ASN.1 decoding failure";
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -717,7 +717,7 @@ static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
|
|||||||
&id, &len, &flags);
|
&id, &len, &flags);
|
||||||
p += ret;
|
p += ret;
|
||||||
/* id==6 for object */
|
/* id==6 for object */
|
||||||
if (ret < 0 || id != 6 || len < 0 ||
|
if (ret < 0 || id != 6 || len < 0 ||
|
||||||
key->keyblob+key->keyblob_len-p < len) {
|
key->keyblob+key->keyblob_len-p < len) {
|
||||||
errmsg = "ASN.1 decoding failure";
|
errmsg = "ASN.1 decoding failure";
|
||||||
goto error;
|
goto error;
|
||||||
@ -756,7 +756,7 @@ static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
|
|||||||
&id, &len, &flags);
|
&id, &len, &flags);
|
||||||
p += ret;
|
p += ret;
|
||||||
/* id==1 */
|
/* id==1 */
|
||||||
if (ret < 0 || id != 1 || len < 0) {
|
if (ret < 0 || id != 1 || len < 0) {
|
||||||
errmsg = "ASN.1 decoding failure";
|
errmsg = "ASN.1 decoding failure";
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -765,7 +765,7 @@ static sign_key *openssh_read(const char *filename, char * UNUSED(passphrase))
|
|||||||
&id, &len, &flags);
|
&id, &len, &flags);
|
||||||
p += ret;
|
p += ret;
|
||||||
/* id==3 for bit string */
|
/* id==3 for bit string */
|
||||||
if (ret < 0 || id != 3 || len < 0 ||
|
if (ret < 0 || id != 3 || len < 0 ||
|
||||||
key->keyblob+key->keyblob_len-p < len) {
|
key->keyblob+key->keyblob_len-p < len) {
|
||||||
errmsg = "ASN.1 decoding failure";
|
errmsg = "ASN.1 decoding failure";
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -29,34 +29,34 @@ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3)
|
|||||||
|
|
||||||
/* initialize, (u1,u2,u3) = (1,0,a) */
|
/* initialize, (u1,u2,u3) = (1,0,a) */
|
||||||
mp_set(&u1, 1);
|
mp_set(&u1, 1);
|
||||||
if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
|
|
||||||
/* initialize, (v1,v2,v3) = (0,1,b) */
|
/* initialize, (v1,v2,v3) = (0,1,b) */
|
||||||
mp_set(&v2, 1);
|
mp_set(&v2, 1);
|
||||||
if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
|
|
||||||
/* loop while v3 != 0 */
|
/* loop while v3 != 0 */
|
||||||
while (mp_iszero(&v3) == MP_NO) {
|
while (mp_iszero(&v3) == MP_NO) {
|
||||||
/* q = u3/v3 */
|
/* q = u3/v3 */
|
||||||
if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
|
|
||||||
/* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */
|
/* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */
|
||||||
if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
|
|
||||||
/* (u1,u2,u3) = (v1,v2,v3) */
|
/* (u1,u2,u3) = (v1,v2,v3) */
|
||||||
if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
|
|
||||||
/* (v1,v2,v3) = (t1,t2,t3) */
|
/* (v1,v2,v3) = (t1,t2,t3) */
|
||||||
if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; }
|
if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto LBL_ERR; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure U3 >= 0 */
|
/* make sure U3 >= 0 */
|
||||||
@ -72,7 +72,8 @@ int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3)
|
|||||||
if (U3 != NULL) { mp_exch(U3, &u3); }
|
if (U3 != NULL) { mp_exch(U3, &u3); }
|
||||||
|
|
||||||
err = MP_OKAY;
|
err = MP_OKAY;
|
||||||
_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL);
|
LBL_ERR:
|
||||||
|
mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
2
rsa.c
2
rsa.c
@ -324,7 +324,7 @@ void buf_put_rsa_sign(buffer* buf, dropbear_rsa_key *key, buffer *data_buf) {
|
|||||||
buf_incrwritepos(buf, ssize);
|
buf_incrwritepos(buf, ssize);
|
||||||
mp_clear(&rsa_s);
|
mp_clear(&rsa_s);
|
||||||
|
|
||||||
#if defined(DEBUG_RSA) && defined(DEBUG_TRACE)
|
#if defined(DEBUG_RSA) && DEBUG_TRACE
|
||||||
if (!debug_trace) {
|
if (!debug_trace) {
|
||||||
printhex("RSA sig", buf->data, buf->len);
|
printhex("RSA sig", buf->data, buf->len);
|
||||||
}
|
}
|
||||||
|
@ -235,7 +235,7 @@ sanitise_stdfd(void)
|
|||||||
{
|
{
|
||||||
int nullfd, dupfd;
|
int nullfd, dupfd;
|
||||||
|
|
||||||
if ((nullfd = dupfd = open(_PATH_DEVNULL, O_RDWR)) == -1) {
|
if ((nullfd = dupfd = open(DROPBEAR_PATH_DEVNULL, O_RDWR)) == -1) {
|
||||||
fprintf(stderr, "Couldn't open /dev/null: %s", strerror(errno));
|
fprintf(stderr, "Couldn't open /dev/null: %s", strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ static void printhelp(const char * progname) {
|
|||||||
void svr_getopts(int argc, char ** argv) {
|
void svr_getopts(int argc, char ** argv) {
|
||||||
|
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
char ** next = 0;
|
char ** next = NULL;
|
||||||
int nextisport = 0;
|
int nextisport = 0;
|
||||||
char* recv_window_arg = NULL;
|
char* recv_window_arg = NULL;
|
||||||
char* keepalive_arg = NULL;
|
char* keepalive_arg = NULL;
|
||||||
@ -289,7 +289,7 @@ void svr_getopts(int argc, char ** argv) {
|
|||||||
if (*next == NULL) {
|
if (*next == NULL) {
|
||||||
dropbear_exit("Invalid null argument");
|
dropbear_exit("Invalid null argument");
|
||||||
}
|
}
|
||||||
next = 0x00;
|
next = NULL;
|
||||||
|
|
||||||
if (keyfile) {
|
if (keyfile) {
|
||||||
addhostkey(keyfile);
|
addhostkey(keyfile);
|
||||||
|
@ -67,7 +67,7 @@ static const packettype svr_packettypes[] = {
|
|||||||
{SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation},
|
{SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation},
|
||||||
{SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure},
|
{SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure},
|
||||||
#endif
|
#endif
|
||||||
{0, 0} /* End */
|
{0, NULL} /* End */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ChanType *svr_chantypes[] = {
|
static const struct ChanType *svr_chantypes[] = {
|
||||||
|
@ -55,19 +55,19 @@ int tcp_prio_inithandler(struct Channel* channel)
|
|||||||
static void tcp_acceptor(struct Listener *listener, int sock) {
|
static void tcp_acceptor(struct Listener *listener, int sock) {
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage sa;
|
||||||
socklen_t len;
|
socklen_t len;
|
||||||
char ipstring[NI_MAXHOST], portstring[NI_MAXSERV];
|
char ipstring[NI_MAXHOST], portstring[NI_MAXSERV];
|
||||||
struct TCPListener *tcpinfo = (struct TCPListener*)(listener->typedata);
|
struct TCPListener *tcpinfo = (struct TCPListener*)(listener->typedata);
|
||||||
|
|
||||||
len = sizeof(addr);
|
len = sizeof(sa);
|
||||||
|
|
||||||
fd = accept(sock, (struct sockaddr*)&addr, &len);
|
fd = accept(sock, (struct sockaddr*)&sa, &len);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getnameinfo((struct sockaddr*)&addr, len, ipstring, sizeof(ipstring),
|
if (getnameinfo((struct sockaddr*)&sa, len, ipstring, sizeof(ipstring),
|
||||||
portstring, sizeof(portstring),
|
portstring, sizeof(portstring),
|
||||||
NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
|
NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
|
||||||
m_close(fd);
|
m_close(fd);
|
||||||
|
24
termcodes.c
24
termcodes.c
@ -34,7 +34,11 @@ const struct TermCode termcodes[MAX_TERMCODE+1] = {
|
|||||||
{VKILL, TERMCODE_CONTROLCHAR},
|
{VKILL, TERMCODE_CONTROLCHAR},
|
||||||
{VEOF, TERMCODE_CONTROLCHAR},
|
{VEOF, TERMCODE_CONTROLCHAR},
|
||||||
{VEOL, TERMCODE_CONTROLCHAR},
|
{VEOL, TERMCODE_CONTROLCHAR},
|
||||||
|
#ifdef VEOL2
|
||||||
{VEOL2, TERMCODE_CONTROLCHAR},
|
{VEOL2, TERMCODE_CONTROLCHAR},
|
||||||
|
#else
|
||||||
|
{0, 0},
|
||||||
|
#endif
|
||||||
{VSTART, TERMCODE_CONTROLCHAR},
|
{VSTART, TERMCODE_CONTROLCHAR},
|
||||||
{VSTOP, TERMCODE_CONTROLCHAR},
|
{VSTOP, TERMCODE_CONTROLCHAR},
|
||||||
{VSUSP, TERMCODE_CONTROLCHAR},
|
{VSUSP, TERMCODE_CONTROLCHAR},
|
||||||
@ -51,17 +55,25 @@ const struct TermCode termcodes[MAX_TERMCODE+1] = {
|
|||||||
#ifdef AIX
|
#ifdef AIX
|
||||||
{CERASE, TERMCODE_CONTROLCHAR},
|
{CERASE, TERMCODE_CONTROLCHAR},
|
||||||
#else
|
#else
|
||||||
|
#ifdef VWERASE
|
||||||
{VWERASE, TERMCODE_CONTROLCHAR},
|
{VWERASE, TERMCODE_CONTROLCHAR},
|
||||||
|
#else
|
||||||
|
{0, 0},
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef VLNEXT
|
||||||
{VLNEXT, TERMCODE_CONTROLCHAR},
|
{VLNEXT, TERMCODE_CONTROLCHAR},
|
||||||
|
#else
|
||||||
|
{0, 0},
|
||||||
|
#endif
|
||||||
#ifdef VFLUSH
|
#ifdef VFLUSH
|
||||||
{VFLUSH, TERMCODE_CONTROLCHAR},
|
{VFLUSH, TERMCODE_CONTROLCHAR},
|
||||||
#else
|
#else
|
||||||
{0, 0},
|
{0, 0},
|
||||||
#endif
|
#endif
|
||||||
#ifdef VSWTCH
|
#ifdef VSWTCH
|
||||||
{VSWTCH, TERMCODE_CONTROLCHAR},
|
{VSWTCH, TERMCODE_CONTROLCHAR},
|
||||||
#else
|
#else
|
||||||
{0, 0},
|
{0, 0},
|
||||||
#endif
|
#endif
|
||||||
#ifdef VSTATUS
|
#ifdef VSTATUS
|
||||||
@ -135,8 +147,16 @@ const struct TermCode termcodes[MAX_TERMCODE+1] = {
|
|||||||
{NOFLSH, TERMCODE_LOCAL},
|
{NOFLSH, TERMCODE_LOCAL},
|
||||||
{TOSTOP, TERMCODE_LOCAL},
|
{TOSTOP, TERMCODE_LOCAL},
|
||||||
{IEXTEN, TERMCODE_LOCAL},
|
{IEXTEN, TERMCODE_LOCAL},
|
||||||
|
#ifdef ECHOCTL
|
||||||
{ECHOCTL, TERMCODE_LOCAL},
|
{ECHOCTL, TERMCODE_LOCAL},
|
||||||
|
#else
|
||||||
|
{0, 0},
|
||||||
|
#endif
|
||||||
|
#ifdef ECHOKE
|
||||||
{ECHOKE, TERMCODE_LOCAL},
|
{ECHOKE, TERMCODE_LOCAL},
|
||||||
|
#else
|
||||||
|
{0, 0},
|
||||||
|
#endif
|
||||||
#ifdef PENDIN
|
#ifdef PENDIN
|
||||||
{PENDIN, TERMCODE_LOCAL},
|
{PENDIN, TERMCODE_LOCAL},
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user