From 06d3f4dcbe38f103598d5845e253d2efaf4cb6ec Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 12 Feb 2025 18:20:11 +0100 Subject: [PATCH] Fix possible race confition when adding, then removing remote config services Signed-off-by: Bob Weinand --- .circleci/continue_config.yml | 4 + Cargo.lock | 3 + Makefile | 2 +- components-rs/common.h | 171 +++++++++--------- components-rs/crashtracker.h | 102 +++++++++-- dockerfiles/ci/xfail_tests/8.1.list | 1 + dockerfiles/ci/xfail_tests/8.2.list | 1 + libdatadog | 2 +- .../agent_headers_unix_domain_socket.phpt | 2 +- .../default_unix_domain_socket_agent.phpt | 2 +- tests/ext/includes/request_replayer.inc | 43 +++-- 11 files changed, 215 insertions(+), 118 deletions(-) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index e7cd2cc2e4..c69f3ce482 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -5354,6 +5354,10 @@ workflows: - test_c_disabled - test_internal_api_randomized - test_opcache + exclude: + # apparently for no discernible reason, on PHP 8.1 valgrind thinks some extensions are loaded, but they aren't. We anyway test sasn, so good enough, I guess. + - php_major_minor: '8.1' + make_target: test_c2php - test: requires: [ 'Prepare Code' ] diff --git a/Cargo.lock b/Cargo.lock index 32efa4af9e..20329ba566 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,6 +1279,7 @@ dependencies = [ "datadog-trace-protobuf", "datadog-trace-utils", "ddcommon 0.0.1", + "ddtelemetry", "dogstatsd-client", "either", "futures", @@ -1286,6 +1287,7 @@ dependencies = [ "hyper 0.14.32", "log", "rand 0.8.5", + "regex", "rmp-serde", "serde", "serde_json", @@ -1701,6 +1703,7 @@ dependencies = [ "rmpv", "serde", "serde_json", + "tempfile", "testcontainers", "tinybytes", "tokio", diff --git a/Makefile b/Makefile index e2af9ffbfc..2886fc6b82 100644 --- a/Makefile +++ b/Makefile @@ -155,7 +155,7 @@ install_appsec: install_all: install install_ini run_tests: $(TEST_FILES) $(TEST_STUB_FILES) $(BUILD_DIR)/run-tests.php - $(ALL_TEST_ENV_OVERRIDE) $(TESTS) + $(ALL_TEST_ENV_OVERRIDE) $(RUN_TESTS_CMD) $(TESTS) test_c: $(SO_FILE) $(TEST_FILES) $(TEST_STUB_FILES) $(BUILD_DIR)/run-tests.php $(if $(ASAN), USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1 LSAN_OPTIONS=fast_unwind_on_malloc=0$${LSAN_OPTIONS:+$(,)$${LSAN_OPTIONS}}) $(ALL_TEST_ENV_OVERRIDE) $(RUN_TESTS_CMD) -d extension=$(SO_FILE) $(BUILD_DIR)/$(subst $(BUILD_DIR_NAME)/,,$(TESTS)) diff --git a/components-rs/common.h b/components-rs/common.h index a1b5ff10a5..2614f4c304 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -870,7 +870,6 @@ typedef enum ddog_crasht_BuildIdType { DDOG_CRASHT_BUILD_ID_TYPE_GNU, DDOG_CRASHT_BUILD_ID_TYPE_GO, DDOG_CRASHT_BUILD_ID_TYPE_PDB, - DDOG_CRASHT_BUILD_ID_TYPE_PE, DDOG_CRASHT_BUILD_ID_TYPE_SHA1, } ddog_crasht_BuildIdType; @@ -888,7 +887,7 @@ typedef enum ddog_crasht_ErrorKind { typedef enum ddog_crasht_FileType { DDOG_CRASHT_FILE_TYPE_APK, DDOG_CRASHT_FILE_TYPE_ELF, - DDOG_CRASHT_FILE_TYPE_PDB, + DDOG_CRASHT_FILE_TYPE_PE, } ddog_crasht_FileType; /** @@ -943,10 +942,37 @@ typedef enum ddog_crasht_SiCodes { * See https://man7.org/linux/man-pages/man7/signal.7.html */ typedef enum ddog_crasht_SignalNames { + DDOG_CRASHT_SIGNAL_NAMES_SIGHUP, + DDOG_CRASHT_SIGNAL_NAMES_SIGINT, + DDOG_CRASHT_SIGNAL_NAMES_SIGQUIT, + DDOG_CRASHT_SIGNAL_NAMES_SIGILL, + DDOG_CRASHT_SIGNAL_NAMES_SIGTRAP, DDOG_CRASHT_SIGNAL_NAMES_SIGABRT, DDOG_CRASHT_SIGNAL_NAMES_SIGBUS, + DDOG_CRASHT_SIGNAL_NAMES_SIGFPE, + DDOG_CRASHT_SIGNAL_NAMES_SIGKILL, + DDOG_CRASHT_SIGNAL_NAMES_SIGUSR1, DDOG_CRASHT_SIGNAL_NAMES_SIGSEGV, + DDOG_CRASHT_SIGNAL_NAMES_SIGUSR2, + DDOG_CRASHT_SIGNAL_NAMES_SIGPIPE, + DDOG_CRASHT_SIGNAL_NAMES_SIGALRM, + DDOG_CRASHT_SIGNAL_NAMES_SIGTERM, + DDOG_CRASHT_SIGNAL_NAMES_SIGCHLD, + DDOG_CRASHT_SIGNAL_NAMES_SIGCONT, + DDOG_CRASHT_SIGNAL_NAMES_SIGSTOP, + DDOG_CRASHT_SIGNAL_NAMES_SIGTSTP, + DDOG_CRASHT_SIGNAL_NAMES_SIGTTIN, + DDOG_CRASHT_SIGNAL_NAMES_SIGTTOU, + DDOG_CRASHT_SIGNAL_NAMES_SIGURG, + DDOG_CRASHT_SIGNAL_NAMES_SIGXCPU, + DDOG_CRASHT_SIGNAL_NAMES_SIGXFSZ, + DDOG_CRASHT_SIGNAL_NAMES_SIGVTALRM, + DDOG_CRASHT_SIGNAL_NAMES_SIGPROF, + DDOG_CRASHT_SIGNAL_NAMES_SIGWINCH, + DDOG_CRASHT_SIGNAL_NAMES_SIGIO, DDOG_CRASHT_SIGNAL_NAMES_SIGSYS, + DDOG_CRASHT_SIGNAL_NAMES_SIGEMT, + DDOG_CRASHT_SIGNAL_NAMES_SIGINFO, DDOG_CRASHT_SIGNAL_NAMES_UNKNOWN, } ddog_crasht_SignalNames; @@ -1014,6 +1040,20 @@ typedef struct ddog_crasht_Slice_CharSlice { uintptr_t len; } ddog_crasht_Slice_CharSlice; +typedef struct ddog_crasht_Slice_I32 { + /** + * Should be non-null and suitably aligned for the underlying type. It is + * allowed but not recommended for the pointer to be null when the len is + * zero. + */ + const int32_t *ptr; + /** + * The number of elements (not bytes) that `.ptr` points to. Must be less + * than or equal to [isize::MAX]. + */ + uintptr_t len; +} ddog_crasht_Slice_I32; + typedef struct ddog_crasht_Config { struct ddog_crasht_Slice_CharSlice additional_files; bool create_alt_stack; @@ -1024,6 +1064,11 @@ typedef struct ddog_crasht_Config { */ const struct ddog_Endpoint *endpoint; enum ddog_crasht_StacktraceCollection resolve_frames; + /** + * The set of signals we should be registered for. + * If empty, use the default set. + */ + struct ddog_crasht_Slice_I32 signals; /** * Timeout in milliseconds before the signal handler starts tearing things down to return. * This is given as a uint32_t, but the actual timeout needs to fit inside of an i32 (max @@ -1079,6 +1124,20 @@ typedef struct ddog_crasht_Metadata { const struct ddog_Vec_Tag *tags; } ddog_crasht_Metadata; +typedef struct ddog_crasht_Slice_CInt { + /** + * Should be non-null and suitably aligned for the underlying type. It is + * allowed but not recommended for the pointer to be null when the len is + * zero. + */ + const int *ptr; + /** + * The number of elements (not bytes) that `.ptr` points to. Must be less + * than or equal to [isize::MAX]. + */ + uintptr_t len; +} ddog_crasht_Slice_CInt; + /** * A generic result type for when an operation may fail, * or may return in case of success. @@ -1116,38 +1175,13 @@ typedef struct ddog_crasht_Handle_CrashInfoBuilder { struct ddog_crasht_CrashInfoBuilder *inner; } ddog_crasht_Handle_CrashInfoBuilder; -/** - * A generic result type for when an operation may fail, - * or may return in case of success. - */ -typedef enum ddog_crasht_Result_HandleCrashInfoBuilder_Tag { - DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_BUILDER_OK_HANDLE_CRASH_INFO_BUILDER, - DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_BUILDER_ERR_HANDLE_CRASH_INFO_BUILDER, -} ddog_crasht_Result_HandleCrashInfoBuilder_Tag; - -typedef struct ddog_crasht_Result_HandleCrashInfoBuilder { - ddog_crasht_Result_HandleCrashInfoBuilder_Tag tag; - union { - struct { - struct ddog_crasht_Handle_CrashInfoBuilder ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_Result_HandleCrashInfoBuilder; - -/** - * A generic result type for when an operation may fail, - * or may return in case of success. - */ -typedef enum ddog_crasht_Result_HandleCrashInfo_Tag { - DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_OK_HANDLE_CRASH_INFO, - DDOG_CRASHT_RESULT_HANDLE_CRASH_INFO_ERR_HANDLE_CRASH_INFO, -} ddog_crasht_Result_HandleCrashInfo_Tag; +typedef enum ddog_crasht_CrashInfo_NewResult_Tag { + DDOG_CRASHT_CRASH_INFO_NEW_RESULT_OK, + DDOG_CRASHT_CRASH_INFO_NEW_RESULT_ERR, +} ddog_crasht_CrashInfo_NewResult_Tag; -typedef struct ddog_crasht_Result_HandleCrashInfo { - ddog_crasht_Result_HandleCrashInfo_Tag tag; +typedef struct ddog_crasht_CrashInfo_NewResult { + ddog_crasht_CrashInfo_NewResult_Tag tag; union { struct { struct ddog_crasht_Handle_CrashInfo ok; @@ -1156,7 +1190,7 @@ typedef struct ddog_crasht_Result_HandleCrashInfo { struct ddog_Error err; }; }; -} ddog_crasht_Result_HandleCrashInfo; +} ddog_crasht_CrashInfo_NewResult; typedef struct ddog_crasht_OsInfo { ddog_CharSlice architecture; @@ -1213,17 +1247,13 @@ typedef struct ddog_crasht_Handle_StackFrame { struct ddog_crasht_StackFrame *inner; } ddog_crasht_Handle_StackFrame; -/** - * A generic result type for when an operation may fail, - * or may return in case of success. - */ -typedef enum ddog_crasht_Result_HandleStackFrame_Tag { - DDOG_CRASHT_RESULT_HANDLE_STACK_FRAME_OK_HANDLE_STACK_FRAME, - DDOG_CRASHT_RESULT_HANDLE_STACK_FRAME_ERR_HANDLE_STACK_FRAME, -} ddog_crasht_Result_HandleStackFrame_Tag; +typedef enum ddog_crasht_StackFrame_NewResult_Tag { + DDOG_CRASHT_STACK_FRAME_NEW_RESULT_OK, + DDOG_CRASHT_STACK_FRAME_NEW_RESULT_ERR, +} ddog_crasht_StackFrame_NewResult_Tag; -typedef struct ddog_crasht_Result_HandleStackFrame { - ddog_crasht_Result_HandleStackFrame_Tag tag; +typedef struct ddog_crasht_StackFrame_NewResult { + ddog_crasht_StackFrame_NewResult_Tag tag; union { struct { struct ddog_crasht_Handle_StackFrame ok; @@ -1232,59 +1262,24 @@ typedef struct ddog_crasht_Result_HandleStackFrame { struct ddog_Error err; }; }; -} ddog_crasht_Result_HandleStackFrame; +} ddog_crasht_StackFrame_NewResult; -/** - * A generic result type for when an operation may fail, - * or may return in case of success. - */ -typedef enum ddog_crasht_Result_HandleStackTrace_Tag { - DDOG_CRASHT_RESULT_HANDLE_STACK_TRACE_OK_HANDLE_STACK_TRACE, - DDOG_CRASHT_RESULT_HANDLE_STACK_TRACE_ERR_HANDLE_STACK_TRACE, -} ddog_crasht_Result_HandleStackTrace_Tag; - -typedef struct ddog_crasht_Result_HandleStackTrace { - ddog_crasht_Result_HandleStackTrace_Tag tag; - union { - struct { - struct ddog_crasht_Handle_StackTrace ok; - }; - struct { - struct ddog_Error err; - }; - }; -} ddog_crasht_Result_HandleStackTrace; - -/** - * A wrapper for returning owned strings from FFI - */ -typedef struct ddog_crasht_StringWrapper { - /** - * This is a String stuffed into the vec. - */ - struct ddog_Vec_U8 message; -} ddog_crasht_StringWrapper; - -/** - * A generic result type for when an operation may fail, - * or may return in case of success. - */ -typedef enum ddog_crasht_Result_StringWrapper_Tag { - DDOG_CRASHT_RESULT_STRING_WRAPPER_OK_STRING_WRAPPER, - DDOG_CRASHT_RESULT_STRING_WRAPPER_ERR_STRING_WRAPPER, -} ddog_crasht_Result_StringWrapper_Tag; +typedef enum ddog_StringWrapperResult_Tag { + DDOG_STRING_WRAPPER_RESULT_OK, + DDOG_STRING_WRAPPER_RESULT_ERR, +} ddog_StringWrapperResult_Tag; -typedef struct ddog_crasht_Result_StringWrapper { - ddog_crasht_Result_StringWrapper_Tag tag; +typedef struct ddog_StringWrapperResult { + ddog_StringWrapperResult_Tag tag; union { struct { - struct ddog_crasht_StringWrapper ok; + struct ddog_StringWrapper ok; }; struct { struct ddog_Error err; }; }; -} ddog_crasht_Result_StringWrapper; +} ddog_StringWrapperResult; #ifdef __cplusplus extern "C" { diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 6aa1e6a9a2..f2c0d661c3 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -12,6 +12,40 @@ #include #include "common.h" +typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, + DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, +} ddog_crasht_CrashInfoBuilder_NewResult_Tag; + +typedef struct ddog_crasht_CrashInfoBuilder_NewResult { + ddog_crasht_CrashInfoBuilder_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_CrashInfoBuilder ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_CrashInfoBuilder_NewResult; + +typedef enum ddog_crasht_StackTrace_NewResult_Tag { + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_OK, + DDOG_CRASHT_STACK_TRACE_NEW_RESULT_ERR, +} ddog_crasht_StackTrace_NewResult_Tag; + +typedef struct ddog_crasht_StackTrace_NewResult { + ddog_crasht_StackTrace_NewResult_Tag tag; + union { + struct { + struct ddog_crasht_Handle_StackTrace ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_crasht_StackTrace_NewResult; + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -92,6 +126,52 @@ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_init_without_receiver(struct ddog_crasht_Config config, struct ddog_crasht_Metadata metadata); +/** + * Returns a list of signals suitable for use in a crashtracker config. + */ +struct ddog_crasht_Slice_CInt ddog_crasht_default_signals(void); + +/** + * Removes all existing additional tags + * Expected to be used after a fork, to reset the additional tags on the child + * ATOMICITY: + * This is NOT ATOMIC. + * Should only be used when no conflicting updates can occur, + * e.g. after a fork but before profiling ops start on the child. + * # Safety + * No safety concerns. + */ +DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_clear_additional_tags(void); + +/** + * Atomically registers a string as an additional tag. + * Useful for tracking what operations were occurring when a crash occurred. + * The set does not check for duplicates. + * + * Returns: + * Ok(handle) on success. The handle is needed to later remove the id; + * Err() on failure. The most likely cause of failure is that the underlying set is full. + * + * # Safety + * The string argument must be valid. + */ +DDOG_CHECK_RETURN +struct ddog_crasht_Result_Usize ddog_crasht_insert_additional_tag(ddog_CharSlice s); + +/** + * Atomically removes a completed SpanId. + * Useful for tracking what operations were occurring when a crash occurred. + * 0 is reserved for "NoId" + * + * Returns: + * `Ok` on success. + * `Err` on failure. + * + * # Safety + * No safety concerns. + */ +DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_remove_additional_tag(uintptr_t idx); + /** * Resets all counters to 0. * Expected to be used after a fork, to reset the counters on the child @@ -291,7 +371,7 @@ struct ddog_VoidResult ddog_crasht_CrashInfo_upload_to_endpoint(struct ddog_cras * No safety issues. */ DDOG_CHECK_RETURN -struct ddog_crasht_Result_HandleCrashInfoBuilder ddog_crasht_CrashInfoBuilder_new(void); +struct ddog_crasht_CrashInfoBuilder_NewResult ddog_crasht_CrashInfoBuilder_new(void); /** * # Safety @@ -306,7 +386,7 @@ void ddog_crasht_CrashInfoBuilder_drop(struct ddog_crasht_Handle_CrashInfoBuilde * which has not previously been dropped. */ DDOG_CHECK_RETURN -struct ddog_crasht_Result_HandleCrashInfo ddog_crasht_CrashInfoBuilder_build(struct ddog_crasht_Handle_CrashInfoBuilder *builder); +struct ddog_crasht_CrashInfo_NewResult ddog_crasht_CrashInfoBuilder_build(struct ddog_crasht_Handle_CrashInfoBuilder *builder); /** * # Safety @@ -515,7 +595,7 @@ struct ddog_VoidResult ddog_crasht_CrashInfoBuilder_with_uuid_random(struct ddog * # Safety * No safety issues. */ -DDOG_CHECK_RETURN struct ddog_crasht_Result_HandleStackFrame ddog_crasht_StackFrame_new(void); +DDOG_CHECK_RETURN struct ddog_crasht_StackFrame_NewResult ddog_crasht_StackFrame_new(void); /** * # Safety @@ -532,7 +612,7 @@ void ddog_crasht_StackFrame_drop(struct ddog_crasht_Handle_StackFrame *frame); */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_StackFrame_with_ip(struct ddog_crasht_Handle_StackFrame *frame, - ddog_CharSlice ip); + uintptr_t ip); /** * # Safety @@ -542,7 +622,7 @@ struct ddog_VoidResult ddog_crasht_StackFrame_with_ip(struct ddog_crasht_Handle_ */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_StackFrame_with_module_base_address(struct ddog_crasht_Handle_StackFrame *frame, - ddog_CharSlice module_base_address); + uintptr_t module_base_address); /** * # Safety @@ -552,7 +632,7 @@ struct ddog_VoidResult ddog_crasht_StackFrame_with_module_base_address(struct dd */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_StackFrame_with_sp(struct ddog_crasht_Handle_StackFrame *frame, - ddog_CharSlice sp); + uintptr_t sp); /** * # Safety @@ -562,7 +642,7 @@ struct ddog_VoidResult ddog_crasht_StackFrame_with_sp(struct ddog_crasht_Handle_ */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_StackFrame_with_symbol_address(struct ddog_crasht_Handle_StackFrame *frame, - ddog_CharSlice symbol_address); + uintptr_t symbol_address); /** * # Safety @@ -612,7 +692,7 @@ struct ddog_VoidResult ddog_crasht_StackFrame_with_path(struct ddog_crasht_Handl */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_StackFrame_with_relative_address(struct ddog_crasht_Handle_StackFrame *frame, - ddog_CharSlice relative_address); + uintptr_t relative_address); /** * # Safety @@ -657,7 +737,7 @@ struct ddog_VoidResult ddog_crasht_StackFrame_with_line(struct ddog_crasht_Handl * # Safety * No safety issues. */ -DDOG_CHECK_RETURN struct ddog_crasht_Result_HandleStackTrace ddog_crasht_StackTrace_new(void); +DDOG_CHECK_RETURN struct ddog_crasht_StackTrace_NewResult ddog_crasht_StackTrace_new(void); /** * # Safety @@ -696,8 +776,8 @@ struct ddog_VoidResult ddog_crasht_StackTrace_set_complete(struct ddog_crasht_Ha * The string is copied into the result, and does not need to outlive this call */ DDOG_CHECK_RETURN -struct ddog_crasht_Result_StringWrapper ddog_crasht_demangle(ddog_CharSlice name, - enum ddog_crasht_DemangleOptions options); +struct ddog_StringWrapperResult ddog_crasht_demangle(ddog_CharSlice name, + enum ddog_crasht_DemangleOptions options); /** * Receives data from a crash collector via a pipe on `stdin`, formats it into diff --git a/dockerfiles/ci/xfail_tests/8.1.list b/dockerfiles/ci/xfail_tests/8.1.list index 2015e626a7..ffc0693a5d 100644 --- a/dockerfiles/ci/xfail_tests/8.1.list +++ b/dockerfiles/ci/xfail_tests/8.1.list @@ -51,6 +51,7 @@ ext/json/tests/json_encode_exceptions.phpt ext/mbstring/tests/zend_multibyte-01.phpt ext/mbstring/tests/zend_multibyte-02.phpt ext/mbstring/tests/zend_multibyte-06.phpt +ext/mysqli/tests/ghsa-h35g-vwh6-m678-stmt-row-double.phpt ext/openssl/tests/bug46127.phpt ext/openssl/tests/bug48182.phpt ext/openssl/tests/bug54992.phpt diff --git a/dockerfiles/ci/xfail_tests/8.2.list b/dockerfiles/ci/xfail_tests/8.2.list index 90cb979663..f588fd51d8 100644 --- a/dockerfiles/ci/xfail_tests/8.2.list +++ b/dockerfiles/ci/xfail_tests/8.2.list @@ -52,6 +52,7 @@ ext/json/tests/json_encode_exceptions.phpt ext/mbstring/tests/zend_multibyte-01.phpt ext/mbstring/tests/zend_multibyte-02.phpt ext/mbstring/tests/zend_multibyte-06.phpt +ext/mysqli/tests/ghsa-h35g-vwh6-m678-stmt-row-double.phpt ext/openssl/tests/bug46127.phpt ext/openssl/tests/bug48182.phpt ext/openssl/tests/bug54992.phpt diff --git a/libdatadog b/libdatadog index 8823f6a691..7a481f89ed 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 8823f6a6917a066ce8b9ae7a942022295a24b597 +Subproject commit 7a481f89ed9a2d0ba473f4e946a3e68d6c8d3a97 diff --git a/tests/ext/background-sender/agent_headers_unix_domain_socket.phpt b/tests/ext/background-sender/agent_headers_unix_domain_socket.phpt index 0dc5715bf3..1293e47be7 100644 --- a/tests/ext/background-sender/agent_headers_unix_domain_socket.phpt +++ b/tests/ext/background-sender/agent_headers_unix_domain_socket.phpt @@ -20,7 +20,7 @@ include __DIR__ . '/../includes/request_replayer.inc'; $rr = new RequestReplayer(); $rr->replayRequest(); // clear -RequestReplayer::launchUnixProxy(str_replace("unix://", "", getenv("DD_TRACE_AGENT_URL"))); +$proxy = RequestReplayer::launchUnixProxy(str_replace("unix://", "", getenv("DD_TRACE_AGENT_URL"))); \DDTrace\start_span(); \DDTrace\close_span(); diff --git a/tests/ext/background-sender/default_unix_domain_socket_agent.phpt b/tests/ext/background-sender/default_unix_domain_socket_agent.phpt index 397ca8d519..2a73a7fb5d 100644 --- a/tests/ext/background-sender/default_unix_domain_socket_agent.phpt +++ b/tests/ext/background-sender/default_unix_domain_socket_agent.phpt @@ -16,7 +16,7 @@ if (file_exists("/var/run/datadog/apm.socket")) { unlink("/var/run/datadog/apm.socket"); } -RequestReplayer::launchUnixProxy("/var/run/datadog/apm.socket"); +$proxy = RequestReplayer::launchUnixProxy("/var/run/datadog/apm.socket"); $logs = dd_get_startup_logs([], ['DD_TRACE_LOG_LEVEL' => 'error,startup=info']); diff --git a/tests/ext/includes/request_replayer.inc b/tests/ext/includes/request_replayer.inc index e6ba72c3f1..f5981404ba 100644 --- a/tests/ext/includes/request_replayer.inc +++ b/tests/ext/includes/request_replayer.inc @@ -2,6 +2,17 @@ include __DIR__ . '/dummy_filesystem_integration.inc'; //This file uses wrapped function file_get_contents +class ProxyContainer { + public $proc; + public function __construct($proc) { + $this->proc = $proc; + } + + public function __destruct() { + proc_terminate($this->proc, 9); + } +} + class RequestReplayer { /** @@ -130,24 +141,26 @@ class RequestReplayer ignore_user_abort(true); /* prevent bailout... */ $server = stream_socket_server("unix://' . $socketPath . '"); print "1\n"; /* ready marker */ -if (!$client = stream_socket_accept($server, 5)) { - return; -} -$replayer = stream_socket_client("request-replayer:80"); -$all = $read = [$client, $replayer]; -foreach ($read as $fp) stream_set_blocking($fp, false); -while (stream_select($read, $w, $e, null)) { - $data = fread($fp = reset($read), 4096); - if ($data == "") { - return; +while ($client = stream_socket_accept($server, 5)) { + file_put_contents("/tmp/unix-proxy-' . basename($socketPath) . '", "connected\n", FILE_APPEND); + $replayer = stream_socket_client("request-replayer:80"); + $all = $read = [$client, $replayer]; + foreach ($read as $fp) stream_set_blocking($fp, false); + while (stream_select($read, $w, $e, null)) { + $data = fread($fp = reset($read), 4096); + if ($data == "") { + file_put_contents("/tmp/unix-proxy-' . basename($socketPath) . '", "end\n", FILE_APPEND); + break; + } + file_put_contents("/tmp/unix-proxy-' . basename($socketPath) . '", "$data\n", FILE_APPEND); + fwrite($fp == $replayer ? $client : $replayer, $data); + $read = $all; } - fwrite($fp == $replayer ? $client : $replayer, $data); - $read = $all; } '); - static $unix_proxy_process_reference; - $unix_proxy_process_reference = popen(PHP_BINARY . " -r '$code'", 'r'); - fread($unix_proxy_process_reference, 1); // ready + $proc = proc_open(PHP_BINARY . " -r '$code'", [STDIN, ["pipe", "w"], STDERR], $pipes); + fread($pipes[1], 1); // ready + return new ProxyContainer($proc); } }