|
162 | 162 | # define PHP_RTLD_MODE RTLD_LAZY
|
163 | 163 | # endif
|
164 | 164 |
|
| 165 | +# ifdef __SANITIZE_ADDRESS__ |
| 166 | +# include "sanitizer/lsan_interface.h" |
| 167 | +# endif |
| 168 | + |
| 169 | +/* dl uses a thread local variable internally. Due to LSan crashing we're setting use_tls=0, which |
| 170 | + * will report a leak inside dlopen() that we need to suppress. */ |
| 171 | +static inline void *zend_dlopen(const char *file, int mode) |
| 172 | +{ |
| 173 | +# ifdef __SANITIZE_ADDRESS__ |
| 174 | + __lsan_disable(); |
| 175 | +# endif |
| 176 | + void *ptr = dlopen(file, mode); |
| 177 | +# ifdef __SANITIZE_ADDRESS__ |
| 178 | + __lsan_enable(); |
| 179 | +# endif |
| 180 | + return ptr; |
| 181 | +} |
165 | 182 | # if defined(RTLD_GROUP) && defined(RTLD_WORLD) && defined(RTLD_PARENT)
|
166 |
| -# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT) |
| 183 | +# define DL_LOAD(libname) zend_dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT) |
167 | 184 | # elif defined(RTLD_DEEPBIND) && !defined(__SANITIZE_ADDRESS__) && !__has_feature(memory_sanitizer)
|
168 |
| -# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_DEEPBIND) |
| 185 | +# define DL_LOAD(libname) zend_dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL | RTLD_DEEPBIND) |
169 | 186 | # else
|
170 |
| -# define DL_LOAD(libname) dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL) |
| 187 | +# define DL_LOAD(libname) zend_dlopen(libname, PHP_RTLD_MODE | RTLD_GLOBAL) |
171 | 188 | # endif
|
| 189 | + |
| 190 | +static inline void *zend_dlsym(void *__restrict handle, const char *__restrict name) |
| 191 | +{ |
| 192 | +# ifdef __SANITIZE_ADDRESS__ |
| 193 | + __lsan_disable(); |
| 194 | +# endif |
| 195 | + void *ptr = dlsym(handle, name); |
| 196 | +# ifdef __SANITIZE_ADDRESS__ |
| 197 | + __lsan_enable(); |
| 198 | +# endif |
| 199 | + return ptr; |
| 200 | +} |
172 | 201 | # define DL_UNLOAD dlclose
|
173 | 202 | # if defined(DLSYM_NEEDS_UNDERSCORE)
|
174 |
| -# define DL_FETCH_SYMBOL(h,s) dlsym((h), "_" s) |
| 203 | +# define DL_FETCH_SYMBOL(h,s) zend_dlsym((h), "_" s) |
175 | 204 | # else
|
176 |
| -# define DL_FETCH_SYMBOL dlsym |
| 205 | +# define DL_FETCH_SYMBOL zend_dlsym |
177 | 206 | # endif
|
178 | 207 | # define DL_ERROR dlerror
|
179 | 208 | # define DL_HANDLE void *
|
|
0 commit comments