OSDN Git Service

Fixed issue #122: Garbage text in "Git Command Progress" / suspected buffer overflow
authorFrank Li <lznuaa@gmail.com>
Sun, 26 Jul 2009 13:36:15 +0000 (21:36 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 26 Jul 2009 13:36:15 +0000 (21:36 +0800)
Improve commit speed when many added files.

Signed-off-by: Frank Li <lznuaa@gmail.com>
src/TortoiseProc/CommitDlg.cpp
src/TortoiseProc/ProgressDlg.cpp
src/TortoiseProc/ProgressDlg.h

index 97bb3b8..68e48c4 100644 (file)
@@ -509,6 +509,7 @@ void CCommitDlg::OnOK()
                cmd.Format(_T("git.exe commit %s -F \"%s\""),amend, tempfile);\r
                \r
                CProgressDlg progress;\r
+               progress.m_bBufferAll=true; // improve show speed when there are many file added. \r
                progress.m_GitCmd=cmd;\r
                progress.m_bShowCommand = FALSE;        // don't show the commit command\r
                progress.m_PreText = out;                       // show any output already generated in log window\r
index 66909ca..3d98d3c 100644 (file)
@@ -15,6 +15,7 @@ CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)
 {\r
        m_pThread = NULL;\r
        m_bAltAbortPress=false;\r
+       m_bBufferAll=false;\r
 }\r
 \r
 CProgressDlg::~CProgressDlg()\r
@@ -196,6 +197,12 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
        }\r
        if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
        {\r
+               if(m_bBufferAll)\r
+               {\r
+                       m_Databuf.push_back(0);\r
+                       InsertCRLF();\r
+                       m_Log.SetWindowText(&m_Databuf[0]);\r
+               }\r
                m_BufStart=0;\r
                this->m_Databuf.clear();\r
 \r
@@ -224,16 +231,18 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
                        DialogEnableWindow(IDCANCEL, FALSE);\r
        }\r
 \r
-       if(lParam == 0)\r
+       if(!m_bBufferAll)\r
        {\r
-               for(int i=this->m_BufStart;i<this->m_Databuf.size();i++)\r
+               if(lParam == 0)\r
                {\r
-                       ParserCmdOutput(this->m_Databuf[m_BufStart]);\r
-                       m_BufStart++;\r
-               }\r
-       }else\r
-               ParserCmdOutput((TCHAR)lParam);\r
-\r
+                       for(int i=this->m_BufStart;i<this->m_Databuf.size();i++)\r
+                       {\r
+                               ParserCmdOutput(this->m_Databuf[m_BufStart]);\r
+                               m_BufStart++;\r
+                       }\r
+               }else\r
+                       ParserCmdOutput((TCHAR)lParam);\r
+       }\r
        return 0;\r
 }\r
 \r
@@ -325,3 +334,18 @@ void CProgressDlg::OnCancel()
        \r
        m_bAbort = true;\r
 }\r
+\r
+void CProgressDlg::InsertCRLF()\r
+{\r
+       for(int i=0;i<m_Databuf.size();i++)\r
+       {\r
+               if(m_Databuf[i]==_T('\n'))\r
+               {\r
+                       if(i==0 || m_Databuf[i-1]!= _T('\r'))\r
+                       {\r
+                               m_Databuf.insert(m_Databuf.begin()+i,_T('\r'));\r
+                               i++;\r
+                       }\r
+               }\r
+       }\r
+}
\ No newline at end of file
index eb8e423..4941958 100644 (file)
@@ -42,6 +42,7 @@ public:
        bool                    m_bAbort;\r
        bool                    m_bDone;\r
        bool                    m_bAltAbortPress;\r
+       bool                    m_bBufferAll;   // Buffer All to improve speed when there are many file add at commit \r
 protected:\r
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
        static UINT ProgressThreadEntry(LPVOID pVoid);\r
@@ -58,6 +59,8 @@ protected:
        std::vector<TCHAR> m_Databuf;\r
        int                     m_BufStart;\r
        \r
+       void InsertCRLF(); //Insert \r before \n\r
+\r
        DECLARE_MESSAGE_MAP()\r
 public:\r
 \r