From 37c2309a40a08491887ce948c563f60a52b70c6d Mon Sep 17 00:00:00 2001 From: Eric Wing Date: Tue, 1 May 2012 14:38:02 -0700 Subject: Due to Android (and apparently Sun) not supporting getcwd(NULL, 0), I've changed to call to getcwd to specify a buffer and explicit size which successfully works around the problem. One minor performance advantage is that one less malloc/free is needed since the buffer is now created on the stack. Apparently, this was already changed in a prior commit I didn't see initially, but I think the use of an invented/arbitrary PATH_MAX is incorrect. Platforms should generally provide a constant for this and PATH_MAX itself is already defined on some systems like Linux which can cause collisions. This commit improves on those changes by leveraging the constants provided by the compiler/system. To help keep the code consistent but still correct, new platform specific code needed to be introduced for the max length. On POSIX I am assuming it is that provides MAXPATHLEN. This is what the Mac/BSD man page says to use and verified this is also defined on Ubuntu Linux and Android. On Windows, MAX_PATH is used. MAX_PATH seems to still be 260 which seems kind of small; is there a different constant we are supposed to use? In both cases, the respective constants are mapped to a new #define for LFS_MAXPATHLEN to allow the code to refer to one constant and avoid any potential name collisions in case MAXPATHLEN is defined already by something else on Windows (e.g. Cygwin). --- src/lfs.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lfs.c b/src/lfs.c index a784d77..f3a6ce8 100644 --- a/src/lfs.c +++ b/src/lfs.c @@ -82,6 +82,12 @@ #define getcwd_error "Function 'getcwd' not provided by system" #else #define getcwd_error strerror(errno) + #ifdef _WIN32 + #define LFS_MAXPATHLEN MAX_PATH // MAX_PATH seems to be 260. Seems kind of small. Is there a better one? + #else + #include // for MAXPATHLEN + #define LFS_MAXPATHLEN MAXPATHLEN + #endif #endif #define DIR_METATABLE "directory metatable" @@ -160,13 +166,11 @@ static int change_dir (lua_State *L) { ** If unable to get the current directory, it returns nil ** and a string describing the error */ -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - static int get_dir (lua_State *L) { - char path[PATH_MAX]; - if (getcwd((char *)path, PATH_MAX) == NULL) { + char *path; + // Passing (NULL, 0) is not guaranteed to work. Use a temp buffer and size instead. + char buf[LFS_MAXPATHLEN]; + if ((path = getcwd(buf, LFS_MAXPATHLEN)) == NULL) { lua_pushnil(L); lua_pushstring(L, getcwd_error); return 2; -- cgit v1.2.3-55-g6feb