From 7f0a8a63c0740b758893cf89f89ba66546daf1a2 Mon Sep 17 00:00:00 2001 From: Greg Alexander Date: Sun, 21 Dec 2014 14:58:24 -0500 Subject: [PATCH] build scp as a separate executable --- doit | 2 +- dropbear/dbutil.c | 33 +++++++++++++++++---------------- dropbear/scp.c | 2 -- jni/Android.mk | 21 ++++++++++++++++++--- jni/config.h | 6 +++--- jni/interface.c | 2 +- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/doit b/doit index 1e56cbd..234ef04 100755 --- a/doit +++ b/doit @@ -1 +1 @@ -ndk-build -j8 && ant debug && cat bin/SimpleSSHD-debug.apk | ssh roach 'cat > /sdcard/buh.apk; source .profile; pm install -r /sdcard/buh.apk' +ndk-build -j8 && mv libs/armeabi/scp libs/armeabi/libscp.so && ant debug && cat bin/SimpleSSHD-debug.apk | ssh roach 'cat > /sdcard/buh.apk; source .profile; pm install -r /sdcard/buh.apk' diff --git a/dropbear/dbutil.c b/dropbear/dbutil.c index 3297151..1137e65 100644 --- a/dropbear/dbutil.c +++ b/dropbear/dbutil.c @@ -574,29 +574,19 @@ int spawn_command(void(*exec_fn)(void *user_data), void *exec_data, * re-enabled SIGPIPE. If cmd is NULL, will run a login shell. */ void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell) { - char * argv[100]; + char * argv[4]; char * baseshell = NULL; unsigned int i; - /* Re-enable SIGPIPE for the executed process */ - if (signal(SIGPIPE, SIG_DFL) == SIG_ERR) { - dropbear_exit("signal() error"); - } - - /* close file descriptors except stdin/stdout/stderr - * Need to be sure FDs are closed here to avoid reading files as root */ - for (i = 3; i <= maxfd; i++) { - m_close(i); - } + baseshell = basename(usershell); if (cmd && !strncmp(cmd, "scp ", 4)) { - int argc = split_cmd(cmd, argv, sizeof argv/sizeof argv[0]); - scp_main(argc, argv); - exit(0); + char *t = malloc(strlen(cmd)+strlen(NDK_EXECUTABLES_PATH)+80); + sprintf(t, "%s/lib%s.so %s", NDK_EXECUTABLES_PATH, "scp", + cmd+4); + cmd = t; } - baseshell = basename(usershell); - if (cmd != NULL) { argv[0] = baseshell; } else { @@ -615,6 +605,17 @@ void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell) { argv[1] = NULL; } + /* Re-enable SIGPIPE for the executed process */ + if (signal(SIGPIPE, SIG_DFL) == SIG_ERR) { + dropbear_exit("signal() error"); + } + + /* close file descriptors except stdin/stdout/stderr + * Need to be sure FDs are closed here to avoid reading files as root */ + for (i = 3; i <= maxfd; i++) { + m_close(i); + } + execv(usershell, argv); } diff --git a/dropbear/scp.c b/dropbear/scp.c index 2d88162..ec4a076 100644 --- a/dropbear/scp.c +++ b/dropbear/scp.c @@ -302,7 +302,6 @@ void tolocal(int, char *[]); void toremote(char *, int, char *[]); void usage(void); -#if defined(DBMULTI_scp) || !defined(DROPBEAR_MULTI) #if defined(DBMULTI_scp) && defined(DROPBEAR_MULTI) int scp_main(int argc, char **argv) #else @@ -453,7 +452,6 @@ main(int argc, char **argv) } exit(errs != 0); } -#endif /* DBMULTI_scp stuff */ void toremote(char *targ, int argc, char **argv) diff --git a/jni/Android.mk b/jni/Android.mk index cc5f55e..bf7d940 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -5,7 +5,7 @@ include $(CLEAR_VARS) LOCAL_CFLAGS := LOCAL_MODULE := simplesshd-jni -DROPBEAR_PATH := ../dropbear/ +DROPBEAR_PATH := ../dropbear DROPBEAR_SRCS := $(DROPBEAR_PATH)/atomicio.c \ $(DROPBEAR_PATH)/bignum.c \ $(DROPBEAR_PATH)/buffer.c \ @@ -449,8 +449,6 @@ DROPBEAR_SRCS := $(DROPBEAR_PATH)/atomicio.c \ $(DROPBEAR_PATH)/progressmeter.c \ $(DROPBEAR_PATH)/queue.c \ $(DROPBEAR_PATH)/rsa.c \ - $(DROPBEAR_PATH)/scp.c \ - $(DROPBEAR_PATH)/scpmisc.c \ $(DROPBEAR_PATH)/signkey.c \ $(DROPBEAR_PATH)/sshpty.c \ $(DROPBEAR_PATH)/svr-agentfwd.c \ @@ -473,3 +471,20 @@ LOCAL_C_INCLUDES:= dropbear dropbear/libtomcrypt/src/headers dropbear/libtommath # LOCAL_LDLIBS := include $(BUILD_SHARED_LIBRARY) + + +# build separate scp executable + +include $(CLEAR_VARS) + +LOCAL_CFLAGS := +LOCAL_MODULE := scp + +DROPBEAR_PATH := ../dropbear +LOCAL_SRC_FILES := $(DROPBEAR_PATH)/scp.c \ + $(DROPBEAR_PATH)/scpmisc.c \ + $(DROPBEAR_PATH)/atomicio.c +LOCAL_C_INCLUDES:= dropbear dropbear/libtomcrypt/src/headers dropbear/libtommath +# LOCAL_LDLIBS := + +include $(BUILD_EXECUTABLE) diff --git a/jni/config.h b/jni/config.h index 7d92f59..75b1860 100644 --- a/jni/config.h +++ b/jni/config.h @@ -19,6 +19,7 @@ #define HAVE_BASENAME 1 #define HAVE_NETINET_TCP_H 1 +#define HAVE_LIBGEN_H 1 #define USE_DEV_PTMX 1 #define DISABLE_ZLIB 1 @@ -27,17 +28,16 @@ #define DROPBEAR_SERVER 1 #define DBMULTI_dropbear 1 -#define DBMULTI_scp 1 #define DROPBEAR_MULTI 1 +#define NDK_EXECUTABLES_PATH "/data/data/org.galexander.sshd/lib" + /* in jni/interface.c: */ extern const char *conf_path; extern const char *conf_shell; extern const char *conf_home; const char *conf_path_file(const char *fn); -int split_cmd(const char *in, char **argv, int max_argc); - #endif /* __CONFIG_H__ */ diff --git a/jni/interface.c b/jni/interface.c index d31d0e9..f6a2590 100644 --- a/jni/interface.c +++ b/jni/interface.c @@ -54,7 +54,7 @@ jni_init(JNIEnv *env_) } /* split str into argv entries, honoring " and \ (but nothing else) */ -int +static int split_cmd(const char *in, char **argv, int max_argc) { char curr[1000];