svnno****@sourc*****
svnno****@sourc*****
2016年 7月 12日 (火) 18:04:21 JST
Revision: 6440 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6440 Author: doda Date: 2016-07-12 18:04:20 +0900 (Tue, 12 Jul 2016) Log Message: ----------- ・CBStartPaste() を DDE 系とクリップボード系に分離 ・DDE系の CBStartSend() と CBStartEcho() を共通化 ・コメントで DataSize should be <= BuffSize とあるが実際には保証されてなく、 ヒープを破壊する事があった事(*1)、および BuffSize を呼び出し元から指定する 意味も無さそうなので BuffSize を廃止し、メモリの確保にも DataSize を 使うように変更。 [*1] BuffSize は TermWidthMax(500) だが、DataSize は MaxStrLen(512) まで 大きくなる為、500バイト以上のデータを send するとバッファオーバランで ヒープが壊れる Modified Paths: -------------- trunk/teraterm/teraterm/clipboar.c trunk/teraterm/teraterm/clipboar.h trunk/teraterm/teraterm/tekwin.cpp trunk/teraterm/teraterm/ttdde.c trunk/teraterm/teraterm/vtwin.cpp -------------- next part -------------- Modified: trunk/teraterm/teraterm/clipboar.c =================================================================== --- trunk/teraterm/teraterm/clipboar.c 2016-07-11 08:53:16 UTC (rev 6439) +++ trunk/teraterm/teraterm/clipboar.c 2016-07-12 09:04:20 UTC (rev 6440) @@ -108,13 +108,49 @@ CBCopyWideHandle = NULL; } -void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed, - int BuffSize, PCHAR DataPtr, int DataSize) -// -// DataPtr and DataSize are used only for DDE -// For clipboard, BuffSize should be 0 -// DataSize should be <= BuffSize +void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly) { + if (! cv.Ready) { + return; + } + if (TalkStatus!=IdTalkKeyb) { + return; + } + + CBAddCR = FALSE; + CBBracketed = CB_BRACKET_NONE; + + CBEchoOnly = EchoOnly; + + CBMemHandle = NULL; + CBMemPtr = NULL; + + CBMemPtr2 = 0; + CBDDE = TRUE; + CBWIDE = FALSE; + + CBInsertDelay = FALSE; + + CBRetrySend = FALSE; + CBRetryEcho = FALSE; + CBSendCR = FALSE; + + if ((CBMemHandle = GlobalAlloc(GHND, DataSize)) != NULL) { + if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) { + memcpy(CBMemPtr, DataPtr, DataSize); + GlobalUnlock(CBMemHandle); + CBMemPtr=NULL; + TalkStatus=IdTalkCB; + } + } + + if (TalkStatus != IdTalkCB) { + CBEndPaste(); + } +} + +void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed) +{ UINT Cf; if (! cv.Ready) { @@ -129,20 +165,18 @@ CBBracketed = CB_BRACKET_START; } - if (BuffSize==0) { // for clipboar - if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { - Cf = CF_UNICODETEXT; - } - else if (IsClipboardFormatAvailable(CF_TEXT)) { - Cf = CF_TEXT; - } - else if (IsClipboardFormatAvailable(CF_OEMTEXT)) { - Cf = CF_OEMTEXT; - } - else { - return; - } + if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { + Cf = CF_UNICODETEXT; } + else if (IsClipboardFormatAvailable(CF_TEXT)) { + Cf = CF_TEXT; + } + else if (IsClipboardFormatAvailable(CF_OEMTEXT)) { + Cf = CF_OEMTEXT; + } + else { + return; + } CBEchoOnly = FALSE; @@ -153,59 +187,46 @@ CBWIDE = FALSE; CBInsertDelay = FALSE; - if (BuffSize==0) { //clipboard - if (ts.PasteDelayPerLine > 0) { - CBInsertDelay = TRUE; - } - if (OpenClipboard(HWin)) { - if (Cf == CF_UNICODETEXT) { - // \x93\\x82\xE8\x95t\x82\xAF\x8F\x88\x97\x9D\x82ł\xCD CBMemHandle \x82ł͂Ȃ\xAD dde \x82Ɠ\xAF\x82\xB6\x82悤\x82\xC9 CBMemPtr \x82\xAA\x8Eg\x82\xED\x82\xEA\x82\xE9 - HGLOBAL TmpHandle = GetClipboardData(Cf); - CBWIDE = TRUE; - if (TmpHandle) { - LPWSTR TmpPtr = (LPWSTR)GlobalLock(TmpHandle); - int mb_len = WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, 0, 0, NULL, NULL); + CBRetrySend = FALSE; + CBRetryEcho = FALSE; + CBSendCR = FALSE; - CBMemHandle = GlobalAlloc(GHND, mb_len); - if (CBMemHandle != NULL) { - CBMemPtr = GlobalLock(CBMemHandle); - if (CBMemPtr != NULL) { - WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, CBMemPtr, mb_len, NULL, NULL); + if (ts.PasteDelayPerLine > 0) { + CBInsertDelay = TRUE; + } + if (OpenClipboard(HWin)) { + if (Cf == CF_UNICODETEXT) { + // \x93\\x82\xE8\x95t\x82\xAF\x8F\x88\x97\x9D\x82ł\xCD CBMemHandle \x82ł͂Ȃ\xAD dde \x82Ɠ\xAF\x82\xB6\x82悤\x82\xC9 CBMemPtr \x82\xAA\x8Eg\x82\xED\x82\xEA\x82\xE9 + HGLOBAL TmpHandle = GetClipboardData(Cf); + CBWIDE = TRUE; + if (TmpHandle) { + LPWSTR TmpPtr = (LPWSTR)GlobalLock(TmpHandle); + int mb_len = WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, 0, 0, NULL, NULL); - GlobalUnlock(CBMemHandle); - CBMemPtr=NULL; - TalkStatus=IdTalkCB; - } + CBMemHandle = GlobalAlloc(GHND, mb_len); + if (CBMemHandle != NULL) { + CBMemPtr = GlobalLock(CBMemHandle); + if (CBMemPtr != NULL) { + WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, CBMemPtr, mb_len, NULL, NULL); - GlobalUnlock(TmpHandle); - CloseClipboard(); + GlobalUnlock(CBMemHandle); + CBMemPtr=NULL; + TalkStatus=IdTalkCB; } + + GlobalUnlock(TmpHandle); + CloseClipboard(); } } - else { - CBMemHandle = GetClipboardData(Cf); - if (CBMemHandle!=NULL) { - TalkStatus=IdTalkCB; - } - } } - } - else { // dde - CBMemHandle = GlobalAlloc(GHND,BuffSize); - if (CBMemHandle != NULL) { - CBDDE = TRUE; - CBMemPtr = GlobalLock(CBMemHandle); - if (CBMemPtr != NULL) { - memcpy(CBMemPtr,DataPtr,DataSize); - GlobalUnlock(CBMemHandle); - CBMemPtr=NULL; + else { + CBMemHandle = GetClipboardData(Cf); + if (CBMemHandle!=NULL) { TalkStatus=IdTalkCB; } } } - CBRetrySend = FALSE; - CBRetryEcho = FALSE; - CBSendCR = FALSE; + if (TalkStatus != IdTalkCB) { CBEndPaste(); } @@ -325,36 +346,6 @@ } } -void CBStartEcho(PCHAR DataPtr, int DataSize) -{ - if (! cv.Ready) { - return; - } - if (TalkStatus!=IdTalkKeyb) { - return; - } - - CBEchoOnly = TRUE; - CBMemPtr2 = 0; - CBRetryEcho = FALSE; - CBSendCR = FALSE; - CBWIDE = FALSE; - - CBDDE = TRUE; - if ((CBMemHandle = GlobalAlloc(GHND, DataSize)) != NULL) { - if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) { - memcpy(CBMemPtr, DataPtr, DataSize); - GlobalUnlock(CBMemHandle); - CBMemPtr=NULL; - TalkStatus=IdTalkCB; - } - } - - if (TalkStatus != IdTalkCB) { - CBEndPaste(); - } -} - // \x82\xB1\x82̊\x94\x82̓N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xA8\x82\xE6\x82\xD1DDE\x83f\x81[\x83^\x82\xF0\x92[\x96\x96\x82֑\x97\x82荞\x82ށB // // CBMemHandle\x83n\x83\x93\x83h\x83\x8B\x82̓O\x83\x8D\x81[\x83o\x83\x8B\x95ϐ\x94\x82Ȃ̂ŁA\x82\xB1\x82̊\x94\x82\xAA\x8FI\x97\xB9\x82\xB7\x82\xE9\x82܂ł́A Modified: trunk/teraterm/teraterm/clipboar.h =================================================================== --- trunk/teraterm/teraterm/clipboar.h 2016-07-11 08:53:16 UTC (rev 6439) +++ trunk/teraterm/teraterm/clipboar.h 2016-07-12 09:04:20 UTC (rev 6440) @@ -11,10 +11,9 @@ /* prototypes */ PCHAR CBOpen(LONG MemSize); void CBClose(); -void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed, - int BuffSize, PCHAR DataPtr, int DataSize); +void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly); +void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed); void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer); -void CBStartEcho(PCHAR DataPtr, int DataSize); void CBSend(); void CBEcho(); void CBEndPaste(); Modified: trunk/teraterm/teraterm/tekwin.cpp =================================================================== --- trunk/teraterm/teraterm/tekwin.cpp 2016-07-11 08:53:16 UTC (rev 6439) +++ trunk/teraterm/teraterm/tekwin.cpp 2016-07-12 09:04:20 UTC (rev 6440) @@ -485,7 +485,7 @@ void CTEKWindow::OnRButtonUp(UINT nFlags, CPoint point) { - CBStartPaste(tk.HWin, FALSE, FALSE, 0, NULL, 0); + CBStartPaste(tk.HWin, FALSE, FALSE); } void CTEKWindow::OnSetFocus(CWnd* pOldWnd) @@ -743,12 +743,12 @@ void CTEKWindow::OnEditPaste() { - CBStartPaste(tk.HWin, FALSE, FALSE, 0, NULL, 0); + CBStartPaste(tk.HWin, FALSE, FALSE); } void CTEKWindow::OnEditPasteCR() { - CBStartPaste(tk.HWin, TRUE, FALSE, 0, NULL, 0); + CBStartPaste(tk.HWin, TRUE, FALSE); } void CTEKWindow::OnEditClearScreen() Modified: trunk/teraterm/teraterm/ttdde.c =================================================================== --- trunk/teraterm/teraterm/ttdde.c 2016-07-11 08:53:16 UTC (rev 6439) +++ trunk/teraterm/teraterm/ttdde.c 2016-07-12 09:04:20 UTC (rev 6440) @@ -57,9 +57,6 @@ static BOOL AutoLogClose = FALSE; -#define CBBufSize TermWidthMax - - static void BringupMacroWindow(BOOL flash_flag) { HWND hwnd; @@ -288,7 +285,7 @@ DataPtr = DdeAccessData(Data,&DataSize); if (DataPtr==NULL) return DDE_FNOTPROCESSED; - CBStartPaste(NULL, FALSE, FALSE, CBBufSize, DataPtr, DataSize); + CBStartSend(DataPtr, DataSize, FALSE); DdeUnaccessData(Data); if (TalkStatus==IdTalkCB) return (HDDEDATA)DDE_FACK; @@ -1016,7 +1013,7 @@ break; case CmdDispStr: - CBStartEcho(ParamFileName, sizeof(ParamFileName)); + CBStartSend(ParamFileName, sizeof(ParamFileName), TRUE); break; case CmdLogInfo: Modified: trunk/teraterm/teraterm/vtwin.cpp =================================================================== --- trunk/teraterm/teraterm/vtwin.cpp 2016-07-11 08:53:16 UTC (rev 6439) +++ trunk/teraterm/teraterm/vtwin.cpp 2016-07-12 09:04:20 UTC (rev 6440) @@ -942,7 +942,7 @@ if (Paste) { if (CBStartPasteConfirmChange(HVTWin, FALSE)) { - CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0); + CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g if (WinOrgY != 0) { DispVScroll(SCROLL_BOTTOM, 0); @@ -4440,7 +4440,7 @@ { // add confirm (2008.2.4 yutaka) if (CBStartPasteConfirmChange(HVTWin, FALSE)) { - CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0); + CBStartPaste(HVTWin, FALSE, BracketedPasteMode()); // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g if (WinOrgY != 0) { DispVScroll(SCROLL_BOTTOM, 0); @@ -4452,7 +4452,7 @@ { // add confirm (2008.3.11 maya) if (CBStartPasteConfirmChange(HVTWin, TRUE)) { - CBStartPaste(HVTWin, TRUE, BracketedPasteMode(), 0, NULL, 0); + CBStartPaste(HVTWin, TRUE, BracketedPasteMode()); // \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g if (WinOrgY != 0) { DispVScroll(SCROLL_BOTTOM, 0); @@ -6133,7 +6133,7 @@ if (sending) { // \x92[\x96\x96\x82֕\xB6\x8E\x9A\x97\xF1\x82𑗂荞\x82\xDE // DDE\x92ʐM\x82Ɏg\x82\xA4\x8A\x94\x82ɕύX\x81B(2006.2.7 yutaka) - CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), TermWidthMax/*CBBufSize*/, buf, buflen); + CBStartSend(buf, buflen, FALSE); // \x91\x97\x90M\x83f\x81[\x83^\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͑\x97\x90M\x82\xB7\x82\xE9 if (TalkStatus == IdTalkCB) { CBSend();