Fixed various issues with building on OpenBSD

git-svn-id: https://shellinabox.googlecode.com/svn/trunk@119 0da03de8-d603-11dd-86c2-0f8696b7b6f9
This commit is contained in:
zodiac 2009-05-21 07:50:22 +00:00
parent abb9a50f3b
commit 41fd8f3ea5
18 changed files with 17070 additions and 21678 deletions

View file

@ -1,3 +1,7 @@
2009-05-20 Markus Gutschke <markus@shellinabox.com>
* Fixed various issues with building on OpenBSD
2009-04-28 Markus Gutschke <markus@shellinabox.com>
* Fixed variable expansion in service descriptions.

View file

@ -143,7 +143,7 @@ clean-local:
debian/tmp
.css.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -169,7 +169,7 @@ clean-local:
"$<" "$@"
.html.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -195,7 +195,7 @@ clean-local:
"$<" "$@"
.ico.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -223,7 +223,7 @@ clean-local:
shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
.jspp.js:
@$(ECHO) preprocess "$<" "$@"
@echo preprocess "$<" "$@"
@sed -e "`sed -e 's/^#define *\([^ ]*\) *\(.*\)/\/^[^#]\/s\/\1\/\2 \\\\\/* \1 *\\\\\/\/g/' \
-e t \
-e d "$<"`" \
@ -232,7 +232,7 @@ shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
"$<" >"$@"
.js.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo $(host_cpu) | \
grep -q '^i[0-9]86$$' && \
@ -258,7 +258,7 @@ shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
"$<" "$@"
.wav.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \

View file

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# Makefile.in generated by automake 1.10.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@ -137,39 +137,40 @@ CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DSYMUTIL = @DSYMUTIL@
ECHO = @ECHO@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
FGREP = @FGREP@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
@ -189,8 +190,7 @@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
@ -221,6 +221,7 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@ -638,7 +639,7 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
-rm -f libtool config.lt
install-man1: $(man1_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
@ -650,8 +651,8 @@ install-man1: $(man1_MANS) $(man_MANS)
esac; \
done; \
for i in $$list; do \
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
else file=$$i; fi; \
if test -f $$i; then file=$$i; \
else file=$(srcdir)/$$i; fi; \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
@ -707,7 +708,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
@ -1056,7 +1057,7 @@ clean-local:
debian/tmp
.css.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -1082,7 +1083,7 @@ clean-local:
"$<" "$@"
.html.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -1108,7 +1109,7 @@ clean-local:
"$<" "$@"
.ico.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \
@ -1136,7 +1137,7 @@ clean-local:
shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
.jspp.js:
@$(ECHO) preprocess "$<" "$@"
@echo preprocess "$<" "$@"
@sed -e "`sed -e 's/^#define *\([^ ]*\) *\(.*\)/\/^[^#]\/s\/\1\/\2 \\\\\/* \1 *\\\\\/\/g/' \
-e t \
-e d "$<"`" \
@ -1145,7 +1146,7 @@ shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
"$<" >"$@"
.js.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo $(host_cpu) | \
grep -q '^i[0-9]86$$' && \
@ -1171,7 +1172,7 @@ shellinabox/shell_in_a_box.o: shellinabox/shell_in_a_box.js config.h
"$<" "$@"
.wav.o:
@$(ECHO) objcopy "$<" "$@"
@echo objcopy "$<" "$@"
@objcopy \
-I binary `echo "$(host_cpu)" | \
grep -q '^i[0-9]86$$' && \

8836
aclocal.m4 vendored

File diff suppressed because it is too large Load diff

View file

@ -7,6 +7,18 @@
/* Define to 1 if you have the `dlopen' function. */
#define HAVE_DLOPEN 1
/* Define to 1 if you have the `getgrgid_r' function. */
#define HAVE_GETGRGID_R 1
/* Define to 1 if you have the `getgrnam_r' function. */
#define HAVE_GETGRNAM_R 1
/* Define to 1 if you have the `getpwnam_r' function. */
#define HAVE_GETPWNAM_R 1
/* Define to 1 if you have the `getpwuid_r' function. */
#define HAVE_GETPWUID_R 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
@ -19,6 +31,9 @@
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `openpty' function. */
#define HAVE_OPENPTY 1
/* Define to 1 if you have the <openssl/bio.h> header file. */
#define HAVE_OPENSSL_BIO_H 1
@ -34,6 +49,9 @@
/* Define to 1 if you have a re-entrant version of ptsname */
#define HAVE_PTSNAME_R 1
/* Define to 1 if you have the <pty.h> header file. */
#define HAVE_PTY_H 1
/* Define to 1 if you have the <security/pam_appl.h> header file. */
#define HAVE_SECURITY_PAM_APPL_H 1
@ -43,6 +61,9 @@
/* Define to 1 if you have the <security/pam_misc.h> header file. */
#define HAVE_SECURITY_PAM_MISC_H 1
/* Define to 1 if you have a working sigwait */
#define HAVE_SIGWAIT 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
@ -55,8 +76,11 @@
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/prctrl.h> header file. */
/* #undef HAVE_SYS_PRCTRL_H */
/* Define to 1 if you have the `strlcat' function. */
/* #undef HAVE_STRLCAT */
/* Define to 1 if you have the <sys/prctl.h> header file. */
#define HAVE_SYS_PRCTL_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
@ -64,15 +88,25 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <sys/uio.h> header file. */
#define HAVE_SYS_UIO_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the <util.h> header file. */
/* #undef HAVE_UTIL_H */
/* Define to 1 if you have the <utmpx.h> header file. */
#define HAVE_UTMPX_H 1
/* Define to 1 if you have the <utmp.h> header file. */
#define HAVE_UTMP_H 1
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
/* Name of package */
#define PACKAGE "shellinabox"
@ -95,7 +129,7 @@
#define STDC_HEADERS 1
/* Most recent revision number in the version control system */
#define VCS_REVISION "118"
#define VCS_REVISION "119"
/* Version number of package */
#define VERSION "2.7"

View file

@ -6,6 +6,18 @@
/* Define to 1 if you have the `dlopen' function. */
#undef HAVE_DLOPEN
/* Define to 1 if you have the `getgrgid_r' function. */
#undef HAVE_GETGRGID_R
/* Define to 1 if you have the `getgrnam_r' function. */
#undef HAVE_GETGRNAM_R
/* Define to 1 if you have the `getpwnam_r' function. */
#undef HAVE_GETPWNAM_R
/* Define to 1 if you have the `getpwuid_r' function. */
#undef HAVE_GETPWUID_R
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@ -18,6 +30,9 @@
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `openpty' function. */
#undef HAVE_OPENPTY
/* Define to 1 if you have the <openssl/bio.h> header file. */
#undef HAVE_OPENSSL_BIO_H
@ -33,6 +48,9 @@
/* Define to 1 if you have a re-entrant version of ptsname */
#undef HAVE_PTSNAME_R
/* Define to 1 if you have the <pty.h> header file. */
#undef HAVE_PTY_H
/* Define to 1 if you have the <security/pam_appl.h> header file. */
#undef HAVE_SECURITY_PAM_APPL_H
@ -42,6 +60,9 @@
/* Define to 1 if you have the <security/pam_misc.h> header file. */
#undef HAVE_SECURITY_PAM_MISC_H
/* Define to 1 if you have a working sigwait */
#undef HAVE_SIGWAIT
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@ -54,8 +75,11 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/prctrl.h> header file. */
#undef HAVE_SYS_PRCTRL_H
/* Define to 1 if you have the `strlcat' function. */
#undef HAVE_STRLCAT
/* Define to 1 if you have the <sys/prctl.h> header file. */
#undef HAVE_SYS_PRCTL_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
@ -63,15 +87,25 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <sys/uio.h> header file. */
#undef HAVE_SYS_UIO_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the <util.h> header file. */
#undef HAVE_UTIL_H
/* Define to 1 if you have the <utmpx.h> header file. */
#undef HAVE_UTMPX_H
/* Define to 1 if you have the <utmp.h> header file. */
#undef HAVE_UTMP_H
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Name of package */
#undef PACKAGE

19803
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@ AC_PREREQ(2.57)
dnl This is the one location where the authoritative version number is stored
AC_INIT(shellinabox, 2.7, markus@shellinabox.com)
VCS_REVISION=118
VCS_REVISION=119
AC_SUBST(VCS_REVISION)
AC_DEFINE_UNQUOTED(VCS_REVISION, "${VCS_REVISION}",
[Most recent revision number in the version control system])
@ -20,7 +20,8 @@ AC_C_CONST
AC_PROG_GCC_TRADITIONAL
dnl Check for header files that do not exist on all platforms
AC_CHECK_HEADERS([libutil.h pthread.h sys/prctrl.h utmp.h utmpx.h])
AC_CHECK_HEADERS([libutil.h pthread.h pty.h sys/prctl.h sys/uio.h util.h \
utmp.h utmpx.h])
dnl Most systems require linking against libutil.so in order to get login_tty()
AC_CHECK_FUNCS(login_tty, [],
@ -28,6 +29,12 @@ AC_CHECK_FUNCS(login_tty, [],
[LIBS="-lutil $LIBS"
AC_DEFINE(HAVE_LOGIN_TTY)])])
dnl Use strlcat() instead of strncat() to avoid spurious warnings
AC_CHECK_FUNCS([strlcat])
dnl Prefer thread-safe functions, if available
AC_CHECK_FUNCS([getgrgid_r getgrnam_r getpwnam_r getpwuid_r openpty])
dnl We prefer ptsname_r(), but will settle for ptsname() if necessary
AC_TRY_LINK([#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
@ -40,6 +47,13 @@ AC_TRY_LINK([#ifndef _XOPEN_SOURCE
[AC_DEFINE(HAVE_PTSNAME_R, 1,
Define to 1 if you have a re-entrant version of ptsname)])
dnl Apparently, some systems define sigwait() but fail to implement it
AC_TRY_LINK([#include <pthread.h>
#include <signal.h>],
[sigset_t s; int n; sigwait(&s, &n);],
[AC_DEFINE(HAVE_SIGWAIT, 1,
Define to 1 if you have a working sigwait)])
dnl We automatically detect SSL support, but allow users to disable it
AC_ARG_ENABLE(ssl,
[ --disable-ssl if available at built-time, support for SSL
@ -95,7 +109,9 @@ dnl dependencies.
if test "x$enable_runtime_loading" == xno; then
dnl Link against OpenSSL libraries, unless SSL support has been disabled
if test "x$enable_ssl" != xno; then
AC_CHECK_HEADER(openssl/ssl.h, [LIBS="-lssl $LIBS"])
AC_CHECK_HEADER(openssl/bio.h,
[AC_CHECK_HEADER(openssl/err.h,
[AC_CHECK_HEADER(openssl/ssl.h, [LIBS="-lssl $LIBS"])])])
fi
dnl Link against PAM libraries, unless PAM support has been disabled

View file

@ -1500,7 +1500,7 @@ VT100.prototype.toggleBell = function() {
};
VT100.prototype.about = function() {
alert("VT100 Terminal Emulator " + "2.7 (revision 118)" +
alert("VT100 Terminal Emulator " + "2.7 (revision 119)" +
"\nCopyright 2008-2009 by Markus Gutschke\n" +
"For more information check http://shellinabox.com");
};

View file

@ -57,6 +57,10 @@
#include <sys/types.h>
#include <unistd.h>
#ifdef HAVE_STRLCAT
#define strncat(a,b,c) ({ char *_a = (a); strlcat(_a, (b), (c)+1); _a; })
#endif
#include "libhttp/httpconnection.h"
#include "logging/logging.h"
@ -219,9 +223,10 @@ static int httpFinishCommand(struct HttpConnection *http) {
check(strftime(timeBuf, sizeof(timeBuf),
"[%d/%b/%Y:%H:%M:%S %z]", ltime));
if (http->totalWritten > 0) {
sprintf(lengthBuf, "%d", http->totalWritten);
snprintf(lengthBuf, sizeof(lengthBuf), "%d", http->totalWritten);
} else {
strcpy(lengthBuf, "-");
*lengthBuf = '\000';
strncat(lengthBuf, "-", sizeof(lengthBuf)-1);
}
info("%s - - %s \"%s %s %s\" %d %s",
http->peerName, timeBuf, http->method, http->path, http->version,
@ -1373,14 +1378,15 @@ const char *httpGetQuery(const struct HttpConnection *http) {
const char *httpGetURL(const struct HttpConnection *http) {
if (!http->url) {
const char *host = httpGetHost(http);
check(*(char **)&http->url = malloc(8 + strlen(host) + 25 +
strlen(http->path) + 1));
strcpy(http->url, http->sslHndl ? "https://" : "http://");
strcat(http->url, host);
int s_size = 8 + strlen(host) + 25 + strlen(http->path);
check(*(char **)&http->url = malloc(s_size + 1));
*http->url = '\000';
strncat(http->url, http->sslHndl ? "https://" : "http://", s_size);
strncat(http->url, host, s_size);
if (http->port != (http->sslHndl ? 443 : 80)) {
sprintf(strrchr(http->url, '\000'), ":%d", http->port);
snprintf(strrchr(http->url, '\000'), 25, ":%d", http->port);
}
strcat(http->url, http->path);
strncat(http->url, http->path, s_size);
}
return http->url;
}

View file

@ -572,6 +572,33 @@ static int sslSNICallback(SSL *sslHndl, int *al, struct SSLSupport *ssl) {
}
#endif
#if defined(HAVE_OPENSSL) && 1
// This is a not-thread-safe replacement for gethostbyname_r()
#define gethostbyname_r x_gethostbyname_r
static int gethostbyname_r(const char *name, struct hostent *ret,
char *buf, size_t buflen,
struct hostent **result, int *h_errnop) {
if (result) {
*result = NULL;
}
if (h_errnop) {
*h_errnop = ERANGE;
}
if (!ret) {
return -1;
}
struct hostent *he = gethostbyname(name);
*ret = *he;
if (result) {
*result = ret;
}
if (h_errnop) {
*h_errnop = h_errno;
}
return 0;
}
#endif
void sslSetCertificate(struct SSLSupport *ssl, const char *filename,
int autoGenerateMissing) {
#if defined(HAVE_OPENSSL)
@ -696,6 +723,45 @@ void sslBlockSigPipe(void) {
}
}
#ifndef HAVE_SIGWAIT
// This is a non-thread-safe replacement for sigwait()
static int dummysignalno;
static void dummysignal(int signo) {
dummysignalno = signo;
}
#define sigwait x_sigwait
static int sigwait(const sigset_t *set, int *sig) {
sigset_t mask, old_mask;
sigfillset(&mask);
if (&pthread_sigmask) {
dcheck(!pthread_sigmask(SIG_BLOCK, &mask, &old_mask));
} else {
dcheck(!sigprocmask(SIG_BLOCK, &mask, &old_mask));
}
#ifndef NSIG
#define NSIG 32
#endif
struct sigaction sa[NSIG];
memset(sa, 0, sizeof(sa));
sa->sa_handler = dummysignal;
for (int i = 1; i <= NSIG; i++) {
if (sigismember(set, i)) {
sigdelset(&mask, i);
sigaction(i, sa, sa + i);
}
}
dummysignalno = -1;
sigsuspend(&mask);
if (&pthread_sigmask) {
dcheck(!pthread_sigmask(SIG_SETMASK, &old_mask, NULL));
} else {
dcheck(!sigprocmask(SIG_BLOCK, &old_mask, NULL));
}
return dummysignalno;
}
#endif
int sslUnblockSigPipe(void) {
int signum = 0;
sigset_t set;

8587
ltmain.sh

File diff suppressed because it is too large Load diff

View file

@ -74,17 +74,19 @@ static int externalFileHttpHandler(HttpConnection *http, void *arg,
// Compute file name of external file
char *fn;
check(fn = malloc(strlen((char *)arg) +
(*pathInfo ? strlen(pathInfo) + 1 : 0) + 1));
strcpy(fn, (char *)arg);
int s_size = strlen((char *)arg) +
(*pathInfo ? strlen(pathInfo) + 1 : 0);
check(fn = malloc(s_size + 1));
*fn = '\000';
strncat(fn, (char *)arg, s_size);
if (*pathInfo) {
// Append pathInfo, if available
strcat(fn, "/");
strncat(fn, "/", s_size);
const char *ptr = pathInfo;
while (*ptr == '/') {
ptr++;
}
strcat(fn, ptr);
strncat(fn, ptr, s_size);
// Any files/directories starting with a dot are inaccessible to us
do {
@ -250,13 +252,15 @@ int registerExternalFiles(void *arg, const char *key, char **value) {
// Relative URL paths get registered for each of the services
for (int i = 0; i < numServices; i++) {
char *path;
check(path = malloc(strlen(services[i]->path) + strlen(key) + 2));
strcpy(path, services[i]->path);
int s_size = strlen(services[i]->path) + strlen(key) + 1;
check(path = malloc(s_size + 1));
*path = '\000';
strncat(path, services[i]->path, s_size);
if (!*services[i]->path ||
strrchr(services[i]->path, '\000')[-1] != '/') {
strcat(path, "/");
strncat(path, "/", s_size);
}
strcat(path, key);
strncat(path, key, s_size);
serverRegisterHttpHandler(server, path, externalFileHttpHandler, *value);
free(path);
}

View file

@ -47,6 +47,7 @@
#include "config.h"
#define pthread_once x_pthread_once
#define execle x_execle
#include <dirent.h>
#include <dlfcn.h>
@ -72,6 +73,18 @@
#include <libutil.h>
#endif
#ifdef HAVE_PTY_H
#include <pty.h>
#endif
#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif
#ifdef HAVE_UTIL_H
#include <util.h>
#endif
#ifdef HAVE_UTMP_H
#include <utmp.h>
#endif
@ -93,6 +106,10 @@ struct pam_conv;
typedef struct pam_handle pam_handle_t;
#endif
#ifdef HAVE_STRLCAT
#define strncat(a,b,c) ({ char *_a = (a); strlcat(_a, (b), (c)+1); _a; })
#endif
#include "shellinabox/launcher.h"
#include "shellinabox/privileges.h"
#include "shellinabox/service.h"
@ -100,6 +117,8 @@ typedef struct pam_handle pam_handle_t;
#include "logging/logging.h"
#undef pthread_once
#undef execle
int execle(const char *, const char *, ...);
#if defined(HAVE_PTHREAD_H) && defined(__linux__)
#include <pthread.h>
@ -359,6 +378,30 @@ int supportsPAM(void) {
#endif
}
#ifndef HAVE_GETPWUID_R
// This is a not-thread-safe replacement for getpwuid_r()
#define getpwuid_r x_getpwuid_r
static int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, size_t buflen,
struct passwd **result) {
if (result) {
*result = NULL;
}
if (!pwd) {
return -1;
}
errno = 0;
struct passwd *p = getpwuid(uid);
if (!p) {
return errno ? -1 : 0;
}
*pwd = *p;
if (result) {
*result = pwd;
}
return 0;
}
#endif
int launchChild(int service, struct Session *session) {
if (launcher < 0) {
errno = EINVAL;
@ -533,7 +576,7 @@ void closeAllFds(int *exceptFds, int num) {
}
}
#ifndef HAVE_PTSNAME_R
#if !defined(HAVE_PTSNAME_R) && 0
static int ptsname_r(int fd, char *buf, size_t buflen) {
// It is unfortunate that ptsname_r is not universally available.
// For the time being, this is not a big problem, as ShellInABox is
@ -561,6 +604,13 @@ static int forkPty(int *pty, int useLogin, struct Utmp **utmp,
const char *peerName) {
int slave;
char ptyPath[PATH_MAX];
#ifdef HAVE_OPENPTY
if (openpty(pty, &slave, ptyPath, NULL, NULL) < 0) {
*pty = -1;
*utmp = NULL;
return -1;
}
#else
if ((*pty = posix_openpt(O_RDWR|O_NOCTTY)) < 0 ||
grantpt(*pty) < 0 ||
unlockpt(*pty) < 0 ||
@ -599,6 +649,7 @@ static int forkPty(int *pty, int useLogin, struct Utmp **utmp,
return -1;
}
success:
#endif
// Fill in utmp entry
*utmp = newUtmp(useLogin, ptyPath, peerName);
@ -658,31 +709,35 @@ static int forkPty(int *pty, int useLogin, struct Utmp **utmp,
static const struct passwd *getPWEnt(uid_t uid) {
struct passwd pwbuf, *pw;
char *buf;
#ifdef _SC_GETPW_R_SIZE_MAX
int len = sysconf(_SC_GETPW_R_SIZE_MAX);
if (len <= 0) {
len = 4096;
}
#else
int len = 4096;
#endif
check(buf = malloc(len));
check(!getpwuid_r(uid, &pwbuf, buf, len, &pw) && pw);
struct passwd *passwd;
check(passwd = malloc(sizeof(struct passwd) +
check(passwd = calloc(sizeof(struct passwd) +
strlen(pw->pw_name) +
strlen(pw->pw_passwd) +
strlen(pw->pw_gecos) +
strlen(pw->pw_dir) +
strlen(pw->pw_shell) + 5));
strlen(pw->pw_shell) + 5, 1));
passwd->pw_uid = pw->pw_uid;
passwd->pw_gid = pw->pw_gid;
strcpy(passwd->pw_shell = strrchr(
strcpy(passwd->pw_dir = strrchr(
strcpy(passwd->pw_gecos = strrchr(
strcpy(passwd->pw_passwd = strrchr(
strcpy(passwd->pw_name = (char *)(passwd + 1),
pw->pw_name), '\000') + 1,
pw->pw_passwd), '\000') + 1,
pw->pw_gecos), '\000') + 1,
pw->pw_dir), '\000') + 1,
pw->pw_shell);
strncat(passwd->pw_shell = strrchr(
strncat(passwd->pw_dir = strrchr(
strncat(passwd->pw_gecos = strrchr(
strncat(passwd->pw_passwd = strrchr(
strncat(passwd->pw_name = (char *)(passwd + 1),
pw->pw_name, strlen(pw->pw_name)), '\000') + 1,
pw->pw_passwd, strlen(pw->pw_passwd)), '\000') + 1,
pw->pw_gecos, strlen(pw->pw_gecos)), '\000') + 1,
pw->pw_dir, strlen(pw->pw_dir)), '\000') + 1,
pw->pw_shell, strlen(pw->pw_shell));
free(buf);
return passwd;
}
@ -997,8 +1052,10 @@ static void execService(int width, int height, struct Service *service,
int len = strlen(key);
for (char **e = environment; *e; e++, numEnvVars++) {
if (!strncmp(*e, key, len) && (*e)[len] == '=') {
check(*e = realloc(*e, len + strlen(value) + 2));
strcpy((*e) + len + 1, value);
int s_size = len + strlen(value) + 1;
check(*e = realloc(*e, s_size + 1));
(*e)[len + 1] = '\000';
strncat(*e, value, s_size);
numEnvVars = -1;
break;
}
@ -1157,7 +1214,8 @@ static void childProcess(struct Service *service, int width, int height,
check(service->cwd);
if (!*service->cwd || *service->cwd != '/' || chdir(service->cwd)) {
check(service->cwd = realloc((char *)service->cwd, 2));
strcpy((char *)service->cwd, "/");
*(char *)service->cwd = '\000';
strncat((char *)service->cwd, "/", 1);
puts("No directory, logging in with HOME=/");
check(!chdir("/"));
for (int i = 0; environment[i]; i++) {
@ -1171,8 +1229,10 @@ static void childProcess(struct Service *service, int width, int height,
// Finally, launch the child process.
if (service->useLogin) {
execle("/bin/login", "login", "-p", "-h", peerName, NULL, environment);
execle("/usr/bin/login", "login", "-p", "-h", peerName, NULL, environment);
execle("/bin/login", "login", "-p", "-h", peerName,
(void *)0, environment);
execle("/usr/bin/login", "login", "-p", "-h", peerName,
(void *)0, environment);
} else {
execService(width, height, service, peerName, environment);
}

View file

@ -153,13 +153,41 @@ void dropPrivileges(void) {
}
}
#ifndef HAVE_GETPWUID_R
// This is a not-thread-safe replacement for getpwuid_r()
#define getpwuid_r x_getpwuid_r
static int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, size_t buflen,
struct passwd **result) {
if (result) {
*result = NULL;
}
if (!pwd) {
return -1;
}
errno = 0;
struct passwd *p = getpwuid(uid);
if (!p) {
return errno ? -1 : 0;
}
*pwd = *p;
if (result) {
*result = pwd;
}
return 0;
}
#endif
const char *getUserName(uid_t uid) {
struct passwd pwbuf, *pw;
char *buf;
#ifdef _SC_GETPW_R_SIZE_MAX
int len = sysconf(_SC_GETPW_R_SIZE_MAX);
if (len <= 0) {
len = 4096;
}
#else
int len = 4096;
#endif
check(buf = malloc(len));
char *user;
if (getpwuid_r(uid, &pwbuf, buf, len, &pw) || !pw) {
@ -172,13 +200,41 @@ const char *getUserName(uid_t uid) {
return user;
}
#ifndef HAVE_GETPWNAM_R
// This is a not-thread-safe replacement for getpwnam_r()
#define getpwnam_r x_getpwnam_r
static int getpwnam_r(const char *name, struct passwd *pwd, char *buf,
size_t buflen, struct passwd **result) {
if (result) {
*result = NULL;
}
if (!pwd) {
return -1;
}
errno = 0;
struct passwd *p = getpwnam(name);
if (!p) {
return errno ? -1 : 0;
}
*pwd = *p;
if (result) {
*result = pwd;
}
return 0;
}
#endif
uid_t getUserId(const char *name) {
struct passwd pwbuf, *pw;
char *buf;
#ifdef _SC_GETPW_R_SIZE_MAX
int len = sysconf(_SC_GETPW_R_SIZE_MAX);
if (len <= 0) {
len = 4096;
}
#else
int len = 4096;
#endif
check(buf = malloc(len));
if (getpwnam_r(name, &pwbuf, buf, len, &pw) || !pw) {
fatal("Cannot look up user id \"%s\"", name);
@ -205,13 +261,41 @@ uid_t parseUser(const char *arg, const char **name) {
}
}
#ifndef HAVE_GETGRGID_R
// This is a not-thread-safe replacement for getgrgid_r()
#define getgrgid_r x_getgrgid_r
static int getgrgid_r(gid_t gid, struct group *grp, char *buf, size_t buflen,
struct group **result) {
if (result) {
*result = NULL;
}
if (!grp) {
return -1;
}
errno = 0;
struct group *g = getgrgid(gid);
if (!g) {
return errno ? -1 : 0;
}
*grp = *g;
if (result) {
*result = grp;
}
return 0;
}
#endif
const char *getGroupName(gid_t gid) {
struct group grbuf, *gr;
char *buf;
#ifdef _SC_GETGR_R_SIZE_MAX
int len = sysconf(_SC_GETGR_R_SIZE_MAX);
if (len <= 0) {
len = 4096;
}
#else
int len = 4096;
#endif
check(buf = malloc(len));
char *group;
if (getgrgid_r(gid, &grbuf, buf, len, &gr) || !gr) {
@ -224,23 +308,55 @@ const char *getGroupName(gid_t gid) {
return group;
}
#ifndef HAVE_GETGRNAM_R
// This is a not-thread-safe replacement for getgrnam_r()
#define getgrnam_r x_getgrnam_r
static int getgrnam_r(const char *name, struct group *grp, char *buf,
size_t buflen, struct group **result) {
if (result) {
*result = NULL;
}
if (!grp) {
return -1;
}
errno = 0;
struct group *g = getgrnam(name);
if (!g) {
return errno ? -1 : 0;
}
*grp = *g;
if (result) {
*result = grp;
}
return 0;
}
#endif
gid_t getGroupId(const char *name) {
struct group grbuf, *gr;
char *buf;
#ifdef _SC_GETGR_R_SIZE_MAX
int gr_len = sysconf(_SC_GETGR_R_SIZE_MAX);
if (gr_len <= 0) {
gr_len = 4096;
}
#else
int gr_len = 4096;
#endif
check(buf = malloc(gr_len));
if (getgrnam_r(name, &grbuf, buf, gr_len, &gr) || !gr) {
// Maybe, this system does not have a "nogroup" group. Substitute the
// group of the "nobody" user.
if (!strcmp(name, "nogroup")) {
struct passwd pwbuf, *pw;
#ifdef _SC_GETPW_R_SIZE_MAX
int pw_len = sysconf(_SC_GETPW_R_SIZE_MAX);
if (pw_len <= 0) {
pw_len = 4096;
}
#else
int pw_len = 4096;
#endif
if (pw_len > gr_len) {
check(buf = realloc(buf, pw_len));
}

View file

@ -355,7 +355,7 @@ ShellInABox.prototype.extendContextMenu = function(entries, actions) {
};
ShellInABox.prototype.about = function() {
alert("Shell In A Box version " + "2.7 (revision 118)" +
alert("Shell In A Box version " + "2.7 (revision 119)" +
"\nCopyright 2008-2009 by Markus Gutschke\n" +
"For more information check http://shellinabox.com" +
(typeof serverSupportsSSL != 'undefined' && serverSupportsSSL ?

View file

@ -450,6 +450,13 @@ static void serveStaticFile(HttpConnection *http, const char *contentType,
httpTransfer(http, response, len);
}
static const char *addr(const char *a) {
// Work-around for a gcc bug that could occasionally generate invalid
// assembly instructions when optimizing code too agressively.
asm volatile("");
return a;
}
static int shellInABoxHttpHandler(HttpConnection *http, void *arg,
const char *buf, int len) {
checkGraveyard();
@ -520,8 +527,8 @@ static int shellInABoxHttpHandler(HttpConnection *http, void *arg,
noBeep ? "true" : "false");
int stateVarsLength = strlen(stateVars);
int contentLength = stateVarsLength +
(vt100End - vt100Start) +
(shellInABoxEnd - shellInABoxStart);
(addr(vt100End) - addr(vt100Start)) +
(addr(shellInABoxEnd) - addr(shellInABoxStart));
char *response = stringPrintf(NULL,
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/javascript; charset=utf-8\r\n"

View file

@ -1500,7 +1500,7 @@ VT100.prototype.toggleBell = function() {
};
VT100.prototype.about = function() {
alert("VT100 Terminal Emulator " + "2.7 (revision 118)" +
alert("VT100 Terminal Emulator " + "2.7 (revision 119)" +
"\nCopyright 2008-2009 by Markus Gutschke\n" +
"For more information check http://shellinabox.com");
};