Skip to content

Commit 1c12ce3

Browse files
committed
Greatly improve robustness of DeeModule_OfPointer regarding dex modules
1 parent 64cf467 commit 1c12ce3

File tree

5 files changed

+847
-635
lines changed

5 files changed

+847
-635
lines changed

include/deemon/module.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ struct Dee_module_object {
529529
#define Dee_MODULE_FNOSERIAL 0x0008 /* [const] Indicates that this module could not be serialized during compilation, meaning that anything that depends on it can't be serialized, either. */
530530
#define Dee_MODULE_FABSRED 0x0100 /* [lock(ATOMIC)] is-red-bit for `mo_absnode' */
531531
#define Dee_MODULE_FADRRED 0x0200 /* [lock(ATOMIC)] is-red-bit for `mo_adrnode' */
532+
#define _Dee_MODULE_FNOADDR 0x2000 /* [const] Used for dex modules: "mo_minaddr" and "mo_maxaddr" may not be right. Internally, `dex_byaddr_tree' is used instead of `module_byaddr_tree' */
532533
#define _Dee_MODULE_FLIBALL 0x4000 /* [lock(ATOMIC)] Used internally by `DeeModule_GetLibName()' */
533534
#define _Dee_MODULE_FCLEARED 0x8000 /* [lock(ATOMIC)] Used internally by `DeeModule_ClearDexModuleCaches()' */
534535
uint16_t mo_flags; /* Module flags (Set of `Dee_MODULE_F*') */

include/deemon/system-features.h

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,11 +1010,14 @@ func("dlclose", "defined(CONFIG_HAVE_DLFCN_H)", test: 'extern void *dl; return d
10101010
func("dlsym", "defined(CONFIG_HAVE_DLFCN_H)", test: 'extern void *dl; void *s = dlsym(dl, "foo"); return s != NULL;');
10111011
func("dlmodulename", "defined(CONFIG_HAVE_DLFCN_H) && defined(__USE_KOS)", test: 'extern void *dl; char const *n = dlmodulename(dl); return n != NULL;');
10121012
func("dlgethandle", "defined(CONFIG_HAVE_DLFCN_H) && defined(__USE_KOS)", test: 'extern int x; void *dl = dlgethandle(&x, DLGETHANDLE_FNORMAL); return dl != NULL;');
1013-
func("dl_iterate_phdr", "defined(CONFIG_HAVE_LINK_H) && defined(__ELF__)", test: 'extern int my_dl_callback(struct dl_phdr_info *, size_t, void *); extern struct dl_phdr_info info; extern struct link_map lm; return dl_iterate_phdr(&my_dl_callback, NULL) && info.dlpi_phnum && info.dlpi_addr && info.dlpi_phdr[0].p_vaddr && info.dlpi_phdr[0].p_memsz && lm.l_addr;');
1013+
func("dl_iterate_phdr", "defined(CONFIG_HAVE_LINK_H) && defined(__ELF__)", test: 'extern int my_dl_callback(struct dl_phdr_info *, size_t, void *); extern struct dl_phdr_info info; return dl_iterate_phdr(&my_dl_callback, NULL) && info.dlpi_phnum && info.dlpi_addr && info.dlpi_phdr[0].p_vaddr && info.dlpi_phdr[0].p_memsz;');
10141014
func("dladdr", "defined(CONFIG_HAVE_DLFCN_H) && (defined(__USE_GNU) || defined(__USE_NETBSD) || defined(__USE_SOLARIS))", test: 'extern int my_symbol; Dl_info dli; return dladdr(&my_symbol, &dli) && dli.dli_fname;');
1015+
feature("dlinfo__dli_fname__is_size_ptr", "0", test: 'extern int my_symbol; Dl_info dli; extern char *my_dli_fname[(sizeof(dli.dli_fname) == sizeof(void *)) ? 1 : -1]; return dladdr(&my_symbol, &dli) && (my_dli_fname[0] = dli.dli_fname) != 0;');
10151016
feature("dlinfo__RTLD_DI_LINKMAP", "defined(CONFIG_HAVE_DLFCN_H) && defined(RTLD_DI_LINKMAP) && (defined(__USE_GNU) || defined(__USE_NETBSD) || defined(__USE_SOLARIS))", test: 'extern void *handle; void *lm; return dlinfo(handle, RTLD_DI_LINKMAP, (void *)&lm);');
10161017
feature("dladdr1__RTLD_DL_LINKMAP", "defined(CONFIG_HAVE_DLFCN_H) && defined(RTLD_DL_LINKMAP) && defined(__USE_GNU)", test: 'extern void *handle; Dl_info dli; void *lm; return dladdr1(handle, &dli, (void **)&lm, RTLD_DI_LINKMAP);');
1018+
// TODO: Get rid of "struct__link_map__l_name" after "CONFIG_EXPERIMENTAL_MODULE_DIRECTORIES"
10171019
feature("struct__link_map__l_name", "defined(CONFIG_HAVE_LINK_H)", test: 'extern struct link_map *lm; char const *s = lm->l_name; return !!s;');
1020+
feature("struct__link_map__l_addr", "defined(CONFIG_HAVE_LINK_H) && defined(__ELF__)", test: 'extern struct link_map *lm; return !!lm->l_addr;');
10181021
constant("RTLD_GLOBAL");
10191022
constant("RTLD_LOCAL");
10201023
constant("RTLD_LAZY");
@@ -6616,20 +6619,6 @@ feature("CONSTANT_NAN", "1", test: "extern int val[NAN != 0.0 ? 1 : -1]; return
66166619
#define CONFIG_HAVE_mprotect
66176620
#endif
66186621

6619-
#ifdef CONFIG_NO_fmapfile
6620-
#undef CONFIG_HAVE_fmapfile
6621-
#elif !defined(CONFIG_HAVE_fmapfile) && \
6622-
(defined(fmapfile) || defined(__fmapfile_defined))
6623-
#define CONFIG_HAVE_fmapfile
6624-
#endif
6625-
6626-
#ifdef CONFIG_NO_unmapfile
6627-
#undef CONFIG_HAVE_unmapfile
6628-
#elif !defined(CONFIG_HAVE_unmapfile) && \
6629-
(defined(unmapfile) || defined(__unmapfile_defined))
6630-
#define CONFIG_HAVE_unmapfile
6631-
#endif
6632-
66336622
#ifdef CONFIG_NO_getpagesize
66346623
#undef CONFIG_HAVE_getpagesize
66356624
#elif !defined(CONFIG_HAVE_getpagesize) && \
@@ -7775,6 +7764,12 @@ feature("CONSTANT_NAN", "1", test: "extern int val[NAN != 0.0 ? 1 : -1]; return
77757764
#define CONFIG_HAVE_dladdr
77767765
#endif
77777766

7767+
#ifdef CONFIG_NO_dlinfo__dli_fname__is_size_ptr
7768+
#undef CONFIG_HAVE_dlinfo__dli_fname__is_size_ptr
7769+
#elif 0
7770+
#define CONFIG_HAVE_dlinfo__dli_fname__is_size_ptr
7771+
#endif
7772+
77787773
#ifdef CONFIG_NO_dlinfo__RTLD_DI_LINKMAP
77797774
#undef CONFIG_HAVE_dlinfo__RTLD_DI_LINKMAP
77807775
#elif !defined(CONFIG_HAVE_dlinfo__RTLD_DI_LINKMAP) && \
@@ -7797,6 +7792,13 @@ feature("CONSTANT_NAN", "1", test: "extern int val[NAN != 0.0 ? 1 : -1]; return
77977792
#define CONFIG_HAVE_struct__link_map__l_name
77987793
#endif
77997794

7795+
#ifdef CONFIG_NO_struct__link_map__l_addr
7796+
#undef CONFIG_HAVE_struct__link_map__l_addr
7797+
#elif !defined(CONFIG_HAVE_struct__link_map__l_addr) && \
7798+
(defined(CONFIG_HAVE_LINK_H) && defined(__ELF__))
7799+
#define CONFIG_HAVE_struct__link_map__l_addr
7800+
#endif
7801+
78007802
#ifdef CONFIG_NO_RTLD_GLOBAL
78017803
#undef CONFIG_HAVE_RTLD_GLOBAL
78027804
#elif !defined(CONFIG_HAVE_RTLD_GLOBAL) && \

0 commit comments

Comments
 (0)