From db6f21e2954db63cd04de73ed472c48f63b80a89 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sun, 11 Oct 2020 08:26:53 -0400 Subject: hosted: sanitize handling of HOME_DIR * HOME_DIR is now either "/" or special "" * target-specific "home dir path" is defined solely by PIVOT_ROOT * PIVOT_ROOT path is now defined in toplevel config files * Make Samsung YP-R0/R1 and SONY_NWZ use PIVOT_ROOT too * Do not prepend PIVOT_ROOT path if the path already has it! * Do not play these games for __PCTOOL__ builds Change-Id: I3d51ad902a5f9cafe45ba15ba654f30f1ec6113a --- apps/plugins/battery_bench.c | 2 +- apps/scrobbler.c | 15 +------------- bootloader/rocker_linux.c | 22 +++++++++------------ firmware/export/config/agptekrocker.h | 1 + firmware/export/config/aigoerosq.h | 1 + firmware/export/config/fiiom3k.h | 1 + firmware/export/config/ibassodx50.h | 3 +++ firmware/export/config/ibassodx90.h | 3 +++ firmware/export/config/samsungypr0.h | 1 + firmware/export/config/samsungypr1.h | 1 + firmware/export/config/sonynwzlinux.h | 4 +--- firmware/export/config/xduoox20.h | 1 + firmware/export/config/xduoox3ii.h | 1 + firmware/export/rbpaths.h | 27 ++++++++----------------- firmware/target/hosted/filesystem-app.c | 35 +++++++++++++++++---------------- firmware/target/hosted/rolo.c | 8 +++++++- 16 files changed, 58 insertions(+), 68 deletions(-) diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index a3fd7267f0..deee2815bb 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -24,7 +24,7 @@ #include "plugin.h" #include "lang_enum.h" -#define BATTERY_LOG HOME_DIR"/battery_bench.txt" +#define BATTERY_LOG HOME_DIR "/battery_bench.txt" #define BUF_SIZE 16000 #define EV_EXIT 1337 diff --git a/apps/scrobbler.c b/apps/scrobbler.c index 7ad73248a2..657ce2e7ab 100644 --- a/apps/scrobbler.c +++ b/apps/scrobbler.c @@ -58,7 +58,7 @@ static int cache_pos = 0; static bool pending = false; #if CONFIG_RTC static time_t timestamp; -#define BASE_FILENAME ".scrobbler.log" +#define BASE_FILENAME HOME_DIR "/.scrobbler.log" #define HDR_STR_TIMELESS #define get_timestamp() ((long)timestamp) #define record_timestamp() ((void)(timestamp = mktime(get_time()))) @@ -72,21 +72,8 @@ static time_t timestamp; static void get_scrobbler_filename(char *path, size_t size) { int used; -/* Get location of USB mass storage area */ -#ifdef APPLICATION -#if (CONFIG_PLATFORM & PLATFORM_MAEMO) - used = snprintf(path, size, "/home/user/MyDocs/%s", BASE_FILENAME); -#elif (CONFIG_PLATFORM & PLATFORM_ANDROID) - used = snprintf(path, size, "/sdcard/%s", BASE_FILENAME); -#elif defined (SAMSUNG_YPR0) || defined(DX50) || defined(DX90) - used = snprintf(path, size, "%s/%s", HOME_DIR, BASE_FILENAME); -#else /* Everything else uses a pivot_root strategy.. */ - used = snprintf(path, size, "/%s", BASE_FILENAME); -#endif /* (CONFIG_PLATFORM & PLATFORM_MAEMO) */ -#else used = snprintf(path, size, "/%s", BASE_FILENAME); -#endif if (used >= (int)size) { diff --git a/bootloader/rocker_linux.c b/bootloader/rocker_linux.c index 28a1d78487..a6d69d0e9d 100644 --- a/bootloader/rocker_linux.c +++ b/bootloader/rocker_linux.c @@ -51,14 +51,12 @@ #if defined(AGPTEK_ROCKER) #define ICON_WIDTH 70 #define ICON_HEIGHT 70 -#define RBFILE "rockbox.rocker" #define ICON_NAME bm_hibyicon #define OF_NAME "HIBY PLAYER" #include "bitmaps/hibyicon.h" #elif defined(XDUOO_X3II) #define ICON_WIDTH 130 #define ICON_HEIGHT 130 -#define RBFILE "rockbox.x3ii" #define ICON_NAME bm_hibyicon #define OF_NAME "HIBY PLAYER" #define BUTTON_UP BUTTON_OPTION @@ -68,7 +66,6 @@ #elif defined(XDUOO_X20) #define ICON_WIDTH 130 #define ICON_HEIGHT 130 -#define RBFILE "rockbox.x20" #define ICON_NAME bm_hibyicon #define OF_NAME "HIBY PLAYER" #define BUTTON_UP BUTTON_OPTION @@ -78,7 +75,6 @@ #elif defined(FIIO_M3K) #define ICON_WIDTH 130 #define ICON_HEIGHT 130 -#define RBFILE "rockbox.fiiom3k" #define ICON_NAME bm_fiioicon #define BUTTON_LEFT BUTTON_PREV #define BUTTON_RIGHT BUTTON_NEXT @@ -88,7 +84,6 @@ #elif defined(EROS_Q) #define ICON_WIDTH 130 #define ICON_HEIGHT 130 -#define RBFILE "rockbox.erosq" #define ICON_NAME bm_hibyicon #define OF_NAME "HIBY PLAYER" #define BUTTON_UP BUTTON_SCROLL_BACK @@ -99,11 +94,12 @@ #error "must define ICON_WIDTH/HEIGHT" #endif -#ifdef FIIO_M3K -#define BASE_DIR "/mnt" -#else -#define BASE_DIR "/mnt/sd_0" -#endif +#define BASE_DIR PIVOT_ROOT +//#ifdef FIIO_M3K +//#define BASE_DIR "/mnt" +//#else +//#define BASE_DIR "/mnt/sd_0" +//#endif /* images */ #include "bitmaps/rockboxicon.h" @@ -631,9 +627,9 @@ int main(int argc, char **argv) { fflush(stdout); mount_storage(true); - system("/bin/cp " BASE_DIR "/.rockbox/" RBFILE " /tmp"); - system("/bin/chmod +x /tmp/" RBFILE); - execl("/tmp/" RBFILE, RBFILE, NULL); + system("/bin/cp " BASE_DIR "/.rockbox/" BOOTFILE " /tmp"); + system("/bin/chmod +x /tmp/" BOOTFILE); + execl("/tmp/" BOOTFILE, BOOTFILE, NULL); printf("execvp failed: %s\n", strerror(errno)); /* fallback to OF in case of failure */ error_screen("Cannot boot Rockbox"); diff --git a/firmware/export/config/agptekrocker.h b/firmware/export/config/agptekrocker.h index 230dc6cac4..f0e98d4db2 100644 --- a/firmware/export/config/agptekrocker.h +++ b/firmware/export/config/agptekrocker.h @@ -15,6 +15,7 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/sd_0" #endif #define HIBY_LINUX diff --git a/firmware/export/config/aigoerosq.h b/firmware/export/config/aigoerosq.h index 9207b5548f..6129557726 100644 --- a/firmware/export/config/aigoerosq.h +++ b/firmware/export/config/aigoerosq.h @@ -15,6 +15,7 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/sd_0" #endif #define HIBY_LINUX diff --git a/firmware/export/config/fiiom3k.h b/firmware/export/config/fiiom3k.h index 88652b633f..933e85dab9 100644 --- a/firmware/export/config/fiiom3k.h +++ b/firmware/export/config/fiiom3k.h @@ -15,6 +15,7 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt" #endif #define HAVE_FPU diff --git a/firmware/export/config/ibassodx50.h b/firmware/export/config/ibassodx50.h index 4107fd496f..22215ef9e4 100644 --- a/firmware/export/config/ibassodx50.h +++ b/firmware/export/config/ibassodx50.h @@ -24,7 +24,10 @@ /* This config file is for Rockbox as an application on Android without JVM. */ /* We don't run on hardware directly */ +#ifndef SIMULATOR #define CONFIG_PLATFORM PLATFORM_HOSTED +#define PIVOT_ROOT "/mnt/sdcard" +#endif #define HAVE_FPU /* For Rolo and boot loader */ diff --git a/firmware/export/config/ibassodx90.h b/firmware/export/config/ibassodx90.h index ae5a446aa3..b0cff1a8d0 100644 --- a/firmware/export/config/ibassodx90.h +++ b/firmware/export/config/ibassodx90.h @@ -24,7 +24,10 @@ /* This config file is for Rockbox as an application on Android without JVM. */ /* We don't run on hardware directly */ +#ifndef SIMULATOR #define CONFIG_PLATFORM PLATFORM_HOSTED +#define PIVOT_ROOT "/mnt/sdcard" +#endif #define HAVE_FPU /* For Rolo and boot loader */ diff --git a/firmware/export/config/samsungypr0.h b/firmware/export/config/samsungypr0.h index 414ba39517..655ed811b7 100644 --- a/firmware/export/config/samsungypr0.h +++ b/firmware/export/config/samsungypr0.h @@ -7,6 +7,7 @@ /* YP-R0 need it too of course */ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/media0" #endif /* For Rolo and boot loader */ diff --git a/firmware/export/config/samsungypr1.h b/firmware/export/config/samsungypr1.h index 4d5c4a88f9..6f9904614c 100644 --- a/firmware/export/config/samsungypr1.h +++ b/firmware/export/config/samsungypr1.h @@ -7,6 +7,7 @@ /* YP-R1 need it too of course */ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/media0" #endif /* For Rolo and boot loader */ diff --git a/firmware/export/config/sonynwzlinux.h b/firmware/export/config/sonynwzlinux.h index 66f18724db..074ad1c417 100644 --- a/firmware/export/config/sonynwzlinux.h +++ b/firmware/export/config/sonynwzlinux.h @@ -4,11 +4,9 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/contents" #endif - - - /* define this if you have a colour LCD */ #define HAVE_LCD_COLOR diff --git a/firmware/export/config/xduoox20.h b/firmware/export/config/xduoox20.h index 70e6131cb7..e12346e1bc 100644 --- a/firmware/export/config/xduoox20.h +++ b/firmware/export/config/xduoox20.h @@ -15,6 +15,7 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/sd_0" #endif #define HIBY_LINUX diff --git a/firmware/export/config/xduoox3ii.h b/firmware/export/config/xduoox3ii.h index d19165114a..0b886e3af9 100644 --- a/firmware/export/config/xduoox3ii.h +++ b/firmware/export/config/xduoox3ii.h @@ -15,6 +15,7 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#define PIVOT_ROOT "/mnt/sd_0" #endif #define HIBY_LINUX diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h index 215b4c0c4b..da5a2fb71c 100644 --- a/firmware/export/rbpaths.h +++ b/firmware/export/rbpaths.h @@ -40,24 +40,12 @@ #define ROCKBOX_DIR_LEN (sizeof(ROCKBOX_DIR)-1) #endif /* def __PCTOOL__ */ +/* NOTE: target-specific hosted HOME_DIR resides in filesystem-app.c */ #if !defined(APPLICATION) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \ defined(HIBY_LINUX) || defined(FIIO_M3K) -#if defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) -#define HOME_DIR "/mnt/media0" -#elif defined(SONY_NWZ_LINUX) -#define HOME_DIR "/contents" -#elif defined(DX50) || defined(DX90) -/* Where to put save files like recordings, playlists, screen dumps ...*/ -#define HOME_DIR "/mnt/sdcard" -#elif defined(HIBY_LINUX) -#define HOME_DIR "/mnt/sd_0" -#elif defined(FIIO_M3K) -#define HOME_DIR "/mnt" -#else #define HOME_DIR "/" -#endif /* make sure both are the same for native builds */ #undef ROCKBOX_LIBRARY_PATH @@ -69,6 +57,7 @@ #else /* APPLICATION */ #define HOME_DIR "" /* replaced at runtime */ +#define HAVE_SPECIAL_DIRS #define PLUGIN_DIR ROCKBOX_LIBRARY_PATH "/rockbox/rocks" #if (CONFIG_PLATFORM & PLATFORM_ANDROID) @@ -79,10 +68,8 @@ #endif /* !APPLICATION || SAMSUNG_YPR0 */ -#define HOME_DIR_LEN (sizeof(HOME_DIR)-1) - -#define REC_BASE_DIR "/Recordings" -#define PLAYLIST_CATALOG_DEFAULT_DIR "/Playlists" +#define REC_BASE_DIR HOME_DIR "/Recordings" +#define PLAYLIST_CATALOG_DEFAULT_DIR HOME_DIR "/Playlists" #define LANG_DIR ROCKBOX_DIR "/langs" @@ -91,8 +78,10 @@ #define PLUGIN_DEMOS_DIR PLUGIN_DIR "/demos" #define VIEWERS_DIR PLUGIN_DIR "/viewers" -#if defined(APPLICATION) && !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ - defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX)) +#if defined(APPLICATION) && \ + !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ + defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K)) + #define PLUGIN_DATA_DIR ROCKBOX_DIR "/rocks.data" #define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR #define PLUGIN_APPS_DATA_DIR PLUGIN_DATA_DIR diff --git a/firmware/target/hosted/filesystem-app.c b/firmware/target/hosted/filesystem-app.c index 24c5a7e062..1d64a58677 100644 --- a/firmware/target/hosted/filesystem-app.c +++ b/firmware/target/hosted/filesystem-app.c @@ -36,15 +36,13 @@ #include "rbpaths.h" #include "logf.h" -#if !(defined(BOOTLOADER) || defined(CHECKWPS) || defined(SIMULATOR)) -#if defined(HIBY_LINUX) -#define PIVOT_ROOT "/mnt/sd_0" -#elif defined(FIIO_M3K) -#define PIVOT_ROOT "/mnt" // XXX check this! -#else +/* PIVOT_ROOT adds a fixed prefix to all paths */ +#if defined(BOOTLOADER) || defined(CHECKWPS) || defined(SIMULATOR) || defined(__PCTOOL__) +/* We don't want to use pivot root on these! */ +#undef PIVOT_ROOT #endif -#endif // !(BOOTLOADER|WPS|SIM) +#if defined(HAVE_MULTIDRIVE) || defined(HAVE_SPECIAL_DIRS) #if (CONFIG_PLATFORM & PLATFORM_ANDROID) static const char rbhome[] = "/sdcard"; #elif (CONFIG_PLATFORM & (PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA)) \ @@ -54,15 +52,11 @@ static const char *rbhome; /* YPR0, YPR1, NWZ, etc */ static const char rbhome[] = HOME_DIR; #endif +#endif -#if !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || defined(DX50) || \ - defined(SONY_NWZ_LINUX) || defined(DX90) || defined(HIBY_LINUX) || \ - defined(FIIO_M3K)) && \ - !defined(__PCTOOL__) -/* Special dirs are user-accessible (and user-writable) dirs which take priority - * over the ones where Rockbox is installed to. Classic example would be - * $HOME/.config/rockbox.org vs /usr/share/rockbox */ -#define HAVE_SPECIAL_DIRS +#if !defined(__PCTOOL__) +/* We don't want this for tools */ +#undef HAVE_SPECIAL_DIRS #endif #ifdef HAVE_MULTIDRIVE @@ -202,6 +196,8 @@ const char * handle_special_dirs(const char *dir, unsigned flags, { (void) flags; (void) buf; (void) bufsize; #ifdef HAVE_SPECIAL_DIRS +#define HOME_DIR_LEN (sizeof(HOME_DIR)-1) + /* This replaces HOME_DIR (ie '') with runtime rbhome */ if (!strncmp(HOME_DIR, dir, HOME_DIR_LEN)) { const char *p = dir + HOME_DIR_LEN; @@ -216,8 +212,13 @@ const char * handle_special_dirs(const char *dir, unsigned flags, dir = handle_special_links(dir, flags, buf, bufsize); #endif #ifdef PIVOT_ROOT - snprintf(buf, bufsize, "%s/%s", PIVOT_ROOT, dir); - dir = buf; +#define PIVOT_ROOT_LEN (sizeof(PIVOT_ROOT)-1) + /* Prepend root prefix to find actual path */ + if (strncmp(PIVOT_ROOT, dir, PIVOT_ROOT_LEN)) + { + snprintf(buf, bufsize, "%s/%s", PIVOT_ROOT, dir); + dir = buf; + } #endif return dir; } diff --git a/firmware/target/hosted/rolo.c b/firmware/target/hosted/rolo.c index 432d69c86e..2aa3071c9a 100644 --- a/firmware/target/hosted/rolo.c +++ b/firmware/target/hosted/rolo.c @@ -91,8 +91,14 @@ int rolo_load(const char* filename) lcd_remote_update(); #endif +#ifdef PIVOT_ROOT +#define EXECDIR PIVOT_ROOT +#else +#define EXECDIR ROOT_DIR +#endif + char buf[256]; - snprintf(buf, sizeof(buf), "%s/%s", HOME_DIR, filename); + snprintf(buf, sizeof(buf), "%s/%s", EXECDIR, filename); execl(buf, BOOTFILE, NULL); rolo_error("Failed to launch!", strerror(errno)); -- cgit v1.2.3