Skip to content

Commit b3c078a

Browse files
authored
Fix crash when the loader is loaded multiple times (#2954)
1 parent 02fe693 commit b3c078a

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

loader/dd_library_loader.c

+11-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ static unsigned int php_api_no = 0;
2323
static const char *runtime_version = "unknown";
2424
static bool injection_forced = false;
2525

26+
static bool already_done = false;
27+
2628
#if defined(__MUSL__)
2729
# define OS_PATH "linux-musl/"
2830
#else
@@ -554,6 +556,7 @@ static int ddloader_load_extension(unsigned int php_api_no, char *module_build_i
554556
config->module_number = module_entry->module_number;
555557
config->version = (char *)module_entry->version;
556558

559+
LOG(INFO, "Extension '%s' loaded", config->ext_name);
557560
goto ok;
558561

559562
abort_and_unload:
@@ -617,6 +620,11 @@ static int ddloader_api_no_check(int api_no) {
617620
return SUCCESS;
618621
}
619622

623+
if (already_done) {
624+
LOG(WARN, "dd_library_loader has been loaded multiple times, aborting");
625+
return SUCCESS;
626+
}
627+
620628
ddloader_configure();
621629

622630
switch (api_no) {
@@ -687,10 +695,12 @@ static int ddloader_api_no_check(int api_no) {
687695

688696
static int ddloader_build_id_check(const char *build_id) {
689697
// Guardrail
690-
if (!ddloader_libc_check() || !php_api_no) {
698+
if (!ddloader_libc_check() || !php_api_no || already_done) {
691699
return SUCCESS;
692700
}
693701

702+
already_done = true;
703+
694704
bool is_zts = (strstr(build_id, "NTS") == NULL);
695705
bool is_debug = (strstr(build_id, "debug") != NULL);
696706

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
require_once __DIR__."/includes/autoload.php";
4+
skip_if_php5();
5+
6+
$output = runCLI('-dzend_extension='.getLoaderAbsolutePath().' '.__DIR__.'/fixtures/ddtrace.php', true, ['DD_TRACE_DEBUG=1']);
7+
8+
// PHP warning
9+
assertContains($output, 'Cannot load dd_library_loader');
10+
// dd_library_loader warning
11+
assertContains($output, 'dd_library_loader has been loaded multiple times, aborting');

0 commit comments

Comments
 (0)