From 496755a55da1daacb05ff801d581d7819f6920f8 Mon Sep 17 00:00:00 2001 From: Saran Tunyasuvunakool Date: Fri, 5 May 2023 10:35:04 -0700 Subject: [PATCH] Fix mju_getfiledir when the path contains a mixture of `/` and `\`. PiperOrigin-RevId: 529754511 Change-Id: Ifce2b86bc339a8cae584db639b7901b270e56384 --- src/engine/engine_resource.c | 31 ++++++++++++++++++------------- src/engine/engine_resource.h | 4 ++-- src/engine/engine_vfs.c | 9 +++++---- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/engine/engine_resource.c b/src/engine/engine_resource.c index 948d13a6..538f3520 100644 --- a/src/engine/engine_resource.c +++ b/src/engine/engine_resource.c @@ -175,7 +175,7 @@ void mju_getResourceDir(mjResource* resource, const char** dir, int* ndir) { *dir = NULL; *ndir = 0; - if (resource == NULL) { + if (!resource) { return; } @@ -185,26 +185,31 @@ void mju_getResourceDir(mjResource* resource, const char** dir, int* ndir) { resource->getdir(resource, dir, ndir); } } else { - mju_getfiledir(resource->name, dir, ndir); + *dir = resource->name; + *ndir = mju_dirnamelen(resource->name); } } -// get directory path of file in OS filesystem -void mju_getfiledir(const char* filename, const char** dir, int* ndir) { - *dir = NULL; - *ndir = 0; - char* ch; - - if ((filename != NULL) && - ((ch = strrchr(filename, '/')) || - (ch = strrchr(filename, '\\')))) { - *dir = filename; - *ndir = (int)(ch - filename) + 1; +// get the length of the dirname portion of a given path +int mju_dirnamelen(const char* path) { + if (!path) { + return 0; } + + int pos = -1; + for (int i = 0; path[i] && i >= 0; ++i) { + if (path[i] == '/' || path[i] == '\\') { + pos = i; + } + } + + return pos + 1; } + + // read file into memory buffer (allocated here with mju_malloc) void* mju_fileToMemory(const char* filename, int* filesize) { // open file diff --git a/src/engine/engine_resource.h b/src/engine/engine_resource.h index a29d4de8..7c659d0b 100644 --- a/src/engine/engine_resource.h +++ b/src/engine/engine_resource.h @@ -37,8 +37,8 @@ MJAPI int mju_readResource(mjResource* resource, const void** buffer); // sets for a resource with a name partitioned as {dir}{filename}, the dir and ndir pointers MJAPI void mju_getResourceDir(mjResource* resource, const char** dir, int* ndir); -// get directory of a file in the OS filesystem -void mju_getfiledir(const char* filename, const char** dir, int* ndir); +// get the length of the dirname portion of a given path +int mju_dirnamelen(const char* path); // read file into memory buffer (allocated here with mju_malloc) void* mju_fileToMemory(const char* filename, int* filesize); diff --git a/src/engine/engine_vfs.c b/src/engine/engine_vfs.c index 570472cc..b6f5aea3 100644 --- a/src/engine/engine_vfs.c +++ b/src/engine/engine_vfs.c @@ -253,11 +253,12 @@ static void vfs_close_callback(mjResource* resource) { // getdir callback for the VFS resource provider static void vfs_getdir_callback(mjResource* resource, const char** dir, int* ndir) { - *dir = NULL; - *ndir = 0; - if (resource) { - mju_getfiledir(resource->name, dir, ndir); + *dir = resource->name; + *ndir = mju_dirnamelen(resource->name); + } else { + *dir = NULL; + *ndir = 0; } }