151 lines
4.2 KiB
Diff
151 lines
4.2 KiB
Diff
|
|
From eb3a1a3eaa3b789fc4cf34746a29245ccb1f57ea Mon Sep 17 00:00:00 2001
|
|||
|
|
From: "jan.nijtmans" <nijtmans@users.sourceforge.net>
|
|||
|
|
Date: Thu, 4 Oct 2018 19:22:37 +0000
|
|||
|
|
Subject: [PATCH 1432/1800] In registry, protect "keyName" from being NULL:
|
|||
|
|
This actually can lead to crashed (I experienced this ...). Update version to
|
|||
|
|
1.3.3, and align implementation in all branches (core-8-6-branch and higher)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
library/reg/pkgIndex.tcl | 4 ++--
|
|||
|
|
win/tclWinReg.c | 34 +++++++++++++++-------------------
|
|||
|
|
2 files changed, 17 insertions(+), 21 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/library/reg/pkgIndex.tcl b/library/reg/pkgIndex.tcl
|
|||
|
|
index b1fe234c4..ee559b5a8 100755
|
|||
|
|
--- a/library/reg/pkgIndex.tcl
|
|||
|
|
+++ b/library/reg/pkgIndex.tcl
|
|||
|
|
@@ -1,9 +1,9 @@
|
|||
|
|
if {([info commands ::tcl::pkgconfig] eq "")
|
|||
|
|
|| ([info sharedlibextension] ne ".dll")} return
|
|||
|
|
if {[::tcl::pkgconfig get debug]} {
|
|||
|
|
- package ifneeded registry 1.3.2 \
|
|||
|
|
+ package ifneeded registry 1.3.3 \
|
|||
|
|
[list load [file join $dir tclreg13g.dll] registry]
|
|||
|
|
} else {
|
|||
|
|
- package ifneeded registry 1.3.2 \
|
|||
|
|
+ package ifneeded registry 1.3.3 \
|
|||
|
|
[list load [file join $dir tclreg13.dll] registry]
|
|||
|
|
}
|
|||
|
|
diff --git a/win/tclWinReg.c b/win/tclWinReg.c
|
|||
|
|
index de48b9b4b..f3d7a07c8 100644
|
|||
|
|
--- a/win/tclWinReg.c
|
|||
|
|
+++ b/win/tclWinReg.c
|
|||
|
|
@@ -22,13 +22,6 @@
|
|||
|
|
#endif
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
|
|||
|
|
-#ifndef UNICODE
|
|||
|
|
-# undef Tcl_WinTCharToUtf
|
|||
|
|
-# define Tcl_WinTCharToUtf(a,b,c) Tcl_ExternalToUtfDString(NULL,a,b,c)
|
|||
|
|
-# undef Tcl_WinUtfToTChar
|
|||
|
|
-# define Tcl_WinUtfToTChar(a,b,c) Tcl_UtfToExternalDString(NULL,a,b,c)
|
|||
|
|
-#endif /* !UNICODE */
|
|||
|
|
-
|
|||
|
|
/*
|
|||
|
|
* Ensure that we can say which registry is being accessed.
|
|||
|
|
*/
|
|||
|
|
@@ -163,7 +156,7 @@ Registry_Init(
|
|||
|
|
cmd = Tcl_CreateObjCommand(interp, "registry", RegistryObjCmd,
|
|||
|
|
interp, DeleteCmd);
|
|||
|
|
Tcl_SetAssocData(interp, REGISTRY_ASSOC_KEY, NULL, cmd);
|
|||
|
|
- return Tcl_PkgProvide(interp, "registry", "1.3.2");
|
|||
|
|
+ return Tcl_PkgProvide(interp, "registry", "1.3.3");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
@@ -414,12 +407,12 @@ DeleteKey(
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
keyName = Tcl_GetString(keyNameObj);
|
|||
|
|
- buffer = ckalloc(keyNameObj->length + 1);
|
|||
|
|
+ buffer = Tcl_Alloc(keyNameObj->length + 1);
|
|||
|
|
strcpy(buffer, keyName);
|
|||
|
|
|
|||
|
|
if (ParseKeyName(interp, buffer, &hostName, &rootKey,
|
|||
|
|
&keyName) != TCL_OK) {
|
|||
|
|
- ckfree(buffer);
|
|||
|
|
+ Tcl_Free(buffer);
|
|||
|
|
return TCL_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@@ -427,7 +420,7 @@ DeleteKey(
|
|||
|
|
Tcl_SetObjResult(interp,
|
|||
|
|
Tcl_NewStringObj("bad key: cannot delete root keys", -1));
|
|||
|
|
Tcl_SetErrorCode(interp, "WIN_REG", "DEL_ROOT_KEY", NULL);
|
|||
|
|
- ckfree(buffer);
|
|||
|
|
+ Tcl_Free(buffer);
|
|||
|
|
return TCL_ERROR;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@@ -442,7 +435,7 @@ DeleteKey(
|
|||
|
|
mode |= KEY_ENUMERATE_SUB_KEYS | DELETE;
|
|||
|
|
result = OpenSubKey(hostName, rootKey, keyName, mode, 0, &subkey);
|
|||
|
|
if (result != ERROR_SUCCESS) {
|
|||
|
|
- ckfree(buffer);
|
|||
|
|
+ Tcl_Free(buffer);
|
|||
|
|
if (result == ERROR_FILE_NOT_FOUND) {
|
|||
|
|
return TCL_OK;
|
|||
|
|
}
|
|||
|
|
@@ -470,7 +463,7 @@ DeleteKey(
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RegCloseKey(subkey);
|
|||
|
|
- ckfree(buffer);
|
|||
|
|
+ Tcl_Free(buffer);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@@ -603,8 +596,7 @@ GetKeyNames(
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
- Tcl_WinTCharToUtf(buffer, bufSize * sizeof(TCHAR), &ds);
|
|||
|
|
- name = Tcl_DStringValue(&ds);
|
|||
|
|
+ name = Tcl_WinTCharToUtf(buffer, bufSize * sizeof(TCHAR), &ds);
|
|||
|
|
if (pattern && !Tcl_StringMatch(name, pattern)) {
|
|||
|
|
Tcl_DStringFree(&ds);
|
|||
|
|
continue;
|
|||
|
|
@@ -950,7 +942,7 @@ OpenKey(
|
|||
|
|
|
|||
|
|
keyName = Tcl_GetString(keyNameObj);
|
|||
|
|
length = keyNameObj->length;
|
|||
|
|
- buffer = ckalloc(length + 1);
|
|||
|
|
+ buffer = Tcl_Alloc(length + 1);
|
|||
|
|
strcpy(buffer, keyName);
|
|||
|
|
|
|||
|
|
result = ParseKeyName(interp, buffer, &hostName, &rootKey, &keyName);
|
|||
|
|
@@ -966,7 +958,7 @@ OpenKey(
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
- ckfree(buffer);
|
|||
|
|
+ Tcl_Free(buffer);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@@ -1019,7 +1011,9 @@ OpenSubKey(
|
|||
|
|
* this key must be closed by the caller.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
- keyName = (char *) Tcl_WinUtfToTChar(keyName, -1, &buf);
|
|||
|
|
+ if (keyName) {
|
|||
|
|
+ keyName = (char *) Tcl_WinUtfToTChar(keyName, -1, &buf);
|
|||
|
|
+ }
|
|||
|
|
if (flags & REG_CREATE) {
|
|||
|
|
DWORD create;
|
|||
|
|
|
|||
|
|
@@ -1037,7 +1031,9 @@ OpenSubKey(
|
|||
|
|
result = RegOpenKeyEx(rootKey, (TCHAR *)keyName, 0, mode,
|
|||
|
|
keyPtr);
|
|||
|
|
}
|
|||
|
|
- Tcl_DStringFree(&buf);
|
|||
|
|
+ if (keyName) {
|
|||
|
|
+ Tcl_DStringFree(&buf);
|
|||
|
|
+ }
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Be sure to close the root key since we are done with it now.
|
|||
|
|
--
|
|||
|
|
2.19.1
|
|||
|
|
|