Skip to content

Commit 062fc61

Browse files
authored
Merge pull request #2000 from skaut/autoload-leak-fix
Fixed leaking classes in autoloader
2 parents b690fa8 + 6c89cd0 commit 062fc61

File tree

5 files changed

+61
-31
lines changed

5 files changed

+61
-31
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"config": {
3737
"allow-plugins": {
3838
"dealerdirect/phpcodesniffer-composer-installer": true
39-
}
39+
},
40+
"classmap-authoritative": true
4041
},
4142
"require": {
4243
"php": "^5.6 || ^7.0 || ^8.0",

gulpfile.js

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/* eslint-env node */
22

3+
import { Transform } from 'node:stream';
4+
35
import gulp from 'gulp';
46
import cleanCSS from 'gulp-clean-css';
57
import inject from 'gulp-inject-string';
68
import rename from 'gulp-rename';
79
import replace from 'gulp-replace';
810
import shell from 'gulp-shell';
9-
import merge from 'merge-stream';
1011
import named from 'vinyl-named';
1112
import webpack from 'webpack-stream';
1213

@@ -32,39 +33,63 @@ gulp.task('build:css', gulp.parallel('build:css:admin', 'build:css:frontend'));
3233

3334
gulp.task(
3435
'build:deps:composer:scoper',
35-
shell.task('vendor/bin/php-scoper add-prefix --force')
36+
gulp.series(shell.task('vendor/bin/php-scoper add-prefix --force'), () =>
37+
gulp
38+
.src(['dist/vendor/scoper-autoload.php'])
39+
.pipe(
40+
replace(
41+
"$GLOBALS['__composer_autoload_files']",
42+
"$GLOBALS['__composer_autoload_files_Sgdg_Vendor']"
43+
)
44+
)
45+
.pipe(gulp.dest('dist/vendor/'))
46+
)
3647
);
3748

3849
gulp.task(
3950
'build:deps:composer:autoloader',
4051
gulp.series(
41-
shell.task(
42-
'composer dump-autoload --no-dev' +
43-
(process.env.NODE_ENV === 'production' ? ' -o' : '')
44-
),
52+
shell.task('composer dump-autoload --no-dev'),
4553
() =>
46-
merge(
47-
gulp.src([
48-
'vendor/composer/autoload_classmap.php',
49-
'vendor/composer/autoload_files.php',
50-
'vendor/composer/autoload_namespaces.php',
51-
'vendor/composer/autoload_psr4.php',
52-
]),
53-
gulp
54-
.src(['vendor/composer/autoload_static.php'])
55-
.pipe(
56-
replace(
57-
'namespace Composer\\Autoload;',
58-
'namespace Sgdg\\Vendor\\Composer\\Autoload;'
59-
)
60-
)
61-
.pipe(
62-
replace(
63-
/'(.*)\\\\' => \n/g,
64-
"'Sgdg\\\\Vendor\\\\$1\\\\' => \n"
65-
)
66-
)
67-
).pipe(gulp.dest('dist/vendor/composer/')),
54+
gulp
55+
.src(['vendor/composer/autoload_static.php'])
56+
.pipe(
57+
new Transform({
58+
objectMode: true,
59+
transform: (chunk, encoding, callback) => {
60+
let contents = String(chunk.contents).split('\n');
61+
let mode = 'none';
62+
contents = contents.map((line) => {
63+
if (/^\s*\);$/g.exec(line)) {
64+
mode = 'none';
65+
} else if (
66+
/^\s*public static \$classMap = array \($/.exec(
67+
line
68+
)
69+
) {
70+
mode = 'classMap';
71+
} else if (mode === 'classMap') {
72+
line = line.replace(
73+
/^(\s*)'([^']*)' =>/,
74+
"$1'Sgdg\\\\Vendor\\\\$2' =>"
75+
);
76+
} else {
77+
line = line.replace(
78+
'namespace Composer\\Autoload;',
79+
'namespace Sgdg\\Vendor\\Composer\\Autoload;'
80+
);
81+
}
82+
return line;
83+
});
84+
chunk.contents = Buffer.from(
85+
contents.join('\n'),
86+
encoding
87+
);
88+
callback(null, chunk);
89+
},
90+
})
91+
)
92+
.pipe(gulp.dest('dist/vendor/composer/')),
6893
shell.task('composer dump-autoload')
6994
)
7095
);

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@
7474
"gulp-rename": "^2.0.0",
7575
"gulp-replace": "^1.1.4",
7676
"gulp-shell": "^0.8.0",
77-
"merge-stream": "^2.0.0",
7877
"npm-run-all": "^4.1.5",
7978
"prettier": "^3.2.5",
8079
"rimraf": "^5.0.5",

scoper.inc.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ function dependency_finder() {
7878
static function ( $file_path, $prefix, $contents ) {
7979
$regex_prefix = mb_ereg_replace( '\\\\', '\\\\\\\\', $prefix );
8080
$replace_prefix = mb_ereg_replace( '\\\\', '\\\\', $prefix );
81+
$underscore_prefix = mb_ereg_replace( '\\\\', '_', $prefix );
8182

8283
if ( __DIR__ . '/vendor/composer/autoload_real.php' === $file_path ) {
8384
$contents = safe_replace(
@@ -90,6 +91,11 @@ static function ( $file_path, $prefix, $contents ) {
9091
"\\spl_autoload_unregister(array('{$replace_prefix}\\\\ComposerAutoloaderInit",
9192
$contents
9293
);
94+
$contents = safe_replace(
95+
"\\\$GLOBALS\['__composer_autoload_files'\]",
96+
"\$GLOBALS['__composer_autoload_files_{$underscore_prefix}']",
97+
$contents
98+
);
9399
}
94100

95101
if ( __DIR__ . '/vendor/guzzlehttp/guzzle/src/functions.php' === $file_path ) {

0 commit comments

Comments
 (0)