From 7179ea0d6f33a7891a204451b629bb60236306ff Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 7 Oct 2025 21:52:40 +0200 Subject: [PATCH 1/3] fixed crash on buddy start on windows; fixed #3801 --- src/searchdbuddy.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/searchdbuddy.cpp b/src/searchdbuddy.cpp index 23d27b05e5..da9c1a88c8 100644 --- a/src/searchdbuddy.cpp +++ b/src/searchdbuddy.cpp @@ -86,7 +86,7 @@ static CSphString g_sBuddyBind = ""; #endif #if _WIN32 -struct BuddyWindow_t : boost::process::detail::handler_base +struct BuddyWindow_t : boost::process::detail::handler_base, boost::process::detail::uses_handles { // this function will be invoked at child process constructor before spawning process template @@ -94,6 +94,18 @@ struct BuddyWindow_t : boost::process::detail::handler_base { e.creation_flags = boost::winapi::CREATE_NEW_CONSOLE_; } + + std::vector get_used_handles() const + { + std::vector dHandles; + HANDLE hOut = ::GetStdHandle ( STD_OUTPUT_HANDLE ); + HANDLE hErr = ::GetStdHandle ( STD_ERROR_HANDLE ); + if ( hOut && hOut!=INVALID_HANDLE_VALUE ) + dHandles.push_back ( hOut ); + if ( hErr && hErr!=INVALID_HANDLE_VALUE && hErr!=hOut ) + dHandles.push_back ( hErr ); + return dHandles; + } }; #endif From fe2cd3c6da78f299ad0ed3f59367b62dd415fe30 Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 7 Oct 2025 22:39:13 +0200 Subject: [PATCH 2/3] switch to boost handles for terminal window --- src/searchdbuddy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/searchdbuddy.cpp b/src/searchdbuddy.cpp index da9c1a88c8..bb9b7ef0c3 100644 --- a/src/searchdbuddy.cpp +++ b/src/searchdbuddy.cpp @@ -95,7 +95,7 @@ struct BuddyWindow_t : boost::process::detail::handler_base, boost::process::det e.creation_flags = boost::winapi::CREATE_NEW_CONSOLE_; } - std::vector get_used_handles() const + std::vector get_used_handles() const { std::vector dHandles; HANDLE hOut = ::GetStdHandle ( STD_OUTPUT_HANDLE ); From 5fc5feeee7090796a273aecaef3a124e1a7a852a Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 7 Oct 2025 23:10:56 +0200 Subject: [PATCH 3/3] try local object for pipe redirection --- src/searchdbuddy.cpp | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/searchdbuddy.cpp b/src/searchdbuddy.cpp index bb9b7ef0c3..29f0e89ff3 100644 --- a/src/searchdbuddy.cpp +++ b/src/searchdbuddy.cpp @@ -86,7 +86,7 @@ static CSphString g_sBuddyBind = ""; #endif #if _WIN32 -struct BuddyWindow_t : boost::process::detail::handler_base, boost::process::detail::uses_handles +struct BuddyWindow_t : boost::process::detail::handler_base { // this function will be invoked at child process constructor before spawning process template @@ -94,18 +94,6 @@ struct BuddyWindow_t : boost::process::detail::handler_base, boost::process::det { e.creation_flags = boost::winapi::CREATE_NEW_CONSOLE_; } - - std::vector get_used_handles() const - { - std::vector dHandles; - HANDLE hOut = ::GetStdHandle ( STD_OUTPUT_HANDLE ); - HANDLE hErr = ::GetStdHandle ( STD_ERROR_HANDLE ); - if ( hOut && hOut!=INVALID_HANDLE_VALUE ) - dHandles.push_back ( hOut ); - if ( hErr && hErr!=INVALID_HANDLE_VALUE && hErr!=hOut ) - dHandles.push_back ( hErr ); - return dHandles; - } }; #endif @@ -389,7 +377,8 @@ BuddyState_e TryToStart ( const char * sArgs, CSphString & sError ) #if _WIN32 BuddyWindow_t tWnd; - pBuddy.reset ( new boost::process::child ( sCmd, ( boost::process::std_out & boost::process::std_err ) > *g_pPipe, tWnd, boost::process::limit_handles, boost::process::error ( tErrorCode ) ) ); + auto tPipeRedirect = ( boost::process::std_out & boost::process::std_err ) > *g_pPipe; + pBuddy.reset ( new boost::process::child ( sCmd, tPipeRedirect, tWnd, boost::process::limit_handles, boost::process::error ( tErrorCode ) ) ); #else PreservedStd_t tPreserveStd; pBuddy.reset ( new boost::process::child ( sCmd, ( boost::process::std_out & boost::process::std_err ) > *g_pPipe, boost::process::limit_handles, boost::process::error ( tErrorCode ) , tPreserveStd ) );