From a61a719d35cd6008f35c4f5cb8aaa83453d1d8c1 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. Change-Id: I9162188c78922202b40859249736a23beae60b3e Reviewed-on: http://gerrit.openafs.org/3658 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- 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