tons of bugfixes

This commit is contained in:
Chia-Che Tsai
2015-03-31 14:29:34 -04:00
parent 1eba8e4351
commit 328ca4af9b
45 changed files with 664 additions and 682 deletions
+3 -5
View File
@@ -4,13 +4,11 @@ BUILD_DIR = build
GLIBC_TARGET = $(addprefix $(BUILD_DIR)/,libc.so.6 ld-linux-x86-64.so.2)
all: $(GLIBC_TARGET)
make -C $(SHIM_DIR)/src
make -C $(SHIM_DIR)/test
make -C $(SHIM_DIR) all
debug: DEBUG=debug
debug: $(GLIBC_TARGET)
make -C $(SHIM_DIR)/src debug
make -C $(SHIM_DIR)/test debug
make -C $(SHIM_DIR) debug
# nothing to install
install:
@@ -28,5 +26,5 @@ $(GLIBC_SRC)/configure:
[ ! -f $(GLIBC_SRC).patch ] || git apply $(GLIBC_SRC).patch
clean:
make -C $(SHIM_DIR)/src clean
make -C $(SHIM_DIR) clean
rm -rf $(BUILD_DIR)
+1 -2
View File
@@ -1,11 +1,10 @@
MAKEFLAGS += --check-symlink-times
TARGET := all debug clean
SRC_DIRS := src
TESTS_DIRS := test
DIRS := ${SRC_DIRS} ${TESTS_DIRS}
${TARGET}: ${DIRS}
all debug clean: ${DIRS}
for d in ${DIRS}; \
do \
make $@ -C $$d; \
+2 -1
View File
@@ -79,6 +79,7 @@ struct shim_thread {
void * stack, * stack_top, * stack_red;
void * tcb;
bool user_tcb; /* is tcb assigned by user? */
void * frameptr;
REFTYPE ref_count;
@@ -121,7 +122,7 @@ void get_simple_thread (struct shim_simple_thread * thread);
void put_simple_thread (struct shim_simple_thread * thread);
void allocate_tls (void * tcb_location, struct shim_thread * thread);
void populate_tls (void * tcb_location);
void populate_tls (void * tcb_location, bool user);
void debug_setprefix (shim_tcb_t * tcb);
+8 -14
View File
@@ -593,6 +593,7 @@ void switch_dummy_thread (struct shim_thread * thread)
DkThreadPrivate(real_thread->tcb);
set_cur_thread(real_thread);
debug("set tcb to %p\n", real_thread->tcb);
debug("jump to the stack %p\n", real_thread->frameptr);
debug("shim_vfork success (returning %d)\n", child);
@@ -732,13 +733,13 @@ RESUME_FUNC_BODY(thread)
if (thread->handle_map)
get_handle_map(thread->handle_map);
#ifndef DEBUG_RESUME
//#ifdef DEBUG_RESUME
debug("thread: "
"tid=%d,tgid=%d,parent=%d,stack=%p,frameptr=%p,tcb=%p\n",
thread->tid, thread->tgid,
thread->parent ? thread->parent->tid : thread->tid,
thread->stack, thread->frameptr, thread->tcb);
#endif
//#endif
}
END_RESUME_FUNC
@@ -755,16 +756,13 @@ MIGRATE_FUNC_BODY(running_thread)
DO_MIGRATE(thread, thread, thread_obj, recursive);
ADD_FUNC_ENTRY(new_thread);
__libc_tcb_t * tcb = thread->tcb;
if (tcb && lookup_supervma(tcb, sizeof(__libc_tcb_t), NULL) < 0) {
if (!thread->user_tcb) {
ADD_OFFSET(sizeof(__libc_tcb_t));
ADD_ENTRY(ADDR, base + *offset);
if (!dry) {
__libc_tcb_t * new_tcb = (void *) (base + *offset);
memcpy(new_tcb, tcb, sizeof(__libc_tcb_t));
new_thread->tcb = new_tcb;
memcpy(new_tcb, thread->tcb, sizeof(__libc_tcb_t));
}
} else {
ADD_ENTRY(ADDR, NULL);
}
}
END_MIGRATE_FUNC
@@ -782,6 +780,7 @@ int resume_wrapper (void * param)
thread->in_vm = thread->is_alive = true;
allocate_tls(libc_tcb, thread);
debug_setbuf(tcb, true);
debug("set tcb to %p\n", libc_tcb);
DkObjectsWaitAny(1, &thread_start_event, NO_TIMEOUT);
@@ -798,12 +797,6 @@ RESUME_FUNC_BODY(running_thread)
get_thread(thread);
void * new_tcb = (void *) GET_ENTRY(ADDR);
if (new_tcb) {
RESUME_REBASE(new_tcb);
thread->tcb = new_tcb;
}
if (cur_thread) {
PAL_HANDLE handle = DkThreadCreate(resume_wrapper, thread, 0);
if (!thread)
@@ -819,6 +812,7 @@ RESUME_FUNC_BODY(running_thread)
tcb->debug_buf = SHIM_GET_TLS()->debug_buf;
allocate_tls(libc_tcb, thread);
debug_setprefix(tcb);
debug("after resume, set tcb to %p\n", libc_tcb);
} else {
set_cur_thread(thread);
}
+18 -37
View File
@@ -90,26 +90,6 @@ static inline int test_vma_overlap (struct shim_vma * tmp,
test_vma_startin (tmp, addr, length - 1);
}
static void * heap_base = &__load_address;
static int __set_heap_base (void)
{
unsigned long heap_addr = (unsigned long) &__load_address;
unsigned long shim_size = (unsigned long) &__load_address_end -
(unsigned long) &__load_address;
unsigned long base_size = allocsize;
while ((base_size >> 12) < shim_size)
base_size <<= 1;
while ((base_size << 6) < heap_addr)
base_size <<= 1;
heap_base = (void *) &__load_address - base_size;
debug("heap base is %p\n", heap_base);
return 0;
}
int bkeep_shim_heap (void);
int init_vma (void)
@@ -118,7 +98,6 @@ int init_vma (void)
return -ENOMEM;
bkeep_shim_heap();
__set_heap_base();
create_lock(vma_list_lock);
return 0;
@@ -617,41 +596,43 @@ int bkeep_mprotect (void * addr, size_t length, int prot, const int * flags)
void * get_unmapped_vma (size_t length, int flags)
{
struct shim_vma * tmp, * prev = NULL, * new;
void * addr = heap_base;
new = get_new_vma();
struct shim_vma * new = get_new_vma();
if (!new)
return NULL;
struct shim_vma * tmp, * prev = NULL;
lock(vma_list_lock);
list_for_each_entry_reverse(tmp, &vma_list, list) {
if (tmp->addr >= addr)
continue;
new->addr = pal_control.user_address_begin;
new->length = length;
new->flags = flags|VMA_UNMAPPED;
if (tmp->addr + tmp->length + length <= addr) {
list_for_each_entry(tmp, &vma_list, list) {
if (tmp->addr <= new->addr) {
if (tmp->addr + tmp->length > new->addr)
new->addr = tmp->addr + tmp->length;
prev = tmp;
break;
continue;
}
addr = tmp->addr;
if (tmp->addr >= new->addr + length)
break;
new->addr = tmp->addr + tmp->length;
prev = tmp;
}
if ((unsigned long) addr < length) {
if (new->addr + length > pal_control.user_address_end) {
unlock(vma_list_lock);
put_vma(new);
return NULL;
}
new->addr = (addr -= length);
new->length = length;
new->flags = flags|VMA_UNMAPPED;
assert(!prev || prev->addr + prev->length <= new->addr);
get_vma(new);
list_add(&new->list, prev ? &prev->list : &vma_list);
unlock(vma_list_lock);
return addr;
return new->addr;
}
/* This might not give the same vma but we might need to
@@ -855,7 +836,7 @@ int dump_all_vmas (struct shim_thread * thread, char * buf, size_t size)
if (vma->comment[0])
cnt += snprintf(buf + cnt, size - cnt,
" %c%c%cp 00000000 00:00 0 [%s]\n",
prot[0], prot[1], prot[2], vma->comment[0]);
prot[0], prot[1], prot[2], vma->comment);
else
cnt += snprintf(buf + cnt, size - cnt,
" %c%c%cp 00000000 00:00 0\n",
-1
View File
@@ -382,7 +382,6 @@ __lookup_dcache (struct shim_dentry * start, const char * name, int namelen,
continue;
if (memcmp(fullpath, path, pathlen))
continue;
debug("dentry %p matched path: %s\n", dent, path);
}
get_dentry(dent);
+5 -1
View File
@@ -180,6 +180,11 @@ static int socket_poll (struct shim_handle * hdl, int poll_type)
ret = -ENOTCONN;
goto out;
}
if (sock->sock_state == SOCK_LISTENED) {
ret = -EAGAIN;
goto out;
}
}
if (sock->sock_type == SOCK_DGRAM &&
@@ -187,7 +192,6 @@ static int socket_poll (struct shim_handle * hdl, int poll_type)
ret = -ENOTCONN;
goto out;
}
}
if (poll_type & FS_POLL_WR) {
+1
View File
@@ -738,6 +738,7 @@ static void shim_ipc_helper (void * arg)
__libc_tcb_t tcb;
allocate_tls(&tcb, self);
debug_setbuf(&tcb.shim_tcb, true);
debug("set tcb to %p\n", &tcb);
lock(ipc_helper_lock);
bool notme = (self != ipc_helper_thread);
+1
View File
@@ -109,6 +109,7 @@ static void shim_async_helper (void * arg)
__libc_tcb_t tcb;
allocate_tls(&tcb, self);
debug_setbuf(&tcb.shim_tcb, true);
debug("set tcb to %p\n", &tcb);
lock(async_helper_lock);
+6 -2
View File
@@ -146,6 +146,7 @@ void allocate_tls (void * tcb_location, struct shim_thread * thread)
if (thread) {
thread->tcb = tcb;
thread->user_tcb = false;
tcb->shim_tcb.tp = thread;
tcb->shim_tcb.tid = thread->tid;
} else {
@@ -157,7 +158,7 @@ void allocate_tls (void * tcb_location, struct shim_thread * thread)
assert(SHIM_TLS_CHECK_CANARY());
}
void populate_tls (void * tcb_location)
void populate_tls (void * tcb_location, bool user)
{
__libc_tcb_t * tcb = (__libc_tcb_t *) tcb_location;
assert(tcb);
@@ -165,8 +166,10 @@ void populate_tls (void * tcb_location)
copy_tcb(&tcb->shim_tcb, SHIM_GET_TLS());
struct shim_thread * thread = (struct shim_thread *) tcb->shim_tcb.tp;
if (thread)
if (thread) {
thread->tcb = tcb;
thread->user_tcb = user;
}
DkThreadPrivate(tcb);
assert(SHIM_TLS_CHECK_CANARY());
@@ -590,6 +593,7 @@ int shim_init (int argc, void * args, void ** return_stack)
memset(&tcb, 0, sizeof(__libc_tcb_t));
allocate_tls(&tcb, NULL);
debug_setbuf(&tcb.shim_tcb, true);
debug("set tcb to %p\n", &tcb);
#ifdef PROFILE
unsigned long begin_time = GET_PROFILE_INTERVAL();
+2 -1
View File
@@ -671,7 +671,8 @@ void * shim_do_arch_prctl (int code, void * addr)
if (!addr)
return (void *) -EINVAL;
populate_tls(addr);
populate_tls(addr, true);
debug("set tcb to %p\n", (void *) addr);
return NULL;
case ARCH_GET_FS:
+2
View File
@@ -110,6 +110,7 @@ int clone_implementation_wrapper(struct clone_args * arg)
allocate_tls(my_thread->tcb, my_thread);
shim_tcb_t * tcb = &((__libc_tcb_t *) my_thread->tcb)->shim_tcb;
debug_setbuf(tcb, true);
debug("set tcb to %p\n", my_thread->tcb);
struct shim_regs * regs = __alloca(sizeof(struct shim_regs));
*regs = *((__libc_tcb_t *) arg->parent->tcb)->shim_tcb.context.regs;
@@ -216,6 +217,7 @@ int shim_do_clone (int flags, void * user_stack_addr, int * parent_tidptr,
goto failed;
}
thread->tcb = tls;
thread->user_tcb = true;
} else {
thread->tcb = NULL;
}
+5 -1
View File
@@ -87,7 +87,8 @@ int shim_do_execve_rtld (struct shim_handle * hdl, const char ** argv,
if (!tcb)
return -ENOMEM;
populate_tls(tcb);
populate_tls(tcb, false);
debug("set tcb to %p\n", tcb);
put_handle(cur_thread->exec);
get_handle(hdl);
@@ -306,12 +307,14 @@ retry:
void * stack = cur_thread->stack;
void * stack_top = cur_thread->stack_top;
void * tcb = cur_thread->tcb;
bool user_tcb = cur_thread->user_tcb;
void * frameptr = cur_thread->frameptr;
cur_thread->stack = NULL;
cur_thread->stack_top = NULL;
cur_thread->frameptr = NULL;
cur_thread->tcb = NULL;
cur_thread->user_tcb = false;
cur_thread->in_vm = false;
unlock(cur_thread->lock);
@@ -325,6 +328,7 @@ retry:
cur_thread->stack_top = stack_top;
cur_thread->frameptr = frameptr;
cur_thread->tcb = tcb;
cur_thread->user_tcb = user_tcb;
if (ret < 0) {
cur_thread->in_vm = true;
+1
View File
@@ -104,6 +104,7 @@ int shim_do_fork (void)
return -ENOMEM;
new_thread->tcb = cur_thread->tcb;
new_thread->user_tcb = cur_thread->user_tcb;
new_thread->tgid = new_thread->tid;
new_thread->in_vm = false;
new_thread->is_alive = true;
+2
View File
@@ -84,6 +84,8 @@ int shim_do_vfork (void)
new_thread->is_alive = true;
new_thread->stack = cur_thread->stack;
new_thread->stack_top = cur_thread->stack_top;
new_thread->tcb = cur_thread->tcb;
new_thread->user_tcb = cur_thread->user_tcb;
cur_thread->stack = dummy_stack;
cur_thread->stack_top = dummy_stack + stack_size;
cur_thread->frameptr = NULL;
+4 -4
View File
@@ -7,11 +7,11 @@ level = ../
include ../Makefile
manifest_rules = \
-e 's:\$$(PAL):$(shell pwd)/pal_loader:g' \
-e 's:\$$(PWD):$(shell pwd)/$(appdir):g' \
-e 's:\$$(PAL):$(abspath $(PWD)/../pal_loader):g' \
-e 's:\$$(PWD):$(PWD):g' \
-e 's:\$$(BIN):$(subst .manifest,,$(notdir $@)):g' \
-e 's:\$$(SHIMPATH):$(shell readlink -f ../../src/libsysdb.so):g' \
-e 's:\$$(GLIBCDIR):$(shell readlink -f $(glibc_dir)):g' \
-e 's:\$$(SHIMPATH):$(abspath ../../src/libsysdb.so):g' \
-e 's:\$$(GLIBCDIR):$(abspath $(glibc_dir)):g' \
$(extra_rules)
%.manifest: %.manifest.template
+1 -1
View File
@@ -10,7 +10,7 @@ endif
HTTPD_DIR = httpd-2.4.3
APR_DIR = apr-1.4.6
APRUTIL_DIR = apr-util-1.5.1
PHP_DIR = php-5.3.16
PHP_DIR = php-5.6.6
INSTALL_DIR = $(PWD)/obj
SRC_DIRS = $(HTTPD_DIR) $(APR_DIR) $(APRUTIL_DIR) $(PHP_DIR)
+3 -3
View File
@@ -1,4 +1,4 @@
busybox_src = busybox-1.19.4
busybox_src = busybox-1.23.1
manifests = busybox.manifest busybox_nofork.manifest
targets = busybox busybox_gdb busybox_nofork busybox_nofork_gdb $(manifests)
@@ -10,14 +10,14 @@ debug: MAKE_FLAGS=CC="gcc -g"
debug: $(targets)
busybox busybox_gdb: config_for_graphene
[ -d $(busybox_src) ] || tar -xzf $(busybox_src).tar.gz
[ -d $(busybox_src) ] || tar -xjf $(busybox_src).tar.bz2
cp config_for_graphene $(busybox_src)/.config
cd $(busybox_src) && make $(MAKE_FLAGS)
cp $(busybox_src)/busybox busybox
cp $(busybox_src)/busybox_unstripped busybox_gdb
busybox_nofork busybox_nofork_gdb: $(busybox_src) config_for_graphene_nofork
[ -d $(busybox_src) ] || tar -xzf $(busybox_src).tar.gz
[ -d $(busybox_src) ] || tar -xjf $(busybox_src).tar.bz2
cp config_for_graphene_nofork $(busybox_src)/.config
cd $(busybox_src) && make $(MAKE_FLAGS)
cp $(busybox_src)/busybox busybox_nofork
Binary file not shown.
Binary file not shown.
+102 -57
View File
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Busybox version: 1.19.4
# Wed Mar 28 21:27:36 2012
# Busybox version: 1.23.1
# Thu Feb 26 19:10:09 2015
#
CONFIG_HAVE_DOT_CONFIG=y
@@ -36,12 +36,15 @@ CONFIG_LAST_SUPPORTED_WCHAR=767
# CONFIG_UNICODE_BIDI_SUPPORT is not set
# CONFIG_UNICODE_NEUTRAL_TABLE is not set
# CONFIG_UNICODE_PRESERVE_BROKEN is not set
# CONFIG_PAM is not set
CONFIG_FEATURE_USE_SENDFILE=y
CONFIG_LONG_OPTS=y
# CONFIG_FEATURE_DEVPTS is not set
# CONFIG_FEATURE_CLEAN_UP is not set
# CONFIG_FEATURE_UTMP is not set
# CONFIG_FEATURE_WTMP is not set
# CONFIG_FEATURE_PIDFILE is not set
CONFIG_PID_FILE_PATH=""
# CONFIG_FEATURE_SUID is not set
# CONFIG_FEATURE_SUID_CONFIG is not set
# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
@@ -62,13 +65,17 @@ CONFIG_FEATURE_HAVE_RPC=y
# CONFIG_FEATURE_SHARED_BUSYBOX is not set
# CONFIG_LFS is not set
CONFIG_CROSS_COMPILER_PREFIX=""
CONFIG_SYSROOT=""
CONFIG_EXTRA_CFLAGS="-g -lc"
CONFIG_EXTRA_LDFLAGS=""
CONFIG_EXTRA_LDLIBS=""
#
# Debugging Options
#
# CONFIG_DEBUG is not set
# CONFIG_DEBUG_PESSIMIZE is not set
# CONFIG_UNIT_TEST is not set
# CONFIG_WERROR is not set
CONFIG_NO_DEBUG_LIB=y
# CONFIG_DMALLOC is not set
@@ -92,7 +99,8 @@ CONFIG_PREFIX="./_install"
# CONFIG_FEATURE_SYSTEMD is not set
# CONFIG_FEATURE_RTMINMAX is not set
CONFIG_PASSWORD_MINLEN=6
CONFIG_MD5_SIZE_VS_SPEED=2
CONFIG_MD5_SMALL=1
CONFIG_SHA3_SMALL=1
# CONFIG_FEATURE_FAST_TOP is not set
# CONFIG_FEATURE_ETC_NETWORKS is not set
# CONFIG_FEATURE_USE_TERMIOS is not set
@@ -101,6 +109,7 @@ CONFIG_FEATURE_EDITING_MAX_LEN=1024
# CONFIG_FEATURE_EDITING_VI is not set
CONFIG_FEATURE_EDITING_HISTORY=255
CONFIG_FEATURE_EDITING_SAVEHISTORY=y
# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
CONFIG_FEATURE_REVERSE_SEARCH=y
CONFIG_FEATURE_TAB_COMPLETION=y
# CONFIG_FEATURE_USERNAME_COMPLETION is not set
@@ -129,7 +138,14 @@ CONFIG_FEATURE_COPYBUF_KB=4
# CONFIG_AR is not set
# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
# CONFIG_FEATURE_AR_CREATE is not set
# CONFIG_UNCOMPRESS is not set
# CONFIG_GUNZIP is not set
# CONFIG_BUNZIP2 is not set
# CONFIG_UNLZMA is not set
# CONFIG_FEATURE_LZMA_FAST is not set
# CONFIG_LZMA is not set
# CONFIG_UNXZ is not set
# CONFIG_XZ is not set
CONFIG_BZIP2=y
# CONFIG_CPIO is not set
# CONFIG_FEATURE_CPIO_O is not set
@@ -137,13 +153,13 @@ CONFIG_BZIP2=y
# CONFIG_DPKG is not set
# CONFIG_DPKG_DEB is not set
# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
# CONFIG_GUNZIP is not set
CONFIG_GZIP=y
# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
CONFIG_GZIP_FAST=0
# CONFIG_LZOP is not set
# CONFIG_LZOP_COMPR_HIGH is not set
# CONFIG_RPM2CPIO is not set
# CONFIG_RPM is not set
# CONFIG_RPM2CPIO is not set
CONFIG_TAR=y
# CONFIG_FEATURE_TAR_CREATE is not set
# CONFIG_FEATURE_TAR_AUTODETECT is not set
@@ -156,12 +172,6 @@ CONFIG_TAR=y
# CONFIG_FEATURE_TAR_UNAME_GNAME is not set
# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set
# CONFIG_FEATURE_TAR_SELINUX is not set
# CONFIG_UNCOMPRESS is not set
# CONFIG_UNLZMA is not set
# CONFIG_FEATURE_LZMA_FAST is not set
# CONFIG_LZMA is not set
# CONFIG_UNXZ is not set
# CONFIG_XZ is not set
# CONFIG_UNZIP is not set
#
@@ -173,14 +183,19 @@ CONFIG_DATE=y
CONFIG_FEATURE_DATE_ISOFMT=y
# CONFIG_FEATURE_DATE_NANO is not set
CONFIG_FEATURE_DATE_COMPAT=y
CONFIG_HOSTID=y
CONFIG_ID=y
CONFIG_GROUPS=y
CONFIG_SHUF=y
CONFIG_TEST=y
CONFIG_FEATURE_TEST_64=y
CONFIG_TOUCH=y
CONFIG_FEATURE_TOUCH_NODEREF=y
CONFIG_FEATURE_TOUCH_SUSV3=y
CONFIG_TR=y
CONFIG_FEATURE_TR_CLASSES=y
CONFIG_FEATURE_TR_EQUIV=y
CONFIG_UNLINK=y
CONFIG_BASE64=y
# CONFIG_WHO is not set
# CONFIG_USERS is not set
@@ -220,7 +235,6 @@ CONFIG_FOLD=y
CONFIG_FSYNC=y
CONFIG_HEAD=y
CONFIG_FEATURE_FANCY_HEAD=y
CONFIG_HOSTID=y
CONFIG_INSTALL=y
CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
CONFIG_LN=y
@@ -257,6 +271,7 @@ CONFIG_SEQ=y
CONFIG_SHA1SUM=y
CONFIG_SHA256SUM=y
CONFIG_SHA512SUM=y
CONFIG_SHA3SUM=y
CONFIG_SLEEP=y
CONFIG_FEATURE_FANCY_SLEEP=y
CONFIG_FEATURE_FLOAT_SLEEP=y
@@ -288,6 +303,11 @@ CONFIG_FEATURE_WC_LARGE=y
CONFIG_WHOAMI=y
CONFIG_YES=y
#
# Common options
#
CONFIG_FEATURE_VERBOSE=y
#
# Common options for cp and mv
#
@@ -304,7 +324,7 @@ CONFIG_FEATURE_AUTOWIDTH=y
CONFIG_FEATURE_HUMAN_READABLE=y
#
# Common options for md5sum, sha1sum, sha256sum, sha512sum
# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
#
CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
@@ -354,7 +374,16 @@ CONFIG_WHICH=y
#
# Editors
#
# CONFIG_AWK is not set
# CONFIG_FEATURE_AWK_LIBM is not set
# CONFIG_FEATURE_AWK_GNU_EXTENSIONS is not set
# CONFIG_CMP is not set
# CONFIG_DIFF is not set
# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set
# CONFIG_FEATURE_DIFF_DIR is not set
# CONFIG_ED is not set
# CONFIG_PATCH is not set
# CONFIG_SED is not set
# CONFIG_VI is not set
CONFIG_FEATURE_VI_MAX_LEN=0
# CONFIG_FEATURE_VI_8BIT is not set
@@ -369,15 +398,9 @@ CONFIG_FEATURE_VI_MAX_LEN=0
# CONFIG_FEATURE_VI_SET is not set
# CONFIG_FEATURE_VI_WIN_RESIZE is not set
# CONFIG_FEATURE_VI_ASK_TERMINAL is not set
# CONFIG_FEATURE_VI_OPTIMIZE_CURSOR is not set
# CONFIG_AWK is not set
# CONFIG_FEATURE_AWK_LIBM is not set
# CONFIG_CMP is not set
# CONFIG_DIFF is not set
# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set
# CONFIG_FEATURE_DIFF_DIR is not set
# CONFIG_ED is not set
# CONFIG_SED is not set
# CONFIG_FEATURE_VI_UNDO is not set
# CONFIG_FEATURE_VI_UNDO_QUEUE is not set
CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=0
# CONFIG_FEATURE_ALLOW_EXEC is not set
#
@@ -394,6 +417,7 @@ CONFIG_FEATURE_FIND_MAXDEPTH=y
CONFIG_FEATURE_FIND_NEWER=y
CONFIG_FEATURE_FIND_INUM=y
CONFIG_FEATURE_FIND_EXEC=y
CONFIG_FEATURE_FIND_EXEC_PLUS=y
CONFIG_FEATURE_FIND_USER=y
CONFIG_FEATURE_FIND_GROUP=y
CONFIG_FEATURE_FIND_NOT=y
@@ -415,6 +439,7 @@ CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y
CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y
#
# Init Utilities
@@ -451,6 +476,7 @@ CONFIG_ADD_SHELL=y
# CONFIG_ADDUSER is not set
# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set
# CONFIG_FEATURE_CHECK_NAMES is not set
CONFIG_LAST_ID=0
CONFIG_FIRST_SYSTEM_ID=0
CONFIG_LAST_SYSTEM_ID=0
# CONFIG_ADDGROUP is not set
@@ -461,7 +487,7 @@ CONFIG_LAST_SYSTEM_ID=0
# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set
# CONFIG_GETTY is not set
# CONFIG_LOGIN is not set
# CONFIG_PAM is not set
# CONFIG_LOGIN_SESSION_AS_CHILD is not set
# CONFIG_LOGIN_SCRIPTS is not set
# CONFIG_FEATURE_NOLOGIN is not set
# CONFIG_FEATURE_SECURETTY is not set
@@ -469,6 +495,7 @@ CONFIG_LAST_SYSTEM_ID=0
# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set
# CONFIG_CRYPTPW is not set
# CONFIG_CHPASSWD is not set
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO=""
# CONFIG_SU is not set
# CONFIG_FEATURE_SU_SYSLOG is not set
# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set
@@ -518,6 +545,14 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# Linux System Utilities
#
# CONFIG_BLOCKDEV is not set
CONFIG_FATATTR=y
CONFIG_FSTRIM=y
# CONFIG_MDEV is not set
# CONFIG_FEATURE_MDEV_CONF is not set
# CONFIG_FEATURE_MDEV_RENAME is not set
# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
# CONFIG_FEATURE_MDEV_EXEC is not set
# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
# CONFIG_REV is not set
# CONFIG_ACPID is not set
# CONFIG_FEATURE_ACPID_COMPAT is not set
@@ -561,12 +596,6 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_LOSETUP is not set
# CONFIG_LSPCI is not set
# CONFIG_LSUSB is not set
# CONFIG_MDEV is not set
# CONFIG_FEATURE_MDEV_CONF is not set
# CONFIG_FEATURE_MDEV_RENAME is not set
# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
# CONFIG_FEATURE_MDEV_EXEC is not set
# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
# CONFIG_MKSWAP is not set
# CONFIG_FEATURE_MKSWAP_UUID is not set
# CONFIG_MORE is not set
@@ -588,6 +617,7 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_SCRIPTREPLAY is not set
# CONFIG_SETARCH is not set
# CONFIG_SWAPONOFF is not set
# CONFIG_FEATURE_SWAPON_DISCARD is not set
# CONFIG_FEATURE_SWAPON_PRI is not set
# CONFIG_SWITCH_ROOT is not set
# CONFIG_UMOUNT is not set
@@ -596,28 +626,36 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set
# CONFIG_FEATURE_MTAB_SUPPORT is not set
# CONFIG_VOLUMEID is not set
# CONFIG_FEATURE_VOLUMEID_EXT is not set
# CONFIG_FEATURE_VOLUMEID_BTRFS is not set
# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
# CONFIG_FEATURE_VOLUMEID_EXFAT is not set
# CONFIG_FEATURE_VOLUMEID_EXT is not set
# CONFIG_FEATURE_VOLUMEID_F2FS is not set
# CONFIG_FEATURE_VOLUMEID_FAT is not set
# CONFIG_FEATURE_VOLUMEID_HFS is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
# CONFIG_FEATURE_VOLUMEID_XFS is not set
# CONFIG_FEATURE_VOLUMEID_NTFS is not set
# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set
# CONFIG_FEATURE_VOLUMEID_UDF is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
# CONFIG_FEATURE_VOLUMEID_SYSV is not set
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
# CONFIG_FEATURE_VOLUMEID_NILFS is not set
# CONFIG_FEATURE_VOLUMEID_NTFS is not set
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set
# CONFIG_FEATURE_VOLUMEID_SYSV is not set
# CONFIG_FEATURE_VOLUMEID_UDF is not set
# CONFIG_FEATURE_VOLUMEID_XFS is not set
#
# Miscellaneous Utilities
#
# CONFIG_CONSPY is not set
CONFIG_CROND=y
CONFIG_FEATURE_CROND_D=y
CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
CONFIG_LESS=y
CONFIG_FEATURE_LESS_MAXLINES=9999999
CONFIG_FEATURE_LESS_BRACKETS=y
@@ -630,13 +668,17 @@ CONFIG_FEATURE_LESS_DASHCMD=y
CONFIG_FEATURE_LESS_LINENUMS=y
# CONFIG_NANDWRITE is not set
# CONFIG_NANDDUMP is not set
# CONFIG_RFKILL is not set
CONFIG_SETSERIAL=y
# CONFIG_TASKSET is not set
# CONFIG_FEATURE_TASKSET_FANCY is not set
CONFIG_UBIATTACH=y
CONFIG_UBIDETACH=y
CONFIG_UBIMKVOL=y
CONFIG_UBIRMVOL=y
CONFIG_UBIRSVOL=y
CONFIG_UBIUPDATEVOL=y
# CONFIG_WALL is not set
CONFIG_ADJTIMEX=y
# CONFIG_BBCONFIG is not set
# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
@@ -652,10 +694,6 @@ CONFIG_FEATURE_CHAT_SEND_ESCAPES=y
CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y
CONFIG_FEATURE_CHAT_CLR_ABORT=y
CONFIG_CHRT=y
CONFIG_CROND=y
CONFIG_FEATURE_CROND_D=y
CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
CONFIG_CRONTAB=y
CONFIG_DC=y
CONFIG_FEATURE_DC_LIBM=y
@@ -693,18 +731,14 @@ CONFIG_MOUNTPOINT=y
CONFIG_MT=y
CONFIG_RAIDAUTORUN=y
# CONFIG_READAHEAD is not set
# CONFIG_RFKILL is not set
# CONFIG_RUNLEVEL is not set
CONFIG_RX=y
CONFIG_SETSID=y
CONFIG_STRINGS=y
# CONFIG_TASKSET is not set
# CONFIG_FEATURE_TASKSET_FANCY is not set
CONFIG_TIME=y
CONFIG_TIMEOUT=y
CONFIG_TTYSIZE=y
CONFIG_VOLNAME=y
# CONFIG_WALL is not set
CONFIG_WATCHDOG=y
#
@@ -736,13 +770,13 @@ CONFIG_FAKEIDENTD=y
CONFIG_FTPD=y
CONFIG_FEATURE_FTP_WRITE=y
CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y
CONFIG_FEATURE_FTP_AUTHENTICATION=y
CONFIG_FTPGET=y
CONFIG_FTPPUT=y
CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
CONFIG_HOSTNAME=y
CONFIG_HTTPD=y
CONFIG_FEATURE_HTTPD_RANGES=y
CONFIG_FEATURE_HTTPD_USE_SENDFILE=y
CONFIG_FEATURE_HTTPD_SETUID=y
CONFIG_FEATURE_HTTPD_BASIC_AUTH=y
CONFIG_FEATURE_HTTPD_AUTH_MD5=y
@@ -799,6 +833,7 @@ CONFIG_FEATURE_NETSTAT_PRG=y
CONFIG_NSLOOKUP=y
CONFIG_NTPD=y
CONFIG_FEATURE_NTPD_SERVER=y
CONFIG_FEATURE_NTPD_CONF=y
CONFIG_PSCAN=y
CONFIG_ROUTE=y
CONFIG_SLATTACH=y
@@ -827,6 +862,7 @@ CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
CONFIG_TUNCTL=y
CONFIG_FEATURE_TUNCTL_UG=y
# CONFIG_UDHCPC6 is not set
CONFIG_UDHCPD=y
CONFIG_DHCPRELAY=y
CONFIG_DUMPLEASES=y
@@ -835,6 +871,7 @@ CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y
CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
CONFIG_UDHCPC=y
CONFIG_FEATURE_UDHCPC_ARPING=y
CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y
# CONFIG_FEATURE_UDHCP_PORT is not set
CONFIG_UDHCP_DEBUG=9
CONFIG_FEATURE_UDHCP_RFC3397=y
@@ -873,6 +910,7 @@ CONFIG_SENDMAIL=y
# Process Utilities
#
CONFIG_IOSTAT=y
CONFIG_LSOF=y
CONFIG_MPSTAT=y
CONFIG_NMETER=y
CONFIG_PMAP=y
@@ -880,6 +918,13 @@ CONFIG_POWERTOP=y
CONFIG_PSTREE=y
CONFIG_PWDX=y
CONFIG_SMEMCAP=y
CONFIG_TOP=y
CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
CONFIG_FEATURE_TOP_SMP_CPU=y
CONFIG_FEATURE_TOP_DECIMALS=y
CONFIG_FEATURE_TOP_SMP_PROCESS=y
CONFIG_FEATURE_TOPMEM=y
CONFIG_UPTIME=y
# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
CONFIG_FREE=y
@@ -894,18 +939,12 @@ CONFIG_FEATURE_PIDOF_OMIT=y
CONFIG_PKILL=y
CONFIG_PS=y
CONFIG_FEATURE_PS_WIDE=y
CONFIG_FEATURE_PS_LONG=y
# CONFIG_FEATURE_PS_TIME is not set
# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set
# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
CONFIG_RENICE=y
CONFIG_BB_SYSCTL=y
CONFIG_TOP=y
CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
CONFIG_FEATURE_TOP_SMP_CPU=y
CONFIG_FEATURE_TOP_DECIMALS=y
CONFIG_FEATURE_TOP_SMP_PROCESS=y
CONFIG_FEATURE_TOPMEM=y
CONFIG_FEATURE_SHOW_THREADS=y
CONFIG_WATCH=y
@@ -951,6 +990,7 @@ CONFIG_ASH_GETOPTS=y
CONFIG_ASH_BUILTIN_ECHO=y
CONFIG_ASH_BUILTIN_PRINTF=y
CONFIG_ASH_BUILTIN_TEST=y
CONFIG_ASH_HELP=y
CONFIG_ASH_CMDCMD=y
# CONFIG_ASH_MAIL is not set
CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
@@ -1000,6 +1040,11 @@ CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_FEATURE_KMSG_SYSLOG=y
CONFIG_KLOGD=y
#
# klogd should not be used together with syslog to kernel printk buffer
#
CONFIG_FEATURE_KLOGD_KLOGCTL=y
CONFIG_LOGGER=y
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Busybox version: 1.19.4
# Wed Mar 28 21:27:36 2012
# Busybox version: 1.23.1
# Thu Feb 26 19:10:35 2015
#
CONFIG_HAVE_DOT_CONFIG=y
@@ -36,12 +36,15 @@ CONFIG_LAST_SUPPORTED_WCHAR=767
# CONFIG_UNICODE_BIDI_SUPPORT is not set
# CONFIG_UNICODE_NEUTRAL_TABLE is not set
# CONFIG_UNICODE_PRESERVE_BROKEN is not set
# CONFIG_PAM is not set
CONFIG_FEATURE_USE_SENDFILE=y
CONFIG_LONG_OPTS=y
# CONFIG_FEATURE_DEVPTS is not set
# CONFIG_FEATURE_CLEAN_UP is not set
# CONFIG_FEATURE_UTMP is not set
# CONFIG_FEATURE_WTMP is not set
# CONFIG_FEATURE_PIDFILE is not set
CONFIG_PID_FILE_PATH=""
# CONFIG_FEATURE_SUID is not set
# CONFIG_FEATURE_SUID_CONFIG is not set
# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
@@ -62,13 +65,17 @@ CONFIG_FEATURE_HAVE_RPC=y
# CONFIG_FEATURE_SHARED_BUSYBOX is not set
# CONFIG_LFS is not set
CONFIG_CROSS_COMPILER_PREFIX=""
CONFIG_SYSROOT=""
CONFIG_EXTRA_CFLAGS="-g -lc"
CONFIG_EXTRA_LDFLAGS=""
CONFIG_EXTRA_LDLIBS=""
#
# Debugging Options
#
# CONFIG_DEBUG is not set
# CONFIG_DEBUG_PESSIMIZE is not set
# CONFIG_UNIT_TEST is not set
# CONFIG_WERROR is not set
CONFIG_NO_DEBUG_LIB=y
# CONFIG_DMALLOC is not set
@@ -92,7 +99,8 @@ CONFIG_PREFIX="./_install"
# CONFIG_FEATURE_SYSTEMD is not set
# CONFIG_FEATURE_RTMINMAX is not set
CONFIG_PASSWORD_MINLEN=6
CONFIG_MD5_SIZE_VS_SPEED=2
CONFIG_MD5_SMALL=1
CONFIG_SHA3_SMALL=1
# CONFIG_FEATURE_FAST_TOP is not set
# CONFIG_FEATURE_ETC_NETWORKS is not set
# CONFIG_FEATURE_USE_TERMIOS is not set
@@ -101,6 +109,7 @@ CONFIG_FEATURE_EDITING_MAX_LEN=1024
# CONFIG_FEATURE_EDITING_VI is not set
CONFIG_FEATURE_EDITING_HISTORY=255
CONFIG_FEATURE_EDITING_SAVEHISTORY=y
# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
CONFIG_FEATURE_REVERSE_SEARCH=y
CONFIG_FEATURE_TAB_COMPLETION=y
# CONFIG_FEATURE_USERNAME_COMPLETION is not set
@@ -129,7 +138,14 @@ CONFIG_FEATURE_COPYBUF_KB=4
# CONFIG_AR is not set
# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
# CONFIG_FEATURE_AR_CREATE is not set
# CONFIG_UNCOMPRESS is not set
# CONFIG_GUNZIP is not set
# CONFIG_BUNZIP2 is not set
# CONFIG_UNLZMA is not set
# CONFIG_FEATURE_LZMA_FAST is not set
# CONFIG_LZMA is not set
# CONFIG_UNXZ is not set
# CONFIG_XZ is not set
CONFIG_BZIP2=y
# CONFIG_CPIO is not set
# CONFIG_FEATURE_CPIO_O is not set
@@ -137,13 +153,13 @@ CONFIG_BZIP2=y
# CONFIG_DPKG is not set
# CONFIG_DPKG_DEB is not set
# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
# CONFIG_GUNZIP is not set
CONFIG_GZIP=y
# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
CONFIG_GZIP_FAST=0
# CONFIG_LZOP is not set
# CONFIG_LZOP_COMPR_HIGH is not set
# CONFIG_RPM2CPIO is not set
# CONFIG_RPM is not set
# CONFIG_RPM2CPIO is not set
CONFIG_TAR=y
# CONFIG_FEATURE_TAR_CREATE is not set
# CONFIG_FEATURE_TAR_AUTODETECT is not set
@@ -156,12 +172,6 @@ CONFIG_TAR=y
# CONFIG_FEATURE_TAR_UNAME_GNAME is not set
# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set
# CONFIG_FEATURE_TAR_SELINUX is not set
# CONFIG_UNCOMPRESS is not set
# CONFIG_UNLZMA is not set
# CONFIG_FEATURE_LZMA_FAST is not set
# CONFIG_LZMA is not set
# CONFIG_UNXZ is not set
# CONFIG_XZ is not set
# CONFIG_UNZIP is not set
#
@@ -173,14 +183,19 @@ CONFIG_DATE=y
CONFIG_FEATURE_DATE_ISOFMT=y
# CONFIG_FEATURE_DATE_NANO is not set
CONFIG_FEATURE_DATE_COMPAT=y
CONFIG_HOSTID=y
CONFIG_ID=y
CONFIG_GROUPS=y
CONFIG_SHUF=y
CONFIG_TEST=y
CONFIG_FEATURE_TEST_64=y
CONFIG_TOUCH=y
CONFIG_FEATURE_TOUCH_NODEREF=y
CONFIG_FEATURE_TOUCH_SUSV3=y
CONFIG_TR=y
CONFIG_FEATURE_TR_CLASSES=y
CONFIG_FEATURE_TR_EQUIV=y
CONFIG_UNLINK=y
CONFIG_BASE64=y
# CONFIG_WHO is not set
# CONFIG_USERS is not set
@@ -220,7 +235,6 @@ CONFIG_FOLD=y
CONFIG_FSYNC=y
CONFIG_HEAD=y
CONFIG_FEATURE_FANCY_HEAD=y
CONFIG_HOSTID=y
CONFIG_INSTALL=y
CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
CONFIG_LN=y
@@ -257,6 +271,7 @@ CONFIG_SEQ=y
CONFIG_SHA1SUM=y
CONFIG_SHA256SUM=y
CONFIG_SHA512SUM=y
CONFIG_SHA3SUM=y
CONFIG_SLEEP=y
CONFIG_FEATURE_FANCY_SLEEP=y
CONFIG_FEATURE_FLOAT_SLEEP=y
@@ -288,6 +303,11 @@ CONFIG_FEATURE_WC_LARGE=y
CONFIG_WHOAMI=y
CONFIG_YES=y
#
# Common options
#
CONFIG_FEATURE_VERBOSE=y
#
# Common options for cp and mv
#
@@ -304,7 +324,7 @@ CONFIG_FEATURE_AUTOWIDTH=y
CONFIG_FEATURE_HUMAN_READABLE=y
#
# Common options for md5sum, sha1sum, sha256sum, sha512sum
# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
#
CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
@@ -354,7 +374,16 @@ CONFIG_WHICH=y
#
# Editors
#
# CONFIG_AWK is not set
# CONFIG_FEATURE_AWK_LIBM is not set
# CONFIG_FEATURE_AWK_GNU_EXTENSIONS is not set
# CONFIG_CMP is not set
# CONFIG_DIFF is not set
# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set
# CONFIG_FEATURE_DIFF_DIR is not set
# CONFIG_ED is not set
# CONFIG_PATCH is not set
# CONFIG_SED is not set
# CONFIG_VI is not set
CONFIG_FEATURE_VI_MAX_LEN=0
# CONFIG_FEATURE_VI_8BIT is not set
@@ -369,15 +398,9 @@ CONFIG_FEATURE_VI_MAX_LEN=0
# CONFIG_FEATURE_VI_SET is not set
# CONFIG_FEATURE_VI_WIN_RESIZE is not set
# CONFIG_FEATURE_VI_ASK_TERMINAL is not set
# CONFIG_FEATURE_VI_OPTIMIZE_CURSOR is not set
# CONFIG_AWK is not set
# CONFIG_FEATURE_AWK_LIBM is not set
# CONFIG_CMP is not set
# CONFIG_DIFF is not set
# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set
# CONFIG_FEATURE_DIFF_DIR is not set
# CONFIG_ED is not set
# CONFIG_SED is not set
# CONFIG_FEATURE_VI_UNDO is not set
# CONFIG_FEATURE_VI_UNDO_QUEUE is not set
CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=0
# CONFIG_FEATURE_ALLOW_EXEC is not set
#
@@ -394,6 +417,7 @@ CONFIG_FEATURE_FIND_MAXDEPTH=y
CONFIG_FEATURE_FIND_NEWER=y
CONFIG_FEATURE_FIND_INUM=y
CONFIG_FEATURE_FIND_EXEC=y
CONFIG_FEATURE_FIND_EXEC_PLUS=y
CONFIG_FEATURE_FIND_USER=y
CONFIG_FEATURE_FIND_GROUP=y
CONFIG_FEATURE_FIND_NOT=y
@@ -415,6 +439,7 @@ CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y
CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y
#
# Init Utilities
@@ -451,6 +476,7 @@ CONFIG_ADD_SHELL=y
# CONFIG_ADDUSER is not set
# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set
# CONFIG_FEATURE_CHECK_NAMES is not set
CONFIG_LAST_ID=0
CONFIG_FIRST_SYSTEM_ID=0
CONFIG_LAST_SYSTEM_ID=0
# CONFIG_ADDGROUP is not set
@@ -461,7 +487,7 @@ CONFIG_LAST_SYSTEM_ID=0
# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set
# CONFIG_GETTY is not set
# CONFIG_LOGIN is not set
# CONFIG_PAM is not set
# CONFIG_LOGIN_SESSION_AS_CHILD is not set
# CONFIG_LOGIN_SCRIPTS is not set
# CONFIG_FEATURE_NOLOGIN is not set
# CONFIG_FEATURE_SECURETTY is not set
@@ -469,6 +495,7 @@ CONFIG_LAST_SYSTEM_ID=0
# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set
# CONFIG_CRYPTPW is not set
# CONFIG_CHPASSWD is not set
CONFIG_FEATURE_DEFAULT_PASSWD_ALGO=""
# CONFIG_SU is not set
# CONFIG_FEATURE_SU_SYSLOG is not set
# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set
@@ -518,6 +545,14 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# Linux System Utilities
#
# CONFIG_BLOCKDEV is not set
CONFIG_FATATTR=y
CONFIG_FSTRIM=y
# CONFIG_MDEV is not set
# CONFIG_FEATURE_MDEV_CONF is not set
# CONFIG_FEATURE_MDEV_RENAME is not set
# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
# CONFIG_FEATURE_MDEV_EXEC is not set
# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
# CONFIG_REV is not set
# CONFIG_ACPID is not set
# CONFIG_FEATURE_ACPID_COMPAT is not set
@@ -561,12 +596,6 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_LOSETUP is not set
# CONFIG_LSPCI is not set
# CONFIG_LSUSB is not set
# CONFIG_MDEV is not set
# CONFIG_FEATURE_MDEV_CONF is not set
# CONFIG_FEATURE_MDEV_RENAME is not set
# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
# CONFIG_FEATURE_MDEV_EXEC is not set
# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
# CONFIG_MKSWAP is not set
# CONFIG_FEATURE_MKSWAP_UUID is not set
# CONFIG_MORE is not set
@@ -588,6 +617,7 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_SCRIPTREPLAY is not set
# CONFIG_SETARCH is not set
# CONFIG_SWAPONOFF is not set
# CONFIG_FEATURE_SWAPON_DISCARD is not set
# CONFIG_FEATURE_SWAPON_PRI is not set
# CONFIG_SWITCH_ROOT is not set
# CONFIG_UMOUNT is not set
@@ -596,28 +626,36 @@ CONFIG_DEFAULT_DEPMOD_FILE=""
# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set
# CONFIG_FEATURE_MTAB_SUPPORT is not set
# CONFIG_VOLUMEID is not set
# CONFIG_FEATURE_VOLUMEID_EXT is not set
# CONFIG_FEATURE_VOLUMEID_BTRFS is not set
# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
# CONFIG_FEATURE_VOLUMEID_EXFAT is not set
# CONFIG_FEATURE_VOLUMEID_EXT is not set
# CONFIG_FEATURE_VOLUMEID_F2FS is not set
# CONFIG_FEATURE_VOLUMEID_FAT is not set
# CONFIG_FEATURE_VOLUMEID_HFS is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
# CONFIG_FEATURE_VOLUMEID_XFS is not set
# CONFIG_FEATURE_VOLUMEID_NTFS is not set
# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set
# CONFIG_FEATURE_VOLUMEID_UDF is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set
# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
# CONFIG_FEATURE_VOLUMEID_SYSV is not set
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_JFS is not set
# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set
# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set
# CONFIG_FEATURE_VOLUMEID_LUKS is not set
# CONFIG_FEATURE_VOLUMEID_NILFS is not set
# CONFIG_FEATURE_VOLUMEID_NTFS is not set
# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set
# CONFIG_FEATURE_VOLUMEID_REISERFS is not set
# CONFIG_FEATURE_VOLUMEID_ROMFS is not set
# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set
# CONFIG_FEATURE_VOLUMEID_SYSV is not set
# CONFIG_FEATURE_VOLUMEID_UDF is not set
# CONFIG_FEATURE_VOLUMEID_XFS is not set
#
# Miscellaneous Utilities
#
# CONFIG_CONSPY is not set
CONFIG_CROND=y
CONFIG_FEATURE_CROND_D=y
CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
CONFIG_LESS=y
CONFIG_FEATURE_LESS_MAXLINES=9999999
CONFIG_FEATURE_LESS_BRACKETS=y
@@ -630,13 +668,17 @@ CONFIG_FEATURE_LESS_DASHCMD=y
CONFIG_FEATURE_LESS_LINENUMS=y
# CONFIG_NANDWRITE is not set
# CONFIG_NANDDUMP is not set
# CONFIG_RFKILL is not set
CONFIG_SETSERIAL=y
# CONFIG_TASKSET is not set
# CONFIG_FEATURE_TASKSET_FANCY is not set
CONFIG_UBIATTACH=y
CONFIG_UBIDETACH=y
CONFIG_UBIMKVOL=y
CONFIG_UBIRMVOL=y
CONFIG_UBIRSVOL=y
CONFIG_UBIUPDATEVOL=y
# CONFIG_WALL is not set
CONFIG_ADJTIMEX=y
# CONFIG_BBCONFIG is not set
# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
@@ -652,10 +694,6 @@ CONFIG_FEATURE_CHAT_SEND_ESCAPES=y
CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y
CONFIG_FEATURE_CHAT_CLR_ABORT=y
CONFIG_CHRT=y
CONFIG_CROND=y
CONFIG_FEATURE_CROND_D=y
CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
CONFIG_CRONTAB=y
CONFIG_DC=y
CONFIG_FEATURE_DC_LIBM=y
@@ -693,18 +731,14 @@ CONFIG_MOUNTPOINT=y
CONFIG_MT=y
CONFIG_RAIDAUTORUN=y
# CONFIG_READAHEAD is not set
# CONFIG_RFKILL is not set
# CONFIG_RUNLEVEL is not set
CONFIG_RX=y
CONFIG_SETSID=y
CONFIG_STRINGS=y
# CONFIG_TASKSET is not set
# CONFIG_FEATURE_TASKSET_FANCY is not set
CONFIG_TIME=y
CONFIG_TIMEOUT=y
CONFIG_TTYSIZE=y
CONFIG_VOLNAME=y
# CONFIG_WALL is not set
CONFIG_WATCHDOG=y
#
@@ -736,13 +770,13 @@ CONFIG_FAKEIDENTD=y
CONFIG_FTPD=y
CONFIG_FEATURE_FTP_WRITE=y
CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y
CONFIG_FEATURE_FTP_AUTHENTICATION=y
CONFIG_FTPGET=y
CONFIG_FTPPUT=y
CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
CONFIG_HOSTNAME=y
CONFIG_HTTPD=y
CONFIG_FEATURE_HTTPD_RANGES=y
CONFIG_FEATURE_HTTPD_USE_SENDFILE=y
CONFIG_FEATURE_HTTPD_SETUID=y
CONFIG_FEATURE_HTTPD_BASIC_AUTH=y
CONFIG_FEATURE_HTTPD_AUTH_MD5=y
@@ -799,6 +833,7 @@ CONFIG_FEATURE_NETSTAT_PRG=y
CONFIG_NSLOOKUP=y
CONFIG_NTPD=y
CONFIG_FEATURE_NTPD_SERVER=y
CONFIG_FEATURE_NTPD_CONF=y
CONFIG_PSCAN=y
CONFIG_ROUTE=y
CONFIG_SLATTACH=y
@@ -827,6 +862,7 @@ CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
CONFIG_TUNCTL=y
CONFIG_FEATURE_TUNCTL_UG=y
# CONFIG_UDHCPC6 is not set
CONFIG_UDHCPD=y
CONFIG_DHCPRELAY=y
CONFIG_DUMPLEASES=y
@@ -835,6 +871,7 @@ CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y
CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
CONFIG_UDHCPC=y
CONFIG_FEATURE_UDHCPC_ARPING=y
CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y
# CONFIG_FEATURE_UDHCP_PORT is not set
CONFIG_UDHCP_DEBUG=9
CONFIG_FEATURE_UDHCP_RFC3397=y
@@ -873,6 +910,7 @@ CONFIG_SENDMAIL=y
# Process Utilities
#
CONFIG_IOSTAT=y
CONFIG_LSOF=y
CONFIG_MPSTAT=y
CONFIG_NMETER=y
CONFIG_PMAP=y
@@ -880,6 +918,13 @@ CONFIG_POWERTOP=y
CONFIG_PSTREE=y
CONFIG_PWDX=y
CONFIG_SMEMCAP=y
CONFIG_TOP=y
CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
CONFIG_FEATURE_TOP_SMP_CPU=y
CONFIG_FEATURE_TOP_DECIMALS=y
CONFIG_FEATURE_TOP_SMP_PROCESS=y
CONFIG_FEATURE_TOPMEM=y
CONFIG_UPTIME=y
# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
CONFIG_FREE=y
@@ -894,18 +939,12 @@ CONFIG_FEATURE_PIDOF_OMIT=y
CONFIG_PKILL=y
CONFIG_PS=y
CONFIG_FEATURE_PS_WIDE=y
CONFIG_FEATURE_PS_LONG=y
# CONFIG_FEATURE_PS_TIME is not set
# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set
# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
CONFIG_RENICE=y
CONFIG_BB_SYSCTL=y
CONFIG_TOP=y
CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
CONFIG_FEATURE_TOP_SMP_CPU=y
CONFIG_FEATURE_TOP_DECIMALS=y
CONFIG_FEATURE_TOP_SMP_PROCESS=y
CONFIG_FEATURE_TOPMEM=y
CONFIG_FEATURE_SHOW_THREADS=y
CONFIG_WATCH=y
@@ -951,6 +990,7 @@ CONFIG_ASH_GETOPTS=y
CONFIG_ASH_BUILTIN_ECHO=y
CONFIG_ASH_BUILTIN_PRINTF=y
CONFIG_ASH_BUILTIN_TEST=y
CONFIG_ASH_HELP=y
CONFIG_ASH_CMDCMD=y
# CONFIG_ASH_MAIL is not set
CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
@@ -1000,6 +1040,11 @@ CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_FEATURE_KMSG_SYSLOG=y
CONFIG_KLOGD=y
#
# klogd should not be used together with syslog to kernel printk buffer
#
CONFIG_FEATURE_KLOGD_KLOGCTL=y
CONFIG_LOGGER=y
+1 -1
View File
@@ -49,4 +49,4 @@ clean-manifests:
rm -rf $(manifests)
clean-tests:
for d in $(test_targets); do (make -C $$d clean || true); done
for d in $(test_targets); do ([ ! -d $$d ] || make -C $$d clean); done
+2 -2
View File
@@ -1,7 +1,7 @@
SRCDIR = LibOS/shim/src
all:
$(MAKE) $(if $(NPROC),-j$(NPROC),) -C $(SRCDIR)
[ ! -d $(SRCDIR) ] || $(MAKE) $(if $(NPROC),-j$(NPROC),) -C $(SRCDIR)
clean:
$(MAKE) -C $(SRCDIR) clean
[ ! -d $(SRCDIR) ] || $(MAKE) -C $(SRCDIR) clean
+11 -3
View File
@@ -5,13 +5,21 @@ PAL=$PAL_DIR/pal
PAL_SEC=$PAL_DIR/pal_sec
MANIFEST=
GDB=
GDB_CMD=
PAL_CMD=$PAL
if [ "$GDB" == "1" ]; then
GDB_CMD="gdb --args"
fi
if [ "$SEC" == "1" ]; then
PAL_CMD=$PAL_SEC
fi
while [ "$1" != "" ];
do
if [ "$1" = "-gdb" ]; then
GDB="gdb --args"
GDB_CMD="gdb --args"
shift
continue
fi
@@ -36,4 +44,4 @@ if [ ! -f "$PAL_CMD" ]; then
exit 1
fi
exec $GDB $PAL $MANIFEST $*
exec $GDB_CMD $PAL_CMD $MANIFEST $*
+10 -5
View File
@@ -1,8 +1,8 @@
CFLAGS-libos = -L../../../build/libos -I../../include
SPECIALS = static pie
NATIVE_TESTS_CPP = $(patsubst %.cpp,%,$(wildcard *.cpp))
NATIVE_TESTS_STATIC = static
NATIVE_TESTS = $(filter-out $(NATIVE_TESTS_STATIC),$(patsubst %.c,%,$(wildcard *.c)))
NATIVE_TESTS = $(patsubst %.c,%,$(wildcard *.c))
targets = $(NATIVE_TESTS) $(NATIVE_TESTS_CPP) $(NATIVE_TESTS_STATIC) \
manifest static.manifest pal pal_sec
@@ -28,21 +28,26 @@ test-helloworld.pthread = grep -q "Hello World" OUTPUT
rm -rf $@
cp $@.template $@
$(NATIVE_TESTS): %: %.c
$(filter-out $(SPECIALS),$(NATIVE_TESTS)): %: %.c
@echo [ $@ ]
@$(CC) $(CFLAGS) $(if $(findstring .libos,$@),$(CFLAGS-libos),) -o $@ $< \
$(shell echo $@ | sed 's/^[^\.]*//g' | sed 's/\./ -l/g')
$(NATIVE_TESTS_CPP): %: %.cpp
$(filter-out $(SPECIALS),$(NATIVE_TESTS_CPP)): %: %.cpp
@echo [ $@ ]
@$(CC) $(CFLAGS) -o $@ $< \
$(shell echo $@ | sed 's/^[^\.]*//g' | sed 's/\./ -l/g')
$(NATIVE_TESTS_STATIC): %: %.c
static: %: %.c
@echo [ $@ ]
@$(CC) $(CFLAGS) -o $@ -static $< \
$(shell echo $@ | sed 's/^[^\.]*//g' | sed 's/\./ -l/g')
pie: %: %.c
@echo [ $@ ]
@$(CC) $(CFLAGS) -fPIC --pie -o $@ $< \
$(shell echo $@ | sed 's/^[^\.]*//g' | sed 's/\./ -l/g')
test-helloworld = grep -q "Hello world" OUTPUT
clean-exec:
+12
View File
@@ -0,0 +1,12 @@
/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
/* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
/* a simple helloworld test */
#include <stdio.h>
int main(int argc, char ** argv)
{
printf("Hello world (%s)!\n", argv[0]);
return 0;
}
+2 -8
View File
@@ -13,7 +13,7 @@ endif
DIRS = src test
all debug:
all debug clean:
for d in $(DIRS); \
do \
make -C $$d $@; \
@@ -32,7 +32,7 @@ $(LINUX_SRC)/Makefile:
tar -xzf $(LINUX_SRC).tar.gz
[ ! -f $(LINUX_SRC).patch ] || git apply $(LINUX_SRC).patch
$(LINUX_SRC)/.config:
$(LINUX_SRC)/.config: $(LINUX_SRC)/Makefile
cd $(LINUX_SRC) && make menuconfig
install: $(LINUX_KERNEL)
@@ -53,9 +53,3 @@ endif
.PHONY: test
test:
make -C test test
clean:
for d in $(DIRS) $(LINUX_KERNEL); \
do \
make -C $$d clean; \
done
+43 -47
View File
@@ -507,9 +507,7 @@ static int __unix_perm(struct sockaddr *address, int addrlen)
{
struct graphene_info *gi = get_graphene_info(current->graphene);
const char *path, *sun_path;
struct nameidata nd;
struct path *p = NULL;
int err = 0;
int err = 0, path_len;
if (!gi->gi_unix)
return -EPERM;
@@ -519,44 +517,46 @@ static int __unix_perm(struct sockaddr *address, int addrlen)
if (gi->gi_unix->root.mnt) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
struct path parent;
const char *s;
err = kern_path(path, LOOKUP_FOLLOW, &nd.path);
if (!err)
err = kern_path(path, LOOKUP_PARENT, &parent);
if (err)
return err;
p = &nd.path;
err = vfs_path_lookup(nd.path.dentry, nd.path.mnt, "..", 0,
&parent);
if (!err)
goto denied;
if (!path_equal(&gi->gi_unix->root, &parent))
goto denied;
path_put(&parent);
path = nd.path.dentry->d_name.name;
/* find the last name */
for (s = path; *s ; s++)
if (*s == '/')
path = s + 1;
path_len = s - path;
#else
struct nameidata nd;
err = kern_path_parent(path, &nd);
if (!err)
if (err)
return err;
path_put(&nd.path);
path = nd.last.name;
path_len = nd.last.len;
if (!path_equal(&gi->gi_unix->root, &nd.path))
goto denied;
#endif
} else {
path_len = strlen(path);
}
if (gi->gi_unix->prefix.len &&
memcmp(path, gi->gi_unix->prefix.name,
gi->gi_unix->prefix.len))
err = -EPERM;
if (p)
path_put(p);
if (gi->gi_unix->prefix.len) {
if (gi->gi_unix->prefix.len > path_len ||
memcmp(path,
gi->gi_unix->prefix.name,
gi->gi_unix->prefix.len))
err = -EPERM;
}
if (!err)
return 0;
@@ -566,8 +566,6 @@ denied:
printk(KERN_INFO "Graphene: DENY PID %d SOCKET %s\n",
current->pid, sun_path);
#endif
if (p)
path_put(p);
return -EPERM;
}
@@ -581,12 +579,12 @@ static int net_cmp(int family, int addr_any, int port_any,
if (!addr_any) {
if (a->sin_addr.s_addr != ga->addr.sin_addr.s_addr)
return -EPERM;
return 1;
}
if (!port_any) {
unsigned short port = ntohs(a->sin_port);
if (!(port >= ga->port_begin && port <= ga->port_end))
return -EPERM;
return 1;
}
break;
@@ -598,12 +596,12 @@ static int net_cmp(int family, int addr_any, int port_any,
if (!addr_any) {
if (memcmp(&a6->sin6_addr, &ga->addr.sin6_addr,
sizeof(struct in6_addr)))
return -EPERM;
return 1;
}
if (!port_any) {
unsigned short port = ntohs(a6->sin6_port);
if (!(port >= ga->port_begin && port <= ga->port_end))
return -EPERM;
return 1;
}
break;
@@ -753,7 +751,7 @@ int __common_net_perm(struct graphene_info *gi, int op, struct socket *sock,
local_needcmp = 1;
err = sock->ops->getname(sock, local_addr, &local_addrlen, 0);
if (err < 0)
if (err)
return err;
}
@@ -772,18 +770,16 @@ int __common_net_perm(struct graphene_info *gi, int op, struct socket *sock,
continue;
if (local_needcmp) {
err = net_cmp(sk->sk_family, gn->flags & LOCAL_ADDR_ANY,
gn->flags & LOCAL_PORT_ANY,
&gn->local, local_addr, local_addrlen);
if (err < 0)
if (net_cmp(sk->sk_family, gn->flags & LOCAL_ADDR_ANY,
gn->flags & LOCAL_PORT_ANY,
&gn->local, local_addr, local_addrlen))
continue;
}
if (peer_needcmp) {
err = net_cmp(sk->sk_family, gn->flags & PEER_ADDR_ANY,
gn->flags & PEER_PORT_ANY,
&gn->peer, peer_addr, peer_addrlen);
if (err < 0)
if (net_cmp(sk->sk_family, gn->flags & PEER_ADDR_ANY,
gn->flags & PEER_PORT_ANY,
&gn->peer, peer_addr, peer_addrlen))
continue;
}
@@ -1112,7 +1108,7 @@ int set_graphene(struct task_struct *current_tsk,
#endif
rv = copy_from_user(&npolicies, &gpolicies->npolicies, sizeof(int));
if (rv < 0)
if (rv)
return -EFAULT;
if (npolicies && !policies)
@@ -1146,8 +1142,10 @@ int set_graphene(struct task_struct *current_tsk,
int type, flags;
rv = copy_from_user(&ptmp, policies + i,
sizeof(struct graphene_user_policy));
if (rv < 0)
if (rv) {
rv = -EFAULT;
goto err;
}
if (!ptmp.value) {
rv = -EINVAL;
@@ -1270,8 +1268,10 @@ int set_graphene(struct task_struct *current_tsk,
rv = copy_from_user(&np, ptmp.value,
sizeof(struct graphene_net_policy));
if (rv < 0)
if (rv) {
rv = -EFAULT;
goto err;
}
rv = set_net_rule(&np, gi);
if (rv < 0)
@@ -1384,14 +1384,10 @@ static int do_close_sock(struct graphene_info *gi, struct socket *sock,
inet = inet_sk(sk);
if (inet->inet_dport) {
err = sock->ops->getname(sock, addr, &len, 1);
if (err < 0)
if (err)
return err;
err = __common_net_perm(gi, OP_CONNECT, sock, addr, len);
if (err < 0)
return err;
return 0;
return __common_net_perm(gi, OP_CONNECT, sock, addr, len);
}
if (!inet->inet_num)
@@ -1401,7 +1397,7 @@ static int do_close_sock(struct graphene_info *gi, struct socket *sock,
err = __common_net_perm(gi, OP_LISTEN, sock, NULL, 0);
} else {
err = sock->ops->getname(sock, addr, &len, 0);
if (err < 0)
if (err)
return err;
err = __common_net_perm(gi, OP_BIND, sock, addr, len);
@@ -1539,7 +1535,7 @@ static int update_graphene(struct task_struct *current_tsk,
}
if (new->gi_unix->prefix.len) {
int err = add_graphene_unix(new->gi_unix);
if (err < 0)
if (err)
return err;
}
close_unix = 1;
+11 -37
View File
@@ -83,8 +83,10 @@ int load_libraries (struct config_store * root_config, const char ** msg)
return 0;
}
static void read_envs (const char ** envp)
static void read_envs (const char *** envpp)
{
const char ** envp = *envpp;
if (!pal_config.root_config)
goto done;
@@ -160,37 +162,10 @@ static void read_envs (const char ** envp)
}
done:
pal_config.environments = envp;
*envpp = envp;
}
static void * find_heap_base (void)
{
/* This function is to allocate an area to map preloaded loibraries,
but try to get around future address of PAL caused by ASLR.
The top of heap must be at least 1/16 of the area below where PAL
is loaded. The address is still randomized. */
unsigned long heap_base = (unsigned long) pal_config.lib_text_start;
unsigned long pal_size = pal_config.lib_data_end -
pal_config.lib_text_start;
unsigned long base = allocsize;
while ((base >> 12) < pal_size)
base <<= 1;
while ((base << 6) < heap_base)
base <<= 1;
heap_base &= allocmask;
while ((heap_base -= base) > base) {
void * heap = (void *) heap_base;
if (!_DkVirtualMemoryAlloc(&heap, allocsize, PAL_ALLOC_RESERVE,
PAL_PROT_NONE))
return heap;
}
return NULL;
}
void start_execution (int argc, const char ** argv);
void start_execution (int argc, const char ** argv, const char ** envp);
void pal_main (int argc, const char ** argv, const char ** envp)
{
@@ -244,10 +219,7 @@ void pal_main (int argc, const char ** argv, const char ** envp)
}
}
read_envs(envp);
if (!pal_config.heap_base)
pal_config.heap_base = find_heap_base();
read_envs(&envp);
if (pal_config.root_config) {
struct config_store * cfg = pal_config.root_config;
@@ -291,11 +263,13 @@ void pal_main (int argc, const char ** argv, const char ** envp)
pal_config.root_config = NULL;
}
__pal_control.manifest_handle = pal_config.manifest_handle;
__pal_control.executable = pal_config.exec;
__pal_control.manifest_handle = pal_config.manifest_handle;
__pal_control.executable = pal_config.exec;
__pal_control.user_address_begin = pal_config.user_addr_start;
__pal_control.user_address_end = pal_config.user_addr_end;
/* Now we will start the execution */
start_execution(argc, argv);
start_execution(argc, argv, envp);
/* We wish we will never reached here */
printf("unexpected termination\n");
+22 -21
View File
@@ -151,20 +151,20 @@ void setup_elf_hash (struct link_map *map)
map->l_chain = hash;
}
static void * __heap_base = NULL;
static ElfW(Addr) __get_heap_base (size_t size)
static ElfW(Addr) __get_map_addr (size_t size, enum object_type type)
{
if (__heap_base == (void *) -1)
return 0;
return type == OBJECT_EXEC ?
(ElfW(Addr)) pal_config.user_addr_start :
(ElfW(Addr)) pal_config.user_addr_end - ALLOC_ALIGNUP(size);
}
if (!__heap_base &&
!(__heap_base = pal_config.heap_base)) {
__heap_base = (void *) -1;
return 0;
}
return (ElfW(Addr)) (__heap_base -= ALLOC_ALIGNUP(size));
static void __save_map_addr (ElfW(Addr) addr, size_t size,
enum object_type type)
{
if (type == OBJECT_EXEC)
pal_config.user_addr_start = (void *) ALLOC_ALIGNUP(addr + size);
else
pal_config.user_addr_end = (void *) ALLOC_ALIGNDOWN(addr);
}
/* Map in the shared object NAME, actually located in REALNAME, and already
@@ -183,7 +183,7 @@ map_elf_object_by_handle (PAL_HANDLE handle, enum object_type type,
errstring = "cannot stat shared object";
errval = PAL_ERROR_INVAL;
call_lose:
printf("%s (%d)\n", errstring, PAL_STRERROR(errval));
printf("%s (%s)\n", errstring, PAL_STRERROR(errval));
return NULL;
}
@@ -328,7 +328,7 @@ call_lose:
As a refinement, sometimes we have an address that we would
prefer to map such objects at; but this is only a preference,
the OS can do whatever it likes. */
ElfW(Addr) mappref = __get_heap_base(maplength);
ElfW(Addr) mappref = __get_map_addr(maplength, type);
/* Remember which part of the address space this object uses. */
errval = _DkStreamMap(handle, (void **) &mappref,
@@ -342,8 +342,9 @@ map_error:
goto call_lose;
}
__save_map_addr(mappref, maplength, type);
l->l_map_start = mappref;
l->l_map_end = l->l_map_start + maplength;
l->l_map_end = mappref + maplength;
l->l_addr = l->l_map_start - c->mapstart;
if (has_holes)
@@ -361,6 +362,7 @@ map_error:
/* Remember which part of the address space this object uses. */
l->l_map_start = c->mapstart + l->l_addr;
__save_map_addr(l->l_map_start, maplength, type);
l->l_map_end = l->l_map_start + maplength;
while (c < &loadcmds[nloadcmds]) {
@@ -1039,7 +1041,7 @@ void DkDebugDetachBinary (PAL_PTR start_addr)
{
}
void start_execution (int argc, const char ** argv)
void start_execution (int argc, const char ** argv, const char ** envp)
{
/* First we will try to run all the preloaded libraries which come with
entry points */
@@ -1057,7 +1059,7 @@ void start_execution (int argc, const char ** argv)
size_t ncookies = argc + 2; /* 1 for argc, argc + 1 for argv */
/* Then we count envp */
for (const char ** e = pal_config.environments; *e; e++)
for (const char ** e = envp; *e; e++)
ncookies++;
ncookies++; /* for NULL-end */
@@ -1077,9 +1079,8 @@ void start_execution (int argc, const char ** argv)
size_t cnt = argc + 2;
if (pal_config.environments)
for (i = 0 ; pal_config.environments[i]; i++)
cookies[cnt++] = (unsigned long int) pal_config.environments[i];
for (i = 0 ; envp[i]; i++)
cookies[cnt++] = (unsigned long int) envp[i];
cookies[cnt++] = 0;
@@ -1148,7 +1149,7 @@ NO_PRELOAD:
/* This part is awesome. Don't risk changing it!! */
#if defined(__x86_64__)
ret = ((int (*) (int, const char **, const char **))
exec_map->l_entry) (argc, argv, pal_config.environments);
exec_map->l_entry) (argc, argv, envp);
#else
# error "architecture not supported"
#endif
+1 -1
View File
@@ -361,7 +361,7 @@ DkStreamWrite (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
/* _DkStreamAttributesQuery of internal use. The function query attribute
of streams by their URI */
int _DkStreamAttributesQuery (PAL_STR uri, PAL_STREAM_ATTR * attr)
int _DkStreamAttributesQuery (const char * uri, PAL_STREAM_ATTR * attr)
{
struct handle_ops * ops = NULL;
const char * type = NULL;
+1 -1
View File
@@ -16,7 +16,7 @@ ARFLAGS =
host_target = libpal-Linux.a
defs = -DIN_PAL -DPAL_LOADER_PATH="$(shell readlink -f ../../pal)" \
defs = -DIN_PAL -DSRCDIR="$(PWD)/" -DPAL_LOADER_PATH="$(shell readlink -f ../../pal)" \
-DGDB_SCRIPT="$(CURDIR)/pal-gdb.py"
objs = $(addprefix db_,files devices pipes sockets streams memory threading \
semaphore mutex events process object main rtld misc ipc \
+68 -29
View File
@@ -70,8 +70,6 @@ static gid_t gid;
static ElfW(Addr) sysinfo_ehdr;
#endif
static const char * child_args;
static void pal_init_bootstrap (void * args, int * pargc,
const char *** pargv,
const char *** penvp)
@@ -123,17 +121,8 @@ static void pal_init_bootstrap (void * args, int * pargc,
#endif
}
if (!memcmp(*argv + strlen(*argv) - 3, "pal", 3)) {
argv++;
argc--;
if (argc >= 1 && (*argv)[0] == ':') {
child_args = (*argv) + 1;
argv++;
argc--;
}
}
argv++;
argc--;
*pargc = argc;
*pargv = argv;
*penvp = envp;
@@ -252,6 +241,9 @@ void pal_linux_main (void * args)
pal_addr);
ELF_DYNAMIC_RELOCATE(pal_dyn, pal_addr);
allocsize = PRESET_PAGESIZE;
allocshift = PRESET_PAGESIZE - 1;
allocmask = ~(PRESET_PAGESIZE - 1);
init_slab_mgr();
setup_pal_map(XSTRINGIFY(SRCDIR) "/pal", pal_dyn, pal_addr);
@@ -269,9 +261,9 @@ int create_domain_dir (void)
if (IS_ERR(ret) && ERRNO(ret) != EEXIST) {
if (ERRNO(ret) == ENOENT) {
ret = INLINE_SYSCALL(mkdir, 2, (path = GRAPHENE_TMPDIR), 0777);
ret = INLINE_SYSCALL(mkdir, 2, (path = GRAPHENE_TEMPDIR), 0777);
if (!IS_ERR(ret)) {
INLINE_SYSCALL(chmod, 2, GRAPHENE_TMPDIR, 0777);
INLINE_SYSCALL(chmod, 2, GRAPHENE_TEMPDIR, 0777);
ret = INLINE_SYSCALL(mkdir, 2, (path = GRAPHENE_PIPEDIR), 0777);
}
}
@@ -286,7 +278,7 @@ int create_domain_dir (void)
if (!IS_ERR(ret))
INLINE_SYSCALL(chmod, 2, GRAPHENE_PIPEDIR, 0777);
char * pipedir = __alloca(GRAPHENE_PIPEDIR_LEN + 10);
char * pipedir = __alloca(sizeof(GRAPHENE_PIPEDIR) + 10);
unsigned int id;
do {
@@ -295,7 +287,7 @@ int create_domain_dir (void)
return -PAL_ERROR_DENIED;
}
snprintf(pipedir, GRAPHENE_PIPEDIR_LEN + 10,
snprintf(pipedir, sizeof(GRAPHENE_PIPEDIR) + 10,
GRAPHENE_PIPEDIR "/%08x", id);
ret = INLINE_SYSCALL(mkdir, 2, pipedir, 0700);
@@ -311,9 +303,6 @@ int create_domain_dir (void)
return 0;
}
int init_child_process (const char * proc_args);
int signal_setup (void);
#if USE_VDSO_GETTIME == 1
void setup_vdso_map (ElfW(Addr) addr);
#endif
@@ -329,22 +318,68 @@ int _DkInitHost (int * pargc, const char *** pargv)
const char ** argv = *pargv, * first_argv = NULL;
int ret = 0;
if (!child_args && !argc) {
struct pal_proc_args proc_args;
void * proc_data;
bool in_child = false;
ret = INLINE_SYSCALL(read, 3, PROC_INIT_FD, &proc_args,
sizeof(proc_args));
if (IS_ERR(ret) && ERRNO(ret) != EBADF)
return -PAL_ERROR_DENIED;
if (!IS_ERR(ret)) {
in_child = true;
proc_data = __alloca(proc_args.data_size);
ret = INLINE_SYSCALL(read, 3, PROC_INIT_FD, proc_data,
proc_args.data_size);
if (IS_ERR(ret) || ret < proc_args.data_size)
return -PAL_ERROR_DENIED;
}
if (!in_child && !argc) {
printf("USAGE: libpal.so [executable|manifest] args ...\n");
return -PAL_ERROR_INVAL;
}
pal_linux_config.pid = INLINE_SYSCALL(getpid, 0);
pal_config.user_addr_end = (void *)
ALLOC_ALIGNDOWN(pal_config.lib_text_start);
/* look for lowest mappable address, starting at 0x400000 */
if (pal_sec_info.user_addr_base) {
pal_config.user_addr_start = pal_sec_info.user_addr_base;
} else {
void * base = (void *) 0x400000;
for (; base < pal_config.user_addr_end ;
base = (void *) ((unsigned long) base << 4)) {
void * mem = (void *) ARCH_MMAP(base, allocsize,
PROT_NONE,
MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,
-1, 0);
if (IS_ERR_P(mem))
continue;
INLINE_SYSCALL(munmap, 2, mem, allocsize);
if (mem == base)
break;
}
pal_sec_info.user_addr_base = pal_config.user_addr_start = base;
}
signal_setup();
if (child_args) {
if ((ret = init_child_process(child_args)) < 0)
if (in_child) {
if ((ret = init_child_process(&proc_args, proc_data)) < 0)
return ret;
goto read_manifest;
}
/* occupy PROC_INIT_FD so no one will use it */
INLINE_SYSCALL(dup2, 2, 0, PROC_INIT_FD);
if (!(ret = read_shebang(argv)) < 0)
goto read_manifest;
@@ -399,7 +434,8 @@ read_manifest:
&attr)) < 0)
return ret;
void * cfg_addr = NULL;
pal_config.user_addr_end -= ALLOC_ALIGNUP(attr.size);
void * cfg_addr = pal_config.user_addr_end;
size_t cfg_size = attr.size;
if ((ret = _DkStreamMap(pal_config.manifest_handle, &cfg_addr,
@@ -440,7 +476,7 @@ read_manifest:
}
}
if (!child_args) {
if (!in_child) {
if ((len = get_config(root_config, "loader.execname", cfgbuf,
CONFIG_MAX)) > 0)
first_argv = remalloc(cfgbuf, len + 1);
@@ -450,7 +486,7 @@ read_manifest:
}
done_init:
if (!child_args && !pal_sec_info.domain_id) {
if (!in_child && !pal_sec_info.domain_id) {
if ((ret = create_domain_dir()) < 0)
return ret;
}
@@ -468,11 +504,14 @@ done_init:
if (!pal_sec_info.mcast_port) {
unsigned short mcast_port;
getrand(&mcast_port, sizeof(unsigned short));
pal_sec_info.mcast_port = mcast_port % 1024;
if (mcast_port < 1024)
mcast_port += 1024;
pal_sec_info.mcast_port = mcast_port > 1024 ? mcast_port :
mcast_port + 1204;
}
__pal_control.broadcast_stream = pal_sec_info.mcast_handle ? :
_DkBroadcastStreamOpen(pal_sec_info.mcast_port);
__pal_control.broadcast_stream =
_DkBroadcastStreamOpen(pal_sec_info.mcast_port);
if (first_argv) {
argc++;
+137 -223
View File
@@ -51,15 +51,17 @@ typedef __kernel_pid_t pid_t;
# define SEEK_SET 0
#endif
int _DkProcessCreate (PAL_HANDLE * handle, const char * uri,
int flags, const char ** args)
int _DkProcessCreate (PAL_HANDLE * handle,
const char * uri, int flags, const char ** args)
{
int ret, rete = 0;
int ret, rete;
const char * manifest_uri = pal_config.manifest;
PAL_HANDLE manifest = pal_config.manifest_handle;
int manifest_fd = -1;
const char * exec_uri = NULL;
PAL_HANDLE exec = NULL;
int exec_fd = -1;
bool noexec = false;
if (uri) {
@@ -73,10 +75,18 @@ int _DkProcessCreate (PAL_HANDLE * handle, const char * uri,
exec = NULL;
exec_uri = NULL;
}
exec_fd = exec->file.fd;
INLINE_SYSCALL(fcntl, 3, exec_fd, F_SETFD, 0);
} else {
noexec = true;
}
if (manifest) {
manifest_fd = manifest->file.fd;
INLINE_SYSCALL(fcntl, 3, manifest_fd, F_SETFD, 0);
}
int fds[6] = { -1, -1, -1, -1, -1, -1 };
if (IS_ERR((ret = INLINE_SYSCALL(pipe2, 2, &fds[0], 0))) ||
@@ -92,69 +102,12 @@ int _DkProcessCreate (PAL_HANDLE * handle, const char * uri,
{ fds[2], fds[1], fds[5] },
};
int nargs = 0;
if (args) {
const char ** p = args;
while (*p) {
p++;
nargs++;
}
}
# define STRARG_SIZE 256
const char ** new_args = __alloca(sizeof(const char *) * (nargs + 3));
int bufsize = STRARG_SIZE;
char * argbuf = __alloca(STRARG_SIZE);
new_args[0] = PAL_LOADER;
new_args[1] = argbuf;
if (args)
memcpy(new_args + 2, args, sizeof(const char *) * nargs);
new_args[nargs + 2] = NULL;
#define write_arg(...) \
do { \
int _len = snprintf(argbuf, bufsize, __VA_ARGS__); \
argbuf += _len; \
bufsize -= _len; \
} while (0);
write_arg(":domain=%08x;", pal_sec_info.domain_id);
int manifest_fd = -1;
if (manifest) {
manifest_fd = manifest->file.fd;
INLINE_SYSCALL(fcntl, 3, manifest_fd, F_SETFD, 0);
write_arg("manifest=%d,%s;", manifest_fd, manifest_uri ? : "");
if (manifest != pal_config.manifest_handle)
manifest_fd = -1;
}
write_arg("proc=%d,%d,%d,%d;",
proc_fds[0][0], proc_fds[0][1], proc_fds[0][2],
pal_linux_config.pid);
if (exec) {
int exec_fd = exec->file.fd;
INLINE_SYSCALL(fcntl, 3, exec_fd, F_SETFD, 0);
write_arg("exec=%d,%s;", exec_fd, exec_uri ? : "");
} else if (noexec) {
write_arg("noexec;");
}
if (pal_sec_info.pipe_prefix)
write_arg("pipe=%s;", pal_sec_info.pipe_prefix);
if (pal_config.heap_base)
write_arg("heap=%lx;", pal_config.heap_base);
if (pal_sec_info.rand_gen)
write_arg("rand=%d;", pal_sec_info.rand_gen);
if (pal_sec_info.mcast_port)
write_arg("mcast=%u;", pal_sec_info.mcast_port);
int argc = 0;
if (args) for (; args[argc] ; argc++);
const char ** argv = __alloca(sizeof(const char *) * (argc + 2));
argv[0] = PAL_LOADER;
if (args) memcpy(&argv[1], args, sizeof(const char *) * argc);
argv[argc + 1] = NULL;
ret = ARCH_VFORK();
@@ -167,14 +120,19 @@ int _DkProcessCreate (PAL_HANDLE * handle, const char * uri,
for (int i = 0 ; i < 3 ; i++)
INLINE_SYSCALL(close, 1, proc_fds[1][i]);
INLINE_SYSCALL(close, 1, PROC_INIT_FD);
rete = INLINE_SYSCALL(dup2, 2, proc_fds[0][0], PROC_INIT_FD);
if (IS_ERR(rete))
goto out_child;
if (manifest_fd >= 0)
INLINE_SYSCALL(fcntl, 3, manifest_fd, F_SETFD, 0);
rete = INLINE_SYSCALL(execve, 3, PAL_LOADER, new_args,
pal_config.environments);
rete = INLINE_SYSCALL(execve, 3, PAL_LOADER, argv, NULL);
/* shouldn't get to here */
printf("unexpected failure of new process\n");
out_child:
asm("hlt");
return 0;
}
@@ -187,6 +145,67 @@ int _DkProcessCreate (PAL_HANDLE * handle, const char * uri,
for (int i = 0 ; i < 3 ; i++)
INLINE_SYSCALL(close, 1, proc_fds[0][i]);
int pipe_in = proc_fds[1][0], pipe_out = proc_fds[1][1];
unsigned short data_size = 0;
unsigned short exec_uri_offset = 0, manifest_uri_offset = 0;
if (exec_uri) {
int len = strlen(exec_uri);
exec_uri_offset = data_size;
data_size += len + 1;
}
if (manifest_fd >= 0) {
int len = strlen(manifest_uri);
manifest_uri_offset = data_size;
data_size += len + 1;
}
struct pal_proc_args * proc_args = __alloca(sizeof(struct pal_proc_args) +
data_size);
void * data = ((void *) proc_args) + sizeof(struct pal_proc_args);
memset(proc_args, 0, sizeof(struct pal_proc_args));
memcpy(&proc_args->pal_sec_info, &pal_sec_info, sizeof(struct pal_sec_info));
proc_args->pal_sec_info._dl_debug_state = NULL;
proc_args->pal_sec_info._r_debug = NULL;
proc_args->proc_fds[0] = proc_fds[0][0];
proc_args->proc_fds[1] = proc_fds[0][1];
proc_args->proc_fds[2] = proc_fds[0][2];
proc_args->parent_pid = pal_linux_config.pid;
proc_args->exec_fd = (exec_fd == -1) ? PAL_IDX_POISON : exec_fd;
proc_args->noexec = noexec;
proc_args->manifest_fd = (manifest_fd == -1) ? PAL_IDX_POISON : manifest_fd;
if (exec_uri)
memcpy(data + (proc_args->exec_uri_offset = exec_uri_offset),
exec_uri, strlen(exec_uri) + 1);
if (manifest_uri)
memcpy(data + (proc_args->manifest_uri_offset = manifest_uri_offset),
manifest_uri, strlen(manifest_uri) + 1);
proc_args->data_size = data_size;
ret = INLINE_SYSCALL(write, 3, pipe_out, proc_args,
sizeof(struct pal_proc_args) + data_size);
if (IS_ERR(ret) || ret < sizeof(struct pal_proc_args) + data_size) {
ret = -PAL_ERROR_DENIED;
goto out;
}
ret = INLINE_SYSCALL(read, 3, pipe_in, &rete, sizeof(int));
if (IS_ERR(ret) || ret < sizeof(int)) {
ret = -PAL_ERROR_DENIED;
goto out;
}
if (rete < 0) {
ret = rete;
goto out;
}
for (int i = 0 ; i < 3 ; i++)
INLINE_SYSCALL(fcntl, 3, proc_fds[1][i], F_SETFD, FD_CLOEXEC);
@@ -211,166 +230,61 @@ out:
return ret;
}
static void read_child_args (const char * val, int vlen,
void * arg1, bool isnum1,
void * arg2, bool isnum2,
void * arg3, bool isnum3,
void * arg4, bool isnum4)
int init_child_process (struct pal_proc_args * proc_args, void * proc_data)
{
const char * v1 = val, * v2 = v1, * end = val + vlen;
void * arg[4] = { arg1, arg2, arg3, arg4 };
bool isnum[4] = { isnum1, isnum2, isnum3, isnum4 };
memcpy(&pal_sec_info, &proc_args->pal_sec_info, sizeof(pal_sec_info));
for (int i = 0 ; i < 4 ; i++) {
if (!arg[i])
return;
PAL_HANDLE parent = malloc(HANDLE_SIZE(process));
SET_HANDLE_TYPE(parent, process);
parent->__in.flags |= RFD(0)|WFD(1)|RFD(2)|WFD(2)|WRITEABLE(1)|WRITEABLE(2);
parent->process.stream_in = proc_args->proc_fds[0];
parent->process.stream_out = proc_args->proc_fds[1];
parent->process.cargo = proc_args->proc_fds[2];
parent->process.pid = proc_args->parent_pid;
parent->process.nonblocking = PAL_FALSE;
__pal_control.parent_process = parent;
while (v2 < end && *v2 != ',')
v2++;
if (v1 >= end || v2 <= v1) {
if (isnum[i])
*(int *) arg[i] = 0;
else
((char *) arg[i])[0] = 0;
continue;
}
if (isnum[i]) {
*(int *) arg[i] = atoi(v1);
} else {
memcpy((char *) arg[i], v1, v2 - v1);
((char *) arg[i])[v2 - v1] = 0;
}
v2 = v1 = v2 + 1;
}
}
static inline bool set_fd_cloexec (int fd)
{
return !(IS_ERR(INLINE_SYSCALL(fcntl, 3, fd, F_SETFD, FD_CLOEXEC)));
}
#define STRARG_SIZE 256
static void read_child_handle (const char * val, int vlen,
PAL_HANDLE * handle, const char ** uri)
{
int fd;
char buf[STRARG_SIZE];
read_child_args(val, vlen, &fd, true, buf, false,
NULL, false, NULL, false);
if (!fd || !set_fd_cloexec(fd)) {
*handle = NULL;
*uri = NULL;
return;
}
INLINE_SYSCALL(lseek, 3, fd, 0, SEEK_SET);
int len = strlen(buf);
PAL_HANDLE hdl = malloc(HANDLE_SIZE(file) + (len > 4 ? len - 4 : 0));
SET_HANDLE_TYPE(hdl, file);
hdl->__in.flags |= RFD(0)|WFD(0)|WRITEABLE(0);
hdl->file.fd = fd;
if (len > 4) {
char * path = (void *) hdl + HANDLE_SIZE(file);
memcpy(path, buf + 5, len - 4);
hdl->file.realpath = path;
if (proc_args->exec_fd != PAL_IDX_POISON) {
char * uri = (char *) proc_data + proc_args->exec_uri_offset;
char * exec_uri = remalloc(uri, strlen(uri) + 1);
INLINE_SYSCALL(lseek, 3, proc_args->exec_fd, 0, SEEK_SET);
PAL_HANDLE exec = malloc(HANDLE_SIZE(file));
SET_HANDLE_TYPE(exec, file);
exec->__in.flags |= RFD(0);
exec->file.fd = proc_args->exec_fd;
exec->file.offset = 0;
exec->file.append = PAL_FALSE;
exec->file.pass = PAL_FALSE;
exec->file.realpath = remalloc(exec_uri + 5, strlen(exec_uri + 5) + 1);
pal_config.exec = exec_uri;
pal_config.exec_handle = exec;
} else {
hdl->file.realpath = NULL;
pal_linux_config.noexec = proc_args->noexec;
}
*handle = hdl;
*uri = len ? remalloc(buf, len + 1) : NULL;
}
int init_child_process (const char * proc_args)
{
const char * c = proc_args;
while (*c) {
const char * key = c, * val;
int klen, vlen;
while (*c && *c != '=' && *c != ';')
c++;
klen = c - key;
if (klen == 6 && !memcmp(key, "noexec", 6))
/* format: noexec */
pal_linux_config.noexec = true;
if (!*c)
break;
if (*c == ';') {
c++;
continue;
}
val = (++c);
while (*c && *c != ';')
c++;
vlen = c - val;
if (*c == ';')
c++;
if (klen == 4) {
if (!memcmp(key, "exec", 4)) {
/* format: exec=fd,uri */
read_child_handle(val, vlen, &pal_config.exec_handle,
&pal_config.exec);
} else if (!memcmp(key, "proc", 4)) {
/* format: proc=fd,pid */
int fds[3], pid;
read_child_args(val, vlen,
&fds[0], true, &fds[1], true, &fds[2], true,
&pid, true);
for (int i = 0 ; i < 3 ; i++)
if (!set_fd_cloexec(fds[i]))
fds[i] = PAL_IDX_POISON;
PAL_HANDLE proc = malloc(HANDLE_SIZE(process));
SET_HANDLE_TYPE(proc, process);
proc->__in.flags |= RFD(0)|WFD(1)|RFD(2)|WFD(2)|WRITEABLE(1)|WRITEABLE(2);
proc->process.stream_in = fds[0];
proc->process.stream_out = fds[1];
proc->process.cargo = fds[2];
proc->process.pid = pid;
__pal_control.parent_process = proc;
} else if (!memcmp(key, "pipe", 4)) {
/* format: pipe=prefix */
char * prefix = remalloc(val, vlen + 1);
prefix[vlen] = 0;
pal_sec_info.pipe_prefix = prefix;
} else if (!memcmp(key, "rand", 4)) {
/* format: rand=fd */
pal_sec_info.rand_gen = atoi(val);
} else if (!memcmp(key, "heap", 4)) {
/* format: heap=addr (hex) */
pal_config.heap_base = (void *) strtol(val, NULL, 16);
}
} else if (klen == 5) {
if (!memcmp(key, "mcast", 5)) {
/* format: mcast=port */
pal_sec_info.mcast_port = atoi(val);
}
} else if (klen == 6) {
if (!memcmp(key, "domain", 6)) {
/* format: domain=id */
pal_sec_info.domain_id = strtol(val, NULL, 16);
}
} else if (klen == 8) {
if (!memcmp(key, "manifest", 8)) {
/* format: manifest=fd,uri */
read_child_handle(val, vlen, &pal_config.manifest_handle,
&pal_config.manifest);
}
}
if (proc_args->manifest_fd != PAL_IDX_POISON) {
char * uri = (char *) proc_data + proc_args->manifest_uri_offset;
char * manifest_uri = remalloc(uri, strlen(uri) + 1);
INLINE_SYSCALL(lseek, 3, proc_args->manifest_fd, 0, SEEK_SET);
PAL_HANDLE manifest = malloc(HANDLE_SIZE(file));
SET_HANDLE_TYPE(manifest, file);
manifest->__in.flags |= RFD(0);
manifest->file.fd = proc_args->manifest_fd;
manifest->file.offset = 0;
manifest->file.append = PAL_FALSE;
manifest->file.pass = PAL_FALSE;
manifest->file.realpath = remalloc(manifest_uri + 5,
strlen(manifest_uri + 5) + 1);
pal_config.manifest = manifest_uri;
pal_config.manifest_handle = manifest;
}
int child_status = 0;
int ret = INLINE_SYSCALL(write, 3, proc_args->proc_fds[1], &child_status,
sizeof(int));
if (IS_ERR(ret))
return -PAL_ERROR_DENIED;
return 0;
}
@@ -450,12 +364,12 @@ static int set_graphene_task (const char * uri, int flags)
mcast_rules[1].peer.port_end = pal_sec_info.mcast_port;
if (flags & PAL_SANDBOX_PIPE) {
char pipe_root[GRAPHENE_PIPEDIR_LEN + 20];
char pipe_root[sizeof(GRAPHENE_PIPEDIR) + 20];
char pipe_prefix[9];
int sandboxid;
snprintf(pipe_root,
GRAPHENE_PIPEDIR_LEN + 20, GRAPHENE_PIPEDIR "/%08x",
sizeof(GRAPHENE_PIPEDIR) + 20, GRAPHENE_PIPEDIR "/%08x",
pal_sec_info.domain_id);
getrand(&sandboxid, sizeof(int));
@@ -474,7 +388,7 @@ static int set_graphene_task (const char * uri, int flags)
if (ret < 0)
goto out_mem;
pal_sec_info.pipe_prefix = remalloc(pipe_prefix, 9);
memcpy(&pal_sec_info.pipe_prefix, pipe_prefix, 9);
} else {
const struct graphene_user_policy default_policies[] = {
{ .type = GRAPHENE_NET_RULE, .value = &mcast_rules[0], },
+1 -1
View File
@@ -1281,7 +1281,7 @@ static int mcast_c (PAL_HANDLE handle, int port)
PAL_HANDLE _DkBroadcastStreamOpen (int port)
{
PAL_HANDLE hdl = malloc(HANDLE_SIZE(file));
PAL_HANDLE hdl = malloc(HANDLE_SIZE(mcast));
SET_HANDLE_TYPE(hdl, mcast);
mcast_s(hdl, port);
mcast_c(hdl, port);
+17
View File
@@ -110,6 +110,23 @@ int _DkMutexLock (struct mutex_handle * mut);
int _DkMutexLockTimeout (struct mutex_handle * mut, int timeout);
int _DkMutexUnlock (struct mutex_handle * mut);
#include "pal_security.h"
struct pal_proc_args {
struct pal_sec_info pal_sec_info;
PAL_IDX proc_fds[3];
unsigned int parent_pid;
PAL_IDX exec_fd;
unsigned short exec_uri_offset;
bool noexec;
PAL_IDX manifest_fd;
unsigned short manifest_uri_offset;
unsigned short data_size;
};
int init_child_process (struct pal_proc_args * proc_args, void * proc_data);
int signal_setup (void);
#if USE_VDSO_GETTIME == 1
# if USE_CLOCK_GETTIME == 1
struct timespec;
+8 -7
View File
@@ -22,24 +22,25 @@
#include "pal.h"
#define PATH_MAX 80
#define PIPE_MAX 32
struct r_debug;
extern struct pal_sec_info {
const char * pal_name;
unsigned int domain_id;
const char * pipe_prefix;
char pipe_prefix[PIPE_MAX];
void * user_addr_base;
int rand_gen;
unsigned short mcast_port;
PAL_HANDLE mcast_handle;
void (*_dl_debug_state) (void);
struct r_debug * _r_debug;
} pal_sec_info;
#define GRAPHENE_TMPDIR "/tmp/graphene"
#define GRAPHENE_TMPDIR_LEN (13)
#define GRAPHENE_TEMPDIR "/tmp/graphene"
#define GRAPHENE_PIPEDIR GRAPHENE_TEMPDIR "/pipes"
#define GRAPHENE_PIPEDIR GRAPHENE_TMPDIR "/pipes"
#define GRAPHENE_PIPEDIR_LEN (GRAPHENE_TMPDIR_LEN + 6)
#define PROC_INIT_FD 3
#define MCAST_GROUP "239.0.0.1"
+3
View File
@@ -125,6 +125,9 @@ typedef struct {
/* address where PAL is loaded */
PAL_BUF library_begin;
PAL_BUF library_end;
/* The range of address allowed for user */
PAL_BUF user_address_begin;
PAL_BUF user_address_end;
/* host page size */
PAL_NUM pagesize;
/* host allocation alignment */
+18 -12
View File
@@ -117,9 +117,6 @@ extern const struct handle_ops * pal_handle_ops [];
NULL : pal_handle_ops[_type]; \
})
int parse_stream_uri (const char ** uri, const char ** prefix,
struct handle_ops ** ops);
/* interger hash functions defined inline. The algorithm we used here
is based on Robert Jenkins developed in 96', the algorithm has two
version, 32-bit one and 64-bit one. */
@@ -283,11 +280,10 @@ extern struct pal_config {
PAL_HANDLE manifest_handle;
PAL_HANDLE exec_handle;
struct config_store * root_config;
const char ** environments;
unsigned long pagesize;
unsigned long alloc_align;
bool daemonize;
void * heap_base;
void * user_addr_start, * user_addr_end;
void * lib_text_start, * lib_text_end;
void * lib_data_start, * lib_data_end;
PAL_HANDLE console_output;
@@ -309,12 +305,22 @@ extern void * data_start, * data_end;
boundaries */
extern unsigned long allocsize, allocshift, allocmask;
#define ALLOC_ALIGNDOWN(addr) \
(allocsize ? ((unsigned long) (addr)) & allocmask : (unsigned long) (addr))
#define ALLOC_ALIGNUP(addr) \
(allocsize ? (((unsigned long) (addr)) + allocshift) & allocmask : (unsigned long) (addr))
#define ALLOC_ALIGNED(addr) \
(allocsize && ((unsigned long) (addr)) == (((unsigned long) (addr)) & allocmask))
#define ALLOC_ALIGNDOWN(addr) \
({ \
assert(allocsize && allocshift && allocmask); \
((unsigned long) (addr)) & allocmask; \
})
#define ALLOC_ALIGNUP(addr) \
({ \
assert(allocsize && allocshift && allocmask); \
(((unsigned long) (addr)) + allocshift) & allocmask; \
})
#define ALLOC_ALIGNED(addr) \
({ \
assert(allocsize && allocshift && allocmask); \
(unsigned long) (addr) == \
(((unsigned long) (addr)) & allocmask); \
})
/* For initialization */
void pal_main (int argc, const char ** argv, const char ** envp);
@@ -336,7 +342,7 @@ int _DkStreamRead (PAL_HANDLE handle, int offset, int count, void * buf,
char * addr, int addrlen);
int _DkStreamWrite (PAL_HANDLE handle, int offset, int count,
const void * buf, const char * addr, int addrlen);
int _DkStreamAttributesQuery (PAL_STR uri, PAL_STREAM_ATTR * attr);
int _DkStreamAttributesQuery (const char * uri, PAL_STREAM_ATTR * attr);
int _DkStreamAttributesQuerybyHandle (PAL_HANDLE hdl, PAL_STREAM_ATTR * attr);
int _DkStreamMap (PAL_HANDLE handle, void ** addr, int prot, int offset,
size_t size);
+1
View File
@@ -39,6 +39,7 @@ typedef __builtin_va_list __gnuc_va_list;
SYSCALL(__NR_bind, action_trace), \
SYSCALL(__NR_clone, action_allow), \
SYSCALL(__NR_close, action_allow), \
SYSCALL(__NR_dup2, action_allow), \
SYSCALL(__NR_connect, action_trace), \
SYSCALL(__NR_execve, action_trace), \
SYSCALL(__NR_exit, action_allow), \
+22 -91
View File
@@ -33,9 +33,8 @@ unsigned long pagemask = ~4095;
# define FILEBUF_SIZE 832
#endif
char libname[80];
char libname[PATH_MAX];
const char * execname;
char pipe_prefix[10];
int find_manifest (int * pargc, const char *** pargv)
{
@@ -373,7 +372,8 @@ static void run_library (unsigned long entry, void * stack,
*((void **) (stack -= sizeof(void *))) = NULL;
for (int i = argc - 1 ; i >= 0 ; i--)
*((const void **) (stack -= sizeof(void *))) = argv[i];
*((unsigned long *) (stack -= sizeof(unsigned long))) = argc;
*((const void **) (stack -= sizeof(void *))) = libname;
*((unsigned long *) (stack -= sizeof(unsigned long))) = argc + 1;
asm volatile ("movq %0, %%rsp\r\n"
"pushq %1\r\n"
@@ -412,73 +412,6 @@ struct config_store root_config;
int free_heaps (void);
static int mcast_s (PAL_HANDLE handle, int port)
{
handle->mcast.srv = PAL_IDX_POISON;
int ret = 0;
int fd = INLINE_SYSCALL(socket, 3, AF_INET, SOCK_DGRAM, 0);
if (IS_ERR(fd))
return -ERRNO(fd);
struct in_addr local;
local.s_addr = INADDR_ANY;
ret = INLINE_SYSCALL(setsockopt, 5, fd, IPPROTO_IP, IP_MULTICAST_IF,
&local, sizeof(local));
if (IS_ERR(ret))
return -ERRNO(ret);
handle->__in.flags |= WFD(1)|WRITEABLE(1);
handle->mcast.srv = fd;
return 0;
}
static int mcast_c (PAL_HANDLE handle, int port)
{
handle->mcast.cli = PAL_IDX_POISON;
int ret = 0;
int fd = INLINE_SYSCALL(socket, 3, AF_INET, SOCK_DGRAM, 0);
if (IS_ERR(fd))
return -ERRNO(fd);
int reuse = 1;
INLINE_SYSCALL(setsockopt, 5, fd, SOL_SOCKET, SO_REUSEADDR,
&reuse, sizeof(reuse));
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
ret = INLINE_SYSCALL(bind, 3, fd, &addr, sizeof(addr));
if (IS_ERR(ret))
return -ERRNO(ret);
struct in_addr local;
local.s_addr = INADDR_ANY;
ret = INLINE_SYSCALL(setsockopt, 5, fd, IPPROTO_IP, IP_MULTICAST_IF,
&local, sizeof(local));
if (IS_ERR(ret))
return -ERRNO(ret);
struct ip_mreq group;
inet_pton(AF_INET, MCAST_GROUP, &group.imr_multiaddr.s_addr);
group.imr_interface.s_addr = htonl(INADDR_ANY);
ret = INLINE_SYSCALL(setsockopt, 5, fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group));
if (IS_ERR(ret))
return -ERRNO(ret);
handle->__in.flags |= RFD(0);
handle->mcast.cli = fd;
handle->mcast.nonblocking = PAL_FALSE;
return 0;
}
union pal_handle mcast_handle;
void do_main (void * args)
{
void **all_args = (void **) args;
@@ -504,6 +437,9 @@ void do_main (void * args)
goto exit;
}
/* occupy PAL_INIT_FD */
INLINE_SYSCALL(dup2, 2, 0, PROC_INIT_FD);
for (av = (void *) auxv ; av->a_type != AT_NULL ; av++)
switch (av->a_type) {
case AT_BASE:
@@ -582,10 +518,10 @@ void do_main (void * args)
if (IS_ERR(ret) && ERRNO(ret) != EEXIST) {
if (ERRNO(ret) == ENOENT) {
ret = INLINE_SYSCALL(mkdir, 2, GRAPHENE_TMPDIR, 0777);
ret = INLINE_SYSCALL(mkdir, 2, GRAPHENE_TEMPDIR, 0777);
if (!IS_ERR(ret)) {
INLINE_SYSCALL(chmod, 2, GRAPHENE_TMPDIR, 0777);
INLINE_SYSCALL(chmod, 2, GRAPHENE_TEMPDIR, 0777);
ret = INLINE_SYSCALL(mkdir, 2, GRAPHENE_PIPEDIR, 0777);
}
}
@@ -598,8 +534,9 @@ void do_main (void * args)
INLINE_SYSCALL(chmod, 2, GRAPHENE_PIPEDIR, 0777);
unsigned int domainid = 0;
char * tmpdir = __alloca(GRAPHENE_PIPEDIR_LEN + 12);
memcpy(tmpdir, GRAPHENE_PIPEDIR, GRAPHENE_PIPEDIR_LEN + 1);
char * tmpdir = __alloca(sizeof(GRAPHENE_PIPEDIR) + 12);
memcpy(tmpdir, GRAPHENE_PIPEDIR, sizeof(GRAPHENE_PIPEDIR));
tmpdir[sizeof(GRAPHENE_PIPEDIR) - 1] = '/';
while (!domainid) {
ret = INLINE_SYSCALL(read, 3, rand, &domainid,
@@ -610,7 +547,7 @@ void do_main (void * args)
}
if (domainid) {
snprintf(tmpdir + GRAPHENE_PIPEDIR_LEN, 12, "/%08x", domainid);
snprintf(tmpdir + sizeof(GRAPHENE_PIPEDIR), 12, "%08x", domainid);
ret = INLINE_SYSCALL(mkdir, 2, tmpdir, 0700);
if (IS_ERR(ret)) {
if ((ret = -ERRNO(ret)) != -EEXIST)
@@ -621,28 +558,19 @@ void do_main (void * args)
}
}
snprintf(pipe_prefix, sizeof(pipe_prefix), "%08x", domainid);
snprintf(pal_sec_info_addr->pipe_prefix, PIPE_MAX, "%08x", domainid);
unsigned short mcast_port = 0;
do {
ret = INLINE_SYSCALL(read, 3, rand, &mcast_port,
sizeof(unsigned short));
if (IS_ERR(ret)) {
ret = -ERRNO(ret);
goto exit;
}
} while (mcast_port < 1024);
SET_HANDLE_TYPE(&mcast_handle, mcast);
mcast_s(&mcast_handle, mcast_port);
mcast_c(&mcast_handle, mcast_port);
mcast_handle.mcast.port = mcast_port;
ret = INLINE_SYSCALL(read, 3, rand, &mcast_port, sizeof(mcast_port));
if (IS_ERR(ret)) {
ret = -ERRNO(ret);
goto exit;
}
if (mcast_port < 1024) mcast_port += 1024;
pal_sec_info_addr->domain_id = domainid;
pal_sec_info_addr->pipe_prefix = pipe_prefix;
pal_sec_info_addr->rand_gen = rand;
pal_sec_info_addr->mcast_port = mcast_port;
pal_sec_info_addr->mcast_handle = &mcast_handle;
pal_sec_info_addr->_dl_debug_state = &___dl_debug_state;
pal_sec_info_addr->_r_debug = &___r_debug;
@@ -652,6 +580,9 @@ void do_main (void * args)
free_heaps();
/* free PAL_INIT_FD */
INLINE_SYSCALL(close, 1, PROC_INIT_FD);
ret = install_syscall_filter(libname, pal_start, pal_end, do_trace);
if (ret < 0) {
printf("Unable to install system call filter\n");
+2 -2
View File
@@ -27,8 +27,8 @@ int ioctl_set_graphene (struct config_store * config, int ndefault,
int init_child (int argc, const char ** argv, const char ** envp)
{
const char * pipe_prefix = pal_sec_info_addr->pipe_prefix;
char pipe_root[GRAPHENE_PIPEDIR_LEN + 20];
snprintf(pipe_root, GRAPHENE_PIPEDIR_LEN + 20, GRAPHENE_PIPEDIR "/%08x",
char pipe_root[sizeof(GRAPHENE_PIPEDIR) + 20];
snprintf(pipe_root, sizeof(GRAPHENE_PIPEDIR) + 20, GRAPHENE_PIPEDIR "/%08x",
pal_sec_info_addr->domain_id);
struct graphene_net_policy mcast_rules[2];
+2 -4
View File
@@ -16,8 +16,7 @@ debug: CC=gcc -g
debug: $(target) manifest
manifest: manifest.template
[ ! -f manifest ] || mv -f manifest manifest.backup
cp manifest.template manifest
cp -f manifest.template manifest
# Regression Test
rtest: $(rtarget)
@@ -49,6 +48,5 @@ $(target): %: %.c $(graphene_lib) $(pal_lib)
@$(CC) $(CFLAGS) $^ -o $@
clean:
rm -rf $(target)
[ ! -f manifest ] || mv manifest manifest.backup
rm -rf $(target) manifest
find -type f -executable -exec rm {} \;