summaryrefslogtreecommitdiffstats
path: root/win/tclWinDde.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-05-13 14:53:53 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-05-13 14:53:53 (GMT)
commite92a8c89a56cfb62c3afd8f8bc612a7d4fa94d1f (patch)
tree4ef00e55bbeaedd9f2bd5f39c625b1c4702dc516 /win/tclWinDde.c
parent8084e168af0746710f165ebb4a157b45dc3b3756 (diff)
parentd7dccda78eed3f2ba6f123ccff8c61b9f7d4bfe0 (diff)
downloadtcl-e92a8c89a56cfb62c3afd8f8bc612a7d4fa94d1f.zip
tcl-e92a8c89a56cfb62c3afd8f8bc612a7d4fa94d1f.tar.gz
tcl-e92a8c89a56cfb62c3afd8f8bc612a7d4fa94d1f.tar.bz2
Protect against receiving strings without ending \0, as external applications (or Tcl with TIP #106) could generate that.
Diffstat (limited to 'win/tclWinDde.c')
-rw-r--r--win/tclWinDde.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/win/tclWinDde.c b/win/tclWinDde.c
index 48bb53d..d508c02 100644
--- a/win/tclWinDde.c
+++ b/win/tclWinDde.c
@@ -787,7 +787,10 @@ DdeServerProc(
utilString = (TCHAR *) DdeAccessData(hData, &dlen);
len = dlen;
- ddeObjectPtr = Tcl_NewStringObj(utilString, -1);
+ if (len && !utilString[len-1]) {
+ len--;
+ }
+ ddeObjectPtr = Tcl_NewStringObj(utilString, len);
Tcl_IncrRefCount(ddeObjectPtr);
DdeUnaccessData(hData);
if (convPtr->returnPackagePtr != NULL) {
@@ -1442,13 +1445,17 @@ DdeObjCmd(
result = TCL_ERROR;
} else {
DWORD tmp;
- const BYTE *dataString = DdeAccessData(ddeData, &tmp);
+ const char *dataString = (const char *) DdeAccessData(ddeData, &tmp);
if (binary) {
- returnObjPtr = Tcl_NewByteArrayObj(dataString,
+ returnObjPtr = Tcl_NewByteArrayObj((BYTE *) dataString,
(int) tmp);
} else {
- returnObjPtr = Tcl_NewStringObj((char *)dataString, -1);
+ if (tmp && !dataString[tmp-1]) {
+ --tmp;
+ }
+ returnObjPtr = Tcl_NewStringObj(dataString,
+ (int) tmp);
}
DdeUnaccessData(ddeData);
DdeFreeDataHandle(ddeData);