From daa0a79317f3bc9d3be24d5c576011d274894390 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Sun, 26 Jul 2009 20:50:47 +0800 Subject: [PATCH] Basic Fixed issue #122: Garbage text in "Git Command Progress" / suspected buffer overflow. But speed is too slow Signed-off-by: Frank Li --- src/TortoiseProc/ProgressDlg.cpp | 39 ++++++++++++++++++++++++++++++++++----- src/TortoiseProc/ProgressDlg.h | 4 +++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/TortoiseProc/ProgressDlg.cpp b/src/TortoiseProc/ProgressDlg.cpp index af71e5b41..66909cab2 100644 --- a/src/TortoiseProc/ProgressDlg.cpp +++ b/src/TortoiseProc/ProgressDlg.cpp @@ -92,7 +92,7 @@ UINT CProgressDlg::ProgressThreadEntry(LPVOID pVoid) } //static function, Share with SyncDialog -UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort) +UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort,std::vector*pdata) { UINT ret=0; @@ -101,6 +101,9 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bSho pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_START,0); + if(pdata) + pdata->clear(); + for(int i=0;i &cmdlist,bool bSho CString str; str+= cmdlist[i]+_T("\n\n"); for(int j=0;jPostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]); + { + if(pdata) + pdata->push_back(str[j]); + else + pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]); + } + if(pdata) + pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0); } g_Git.RunAsync(cmdlist[i],&pi, &hRead,pfilename); @@ -122,7 +132,15 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bSho while(ReadFile(hRead,buffer,1,&readnumber,NULL)) { buffer[readnumber]=0; - pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,(TCHAR)buffer[0]); + + if(pdata) + { + pdata->push_back((TCHAR)buffer[0]); + + if(buffer[0] == '\r' || buffer[0] == '\n') + pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0); + }else + pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,buffer[0]); } CloseHandle(pi.hThread); @@ -164,7 +182,7 @@ UINT CProgressDlg::ProgressThread() else pfilename=&m_LogFile; - m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort);; + m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort,&this->m_Databuf);; return 0; } @@ -172,11 +190,15 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { + m_BufStart = 0 ; m_Animate.Play(0,-1,-1); this->DialogEnableWindow(IDOK,FALSE); } if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED) { + m_BufStart=0; + this->m_Databuf.clear(); + m_bDone = true; m_Animate.Stop(); m_Progress.SetPos(100); @@ -202,7 +224,14 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) DialogEnableWindow(IDCANCEL, FALSE); } - if(lParam != 0) + if(lParam == 0) + { + for(int i=this->m_BufStart;im_Databuf.size();i++) + { + ParserCmdOutput(this->m_Databuf[m_BufStart]); + m_BufStart++; + } + }else ParserCmdOutput((TCHAR)lParam); return 0; diff --git a/src/TortoiseProc/ProgressDlg.h b/src/TortoiseProc/ProgressDlg.h index b5f7dc77c..eb8e42332 100644 --- a/src/TortoiseProc/ProgressDlg.h +++ b/src/TortoiseProc/ProgressDlg.h @@ -55,13 +55,15 @@ protected: void OnCancel(); + std::vector m_Databuf; + int m_BufStart; DECLARE_MESSAGE_MAP() public: //Share with Sync Dailog static int FindPercentage(CString &log); - static UINT RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort); + static UINT RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort,std::vector *pdata=NULL); afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedButton1(); -- 2.11.4.GIT