https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ff63ef3c55b82796008453d049bc50df80b4c4a6

commit ff63ef3c55b82796008453d049bc50df80b4c4a6
Author:     Thomas Faber <[email protected]>
AuthorDate: Sun Aug 5 12:57:25 2018 +0200
Commit:     Thomas Faber <[email protected]>
CommitDate: Sun Aug 5 12:58:35 2018 +0200

    [MSCONFIG] Fix buffer overflow when handling long service command lines.
---
 base/applications/msconfig/srvpage.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/base/applications/msconfig/srvpage.c 
b/base/applications/msconfig/srvpage.c
index 4acdf2523e..044a512bab 100644
--- a/base/applications/msconfig/srvpage.c
+++ b/base/applications/msconfig/srvpage.c
@@ -233,14 +233,23 @@ GetServices ( void )
                         }
                     }
 
-                    memset(&FileName, 0, MAX_PATH);
-                    if (_tcscspn(pServiceConfig->lpBinaryPathName, _T("\"")))
+                    if (pServiceConfig->lpBinaryPathName[0] != _T('"'))
                     {
-                        _tcsncpy(FileName, pServiceConfig->lpBinaryPathName, 
_tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")) );
+                        /* Assume everything before the first space is the 
binary path */
+                        /* FIXME: This is a reasonable heuristic but some
+                         *        services use unquoted paths with spaces */
+                        StringCchCopyN(FileName,
+                                       _countof(FileName),
+                                       pServiceConfig->lpBinaryPathName,
+                                       
_tcscspn(pServiceConfig->lpBinaryPathName, _T(" ")));
                     }
                     else
                     {
-                        _tcscpy(FileName, pServiceConfig->lpBinaryPathName);
+                        /* Binary path is inside the quotes */
+                        StringCchCopyN(FileName,
+                                       _countof(FileName),
+                                       pServiceConfig->lpBinaryPathName + 1,
+                                       
_tcscspn(pServiceConfig->lpBinaryPathName + 1, _T("\"")));
                     }
 
                     HeapFree(GetProcessHeap(), 0, pServiceConfig);

Reply via email to