summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclEnv.c70
-rw-r--r--win/tclWinInit.c3
2 files changed, 43 insertions, 30 deletions
diff --git a/generic/tclEnv.c b/generic/tclEnv.c
index 608ebf6..8b73b21 100644
--- a/generic/tclEnv.c
+++ b/generic/tclEnv.c
@@ -19,20 +19,20 @@ TCL_DECLARE_MUTEX(envMutex) /* To serialize access to environ. */
#if defined(_WIN32)
# define tenviron _wenviron
-# define tenviron2utfdstr(string, len, dsPtr) (Tcl_DStringInit(dsPtr), \
- (char *)Tcl_Char16ToUtfDString((const unsigned short *)(string), ((((len) + 2) >> 1) - 1), (dsPtr)))
-# define utf2tenvirondstr(string, len, dsPtr) (Tcl_DStringInit(dsPtr), \
- (const WCHAR *)Tcl_UtfToChar16DString((string), (len), (dsPtr)))
+# define tenviron2utfdstr(str, dsPtr) (Tcl_DStringInit(dsPtr), \
+ (char *)Tcl_Char16ToUtfDString((const unsigned short *)(str), -1, (dsPtr)))
+# define utf2tenvirondstr(str, dsPtr) (Tcl_DStringInit(dsPtr), \
+ (const WCHAR *)Tcl_UtfToChar16DString((str), -1, (dsPtr)))
# define techar WCHAR
# ifdef USE_PUTENV
# define putenv(env) _wputenv((const wchar_t *)env)
# endif
#else
# define tenviron environ
-# define tenviron2utfdstr(tenvstr, len, dstr) \
- Tcl_ExternalToUtfDString(NULL, tenvstr, len, dstr)
-# define utf2tenvirondstr(str, len, dstr) \
- Tcl_UtfToExternalDString(NULL, str, len, dstr)
+# define tenviron2utfdstr(str, dsPtr) \
+ Tcl_ExternalToUtfDString(NULL, str, -1, dsPtr)
+# define utf2tenvirondstr(str, dsPtr) \
+ Tcl_UtfToExternalDString(NULL, str, -1, dsPtr)
# define techar char
#endif
@@ -42,7 +42,7 @@ size_t TclEnvEpoch = 0; /* Epoch of the tcl environment
* (if changed with tcl-env). */
static struct {
- size_t cacheSize; /* Number of env strings in cache. */
+ Tcl_Size cacheSize; /* Number of env strings in cache. */
char **cache; /* Array containing all of the environment
* strings that Tcl has allocated. */
#ifndef USE_PUTENV
@@ -159,7 +159,11 @@ TclSetupEnv(
const char *p1;
char *p2;
- p1 = tenviron2utfdstr(tenviron[i], -1, &envString);
+ p1 = tenviron2utfdstr(tenviron[i], &envString);
+ if (p1 == NULL) {
+ /* Ignore what cannot be decoded (should not happen) */
+ continue;
+ }
p2 = (char *)strchr(p1, '=');
if (p2 == NULL) {
/*
@@ -301,9 +305,9 @@ TclSetEnv(
* interpreters.
*/
- oldEnv = tenviron2utfdstr(tenviron[index], -1, &envString);
- if (strcmp(value, oldEnv + (length + 1)) == 0) {
- Tcl_DStringFree(&envString);
+ oldEnv = tenviron2utfdstr(tenviron[index], &envString);
+ if (oldEnv == NULL || strcmp(value, oldEnv + (length + 1)) == 0) {
+ Tcl_DStringFree(&envString); /* OK even if oldEnv is NULL */
Tcl_MutexUnlock(&envMutex);
return;
}
@@ -324,7 +328,13 @@ TclSetEnv(
memcpy(p, name, nameLength);
p[nameLength] = '=';
memcpy(p+nameLength+1, value, valueLength+1);
- p2 = utf2tenvirondstr(p, -1, &envString);
+ p2 = utf2tenvirondstr(p, &envString);
+ if (p2 == NULL) {
+ /* No way to signal error from here :-( but should not happen */
+ Tcl_Free(p);
+ Tcl_MutexUnlock(&envMutex);
+ return;
+ }
/*
* Copy the native string to heap memory.
@@ -502,7 +512,11 @@ TclUnsetEnv(
string[length] = '\0';
#endif /* _WIN32 */
- utf2tenvirondstr(string, -1, &envString);
+ if (utf2tenvirondstr(string, &envString) == NULL) {
+ /* Should not happen except memory alloc fail. */
+ Tcl_MutexUnlock(&envMutex);
+ return;
+ }
string = (char *)Tcl_Realloc(string, Tcl_DStringLength(&envString) + tNTL);
memcpy(string, Tcl_DStringValue(&envString),
Tcl_DStringLength(&envString) + tNTL);
@@ -577,17 +591,19 @@ TclGetEnv(
if (index != -1) {
Tcl_DString envStr;
- result = tenviron2utfdstr(tenviron[index], -1, &envStr);
- result += length;
- if (*result == '=') {
- result++;
- Tcl_DStringInit(valuePtr);
- Tcl_DStringAppend(valuePtr, result, -1);
- result = Tcl_DStringValue(valuePtr);
- } else {
- result = NULL;
+ result = tenviron2utfdstr(tenviron[index], &envStr);
+ if (result) {
+ result += length;
+ if (*result == '=') {
+ result++;
+ Tcl_DStringInit(valuePtr);
+ Tcl_DStringAppend(valuePtr, result, -1);
+ result = Tcl_DStringValue(valuePtr);
+ } else {
+ result = NULL;
+ }
+ Tcl_DStringFree(&envStr);
}
- Tcl_DStringFree(&envStr);
}
Tcl_MutexUnlock(&envMutex);
return result;
@@ -703,7 +719,7 @@ ReplaceString(
const char *oldStr, /* Old environment string. */
char *newStr) /* New environment string. */
{
- size_t i;
+ Tcl_Size i;
/*
* Check to see if the old value was allocated by Tcl. If so, it needs to
@@ -782,7 +798,7 @@ TclFinalizeEnvironment(void)
if (env.cache) {
#ifdef PURIFY
- size_t i;
+ Tcl_Size i;
for (i = 0; i < env.cacheSize; i++) {
Tcl_Free(env.cache[i]);
}
diff --git a/win/tclWinInit.c b/win/tclWinInit.c
index 510b6df..d682006 100644
--- a/win/tclWinInit.c
+++ b/win/tclWinInit.c
@@ -566,9 +566,6 @@ TclpSetVariables(
*----------------------------------------------------------------------
*/
-# define tenviron2utfdstr(string, len, dsPtr) \
- (char *)Tcl_Char16ToUtfDString((const unsigned short *)(string), ((((len) + 2) >> 1) - 1), (dsPtr))
-
Tcl_Size
TclpFindVariable(
const char *name, /* Name of desired environment variable