aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Borges de Freitas <enen92@users.noreply.github.com>2022-06-20 20:26:38 +0100
committerGitHub <noreply@github.com>2022-06-20 20:26:38 +0100
commitdd0d15da84620cb314bc308ff56f06364c4945c6 (patch)
tree4f38b873bf23fcdb6279720673997f3df8773288
parent952f943678c9dd508c013a29e3ae6e2dcf5c5429 (diff)
parentef7742a26f73fed846652acd8fd0fa785a4635e7 (diff)
Merge pull request #21586 from enen92/dvdcrashandroid
[discs] Fix crash on android when playing dvd folder structures from vfs
-rw-r--r--xbmc/cores/DllLoader/exports/emu_msvcrt.cpp15
-rw-r--r--xbmc/cores/DllLoader/exports/wrapper.c9
2 files changed, 23 insertions, 1 deletions
diff --git a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
index 7f1caee6aa..3f555db7b2 100644
--- a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
+++ b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp
@@ -2029,7 +2029,7 @@ extern "C"
if (!fp)
return nullptr;
-#if defined(TARGET_LINUX)
+#if defined(TARGET_LINUX) && !defined(TARGET_ANDROID)
struct mntent* mountPoint = getmntent(fp);
if (mountPoint)
return mountPoint;
@@ -2047,6 +2047,19 @@ extern "C"
#endif
}
+ struct mntent* dll_getmntent_r(FILE* fp, struct mntent* result, char* buffer, int bufsize)
+ {
+ if (!fp || !result || !buffer)
+ return nullptr;
+
+#if defined(TARGET_LINUX) && !defined(TARGET_ANDROID)
+ struct mntent* mountPoint = getmntent_r(fp, result, buffer, bufsize);
+ if (mountPoint)
+ return mountPoint;
+#endif
+ return nullptr;
+ }
+
// this needs to be wrapped, since dll's have their own file
// descriptor list, but we always use app's list with our wrappers
int __cdecl dll_open_osfhandle(intptr_t _OSFileHandle, int _Flags)
diff --git a/xbmc/cores/DllLoader/exports/wrapper.c b/xbmc/cores/DllLoader/exports/wrapper.c
index 33ab3437c1..aafa48a627 100644
--- a/xbmc/cores/DllLoader/exports/wrapper.c
+++ b/xbmc/cores/DllLoader/exports/wrapper.c
@@ -95,6 +95,7 @@ FILE* dll_popen(const char *command, const char *mode);
void* dll_dlopen(const char *filename, int flag);
int dll_setvbuf(FILE *stream, char *buf, int type, size_t size);
struct mntent *dll_getmntent(FILE *fp);
+struct mntent* dll_getmntent_r(FILE* fp, struct mntent* result, char* buffer, int bufsize);
void *__wrap_dlopen(const char *filename, int flag)
{
@@ -445,6 +446,14 @@ struct mntent *__wrap_getmntent(FILE *fp)
return NULL;
}
+struct mntent* __wrap_getmntent_r(FILE* fp, struct mntent* result, char* buffer, int bufsize)
+{
+#ifdef TARGET_POSIX
+ return dll_getmntent_r(fp, result, buffer, bufsize);
+#endif
+ return NULL;
+}
+
// GCC 4.3 in Ubuntu 8.10 defines _FORTIFY_SOURCE=2 which means, that fread, read etc
// are actually #defines which are inlined when compiled with -O. Those defines
// actually call __*chk (for example, __fread_chk). We need to bypass this whole