From b9707d7fcd921730b5242ab59cebcdff929011c2 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 14 Jan 2011 00:15:10 -0500 Subject: [PATCH] Windows: fixup gettmpdir() Use InterlockedCompareExchangePointer for hostparse() instead of fudging it and leaking memory. If the max path length is MAX_PATH must allocate MAX_PATH+1. Reviewed-on: http://gerrit.openafs.org/3658 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit a61a719d35cd6008f35c4f5cb8aaa83453d1d8c1) Change-Id: I2183cd52298ea1d1204102fee66dea4755de3b41 Reviewed-on: http://gerrit.openafs.org/3820 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/util/hostparse.c | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/src/util/hostparse.c b/src/util/hostparse.c index f1da7477e..2462931ce 100644 --- a/src/util/hostparse.c +++ b/src/util/hostparse.c @@ -253,11 +253,11 @@ gettmpdir(void) if (saveTmpDir == NULL) { /* initialize global temporary directory string */ - char *dirp = (char *)malloc(MAX_PATH); + char *dirp = (char *)malloc(MAX_PATH+1); int freeDirp = 1; if (dirp != NULL) { - DWORD pathLen = GetTempPath(MAX_PATH, dirp); + DWORD pathLen = GetTempPath(MAX_PATH+1, dirp); if (pathLen == 0 || pathLen > MAX_PATH) { /* can't get tmp path; get cur work dir */ @@ -279,7 +279,7 @@ gettmpdir(void) } } } - /* dirp != NULL */ + if (dirp != NULL) { FilepathNormalize(dirp); } else { @@ -288,28 +288,12 @@ gettmpdir(void) freeDirp = 0; } - /* atomically initialize shared buffer pointer IF still null */ - -#if 0 - if (InterlockedCompareExchange(&saveTmpDir, dirp, NULL) != NULL) { - /* shared buffer pointer already initialized by another thread */ - if (freeDirp) { - free(dirp); - } - } /* interlock xchng */ -#endif - - /* Above is what we really want to do, but Windows 95 does not have - * InterlockedCompareExchange(). So we just atomically swap - * the buffer pointer values but we do NOT deallocate the - * previously installed buffer, if any, in case it is in use. - */ -#ifdef _WIN64 - InterlockedExchange64((LONGLONG)(INT_PTR)&saveTmpDir, (LONGLONG) dirp); -#else - InterlockedExchange((LONG) & saveTmpDir, (LONG) dirp); -#endif - + /* atomically initialize shared buffer pointer IF still null */ + if (InterlockedCompareExchangePointer(&saveTmpDir, dirp, NULL) != NULL) { + /* shared buffer pointer already initialized by another thread */ + if (freeDirp) + free(dirp); + } } /* if (!saveTmpDir) */ tmpdirp = saveTmpDir; -- 2.39.5