get the right AppRun.c file, explicitly set \0 in sprintf

This commit is contained in:
darealshinji 2017-12-21 16:40:15 +01:00
parent 79c9fa25fe
commit 22f3a8ce4b
4 changed files with 47 additions and 51 deletions

View file

@ -1,44 +1,30 @@
--- a/AppRun.c --- a/AppRun.c
+++ b/AppRun.c +++ b/AppRun.c
@@ -38,7 +38,7 @@ @@ -164,12 +164,16 @@
exit( 1 ); \ char *old_env;
} while (0); size_t length;
const char *format;
-#define NEW_LD_LIBRARY_PATH "LD_LIBRARY_PATH=./lib/:./lib/i386-linux-gnu/:./lib/x86_64-linux-gnu/:./lib32/:./lib64/:../lib/:../lib/i386-linux-gnu/:../lib/x86_64-linux-gnu/:../lib32/:../lib64/:%s" + checkrt(usr_in_appdir);
+#define NEW_LD_LIBRARY_PATH "LD_LIBRARY_PATH=%s./lib/:./lib/i386-linux-gnu/:./lib/x86_64-linux-gnu/:./lib32/:./lib64/:../lib/:../lib/i386-linux-gnu/:../lib/x86_64-linux-gnu/:../lib32/:../lib64/:%s"
#define NEW_PATH "PATH=./bin/:./sbin/:./games/:../bin/:../sbin/:%s"
#define NEW_PYTHONPATH "PYTHONPATH=./share/pyshared/:%s"
#define NEW_XDG_DATA_DIRS "XDG_DATA_DIRS=./share/:%s"
@@ -138,8 +138,8 @@
char *env, *new_env[7];
env = getenv("LD_LIBRARY_PATH") ?: "";
- new_env[0] = malloc( strlen(NEW_LD_LIBRARY_PATH) + strlen(env) );
- sprintf( new_env[0], NEW_LD_LIBRARY_PATH, env );
+ new_env[0] = malloc( strlen(NEW_LD_LIBRARY_PATH) + strlen(optional) + strlen(env) );
+ sprintf( new_env[0], NEW_LD_LIBRARY_PATH, optional, env );
// printf( " using %s\n", new_env[0] );
putenv( new_env[0] );
@@ -179,6 +179,11 @@
// printf( " using %s\n", new_env[6] );
putenv( new_env[6] );
+ checkrt();
+ +
+ if (optional_ld_preload) + if (optional_ld_preload)
+ putenv(optional_ld_preload); + putenv(optional_ld_preload);
+
/* Run */
ret = execvp(executable, argv);
@@ -187,6 +192,9 @@ /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */
die( "Error executing '%s'; return code: %d\n", executable, ret ); SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/usr/", appdir);
}
old_env = getenv("PATH") ?: "";
- SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", appdir, appdir, appdir, appdir, appdir, old_env);
+ SET_NEW_ENV(new_path, appdir_s*5 + strlen(old_env), "PATH=%s%s/usr/bin/:%s/usr/sbin/:%s/usr/games/:%s/bin/:%s/sbin/:%s", optional, appdir, appdir, appdir, appdir, appdir, old_env);
old_env = getenv("LD_LIBRARY_PATH") ?: "";
SET_NEW_ENV(new_ld_library_path, appdir_s*10 + strlen(old_env), "LD_LIBRARY_PATH=%s/usr/lib/:%s/usr/lib/i386-linux-gnu/:%s/usr/lib/x86_64-linux-gnu/:%s/usr/lib32/:%s/usr/lib64/:%s/lib/:%s/lib/i386-linux-gnu/:%s/lib/x86_64-linux-gnu/:%s/lib32/:%s/lib64/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env);
@@ -201,6 +205,9 @@
if (ret == -1)
die("Error executing '%s': %s\n", exe, strerror(error));
+ free(optional); + free(optional);
+ if (optional_ld_preload) + if (optional_ld_preload)
+ free(optional_ld_preload); + free(optional_ld_preload);
free(new_env[6]); free(line);
free(new_env[5]); free(desktop_file);
free(new_env[4]); free(usr_in_appdir);

View file

@ -21,5 +21,5 @@ AppRun_patched.c: AppRun.c
patch -p1 --output $@ < AppRun.c.patch patch -p1 --output $@ < AppRun.c.patch
AppRun.c: AppRun.c:
wget -c "https://raw.githubusercontent.com/AppImage/AppImageKit/master/AppRun.c" wget -c "https://raw.githubusercontent.com/AppImage/AppImageKit/appimagetool/master/src/AppRun.c"

View file

@ -41,14 +41,14 @@
ret = fscanf(f, "%s", sym); (void)ret; \ ret = fscanf(f, "%s", sym); (void)ret; \
pclose(f); pclose(f);
#define CXXDIR "./optional/libstdc++" #define CXXDIR "optional/libstdc++"
#define GCCDIR "./optional/libgcc" #define GCCDIR "optional/libgcc"
#define EXEC_SO "./optional/exec.so" #define EXEC_SO "optional/exec.so"
char *optional = NULL; char *optional = NULL;
char *optional_ld_preload = NULL; char *optional_ld_preload = NULL;
void checkrt() void checkrt(char *usr_in_appdir)
{ {
int ret; int ret;
FILE *f; FILE *f;
@ -58,8 +58,8 @@ void checkrt()
char stdcxx_bundle_sym[LINE_SIZE], gcc_bundle_sym[LINE_SIZE]; char stdcxx_bundle_sym[LINE_SIZE], gcc_bundle_sym[LINE_SIZE];
int stdcxx_sys_ver=1, stdcxx_bundle_ver=0, gcc_sys_ver=1, gcc_bundle_ver=0; int stdcxx_sys_ver=1, stdcxx_bundle_ver=0, gcc_sys_ver=1, gcc_bundle_ver=0;
char *stdcxx_bundle_lib = CXXDIR "/libstdc++.so.6"; char *stdcxx_bundle_lib = "./" CXXDIR "/libstdc++.so.6";
char *gcc_bundle_lib = GCCDIR "/libgcc_s.so.1"; char *gcc_bundle_lib = "./" GCCDIR "/libgcc_s.so.1";
const char *format = "tr '\\0' '\\n' < '%s' | grep -e '%s' | tail -n1"; const char *format = "tr '\\0' '\\n' < '%s' | grep -e '%s' | tail -n1";
if (access(stdcxx_bundle_lib, F_OK) == 0) { if (access(stdcxx_bundle_lib, F_OK) == 0) {
@ -94,6 +94,7 @@ void checkrt()
int bundle_cxx = 0; int bundle_cxx = 0;
int bundle_gcc = 0; int bundle_gcc = 0;
size_t len = strlen(usr_in_appdir);
if (stdcxx_bundle_ver > stdcxx_sys_ver) if (stdcxx_bundle_ver > stdcxx_sys_ver)
bundle_cxx = 1; bundle_cxx = 1;
@ -102,22 +103,31 @@ void checkrt()
bundle_gcc = 1; bundle_gcc = 1;
if (bundle_cxx == 1 || bundle_gcc == 1) { if (bundle_cxx == 1 || bundle_gcc == 1) {
optional_ld_preload = malloc(strlen(EXEC_SO) + 12); len = strlen(EXEC_SO) + 12 + len;
sprintf(optional_ld_preload, "LD_PRELOAD=" EXEC_SO); optional_ld_preload = malloc(len);
sprintf(optional_ld_preload, "LD_PRELOAD=%s/" EXEC_SO, usr_in_appdir);
optional_ld_preload[len] = '\0';
} }
if (bundle_cxx == 1 && bundle_gcc == 0) { if (bundle_cxx == 1 && bundle_gcc == 0) {
optional = malloc(strlen(CXXDIR) + 2); len = strlen(CXXDIR) + 2 + len;
sprintf(optional, CXXDIR ":"); optional = malloc(len);
sprintf(optional, "%s/" CXXDIR ":", usr_in_appdir);
} else if (bundle_cxx == 0 && bundle_gcc == 1) { } else if (bundle_cxx == 0 && bundle_gcc == 1) {
optional = malloc(strlen(GCCDIR) + 2); len = strlen(GCCDIR) + 2 + len;
sprintf(optional, GCCDIR ":"); optional = malloc(len);
sprintf(optional, "%s/" GCCDIR ":", usr_in_appdir);
} else if (bundle_cxx == 1 && bundle_gcc == 1) { } else if (bundle_cxx == 1 && bundle_gcc == 1) {
optional = malloc(strlen(GCCDIR) + strlen(CXXDIR) + 3); len = strlen(GCCDIR) + strlen(CXXDIR) + 4 + len*2;
sprintf(optional, GCCDIR ":" CXXDIR ":"); optional = malloc(len);
sprintf(optional, "%s/" GCCDIR ":%s/" CXXDIR ":", usr_in_appdir, usr_in_appdir);
} else { } else {
optional = malloc(1); len = 1;
optional = malloc(len);
sprintf(optional, "%s", ""); sprintf(optional, "%s", "");
} }
optional[len] = '\0';
//printf("optional: %s\noptional_ld_preload: %s\n", optional, optional_ld_preload);
} }

View file

@ -1,3 +1,3 @@
extern char *optional; extern char *optional;
extern char *optional_ld_preload; extern char *optional_ld_preload;
extern void checkrt(void); extern void checkrt(char *usr_in_appdir);