Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Mar 2026 06:07:21 +0000
From:      Xin LI <delphij@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-branches@FreeBSD.org
Subject:   git: 209883e0e6a7 - 2026Q1 - www/wordpress: upgrade to 6.9.4 (security)
Message-ID:  <69b25819.22008.d597d60@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch 2026Q1 has been updated by delphij:

URL: https://cgit.FreeBSD.org/ports/commit/?id=209883e0e6a7f64659b605b61d3f53c663502a16

commit 209883e0e6a7f64659b605b61d3f53c663502a16
Author:     Xin LI <delphij@FreeBSD.org>
AuthorDate: 2026-02-04 06:10:39 +0000
Commit:     Xin LI <delphij@FreeBSD.org>
CommitDate: 2026-03-12 06:06:36 +0000

    www/wordpress: upgrade to 6.9.4 (security)
    
    Upstream does not offer localized tarballs for 6.9.4, so download the
    6.9.1 tarballs and apply files/patch-6.9.1-to-6.9.4 instead.
    
    Security fixes in 6.9.2:
    - Blind SSRF
    - PoP-chain weakness in HTML API and Block Registry
    - Regex DoS in Numeric Character References
    - Stored XSS in Nav Menus
    - AJAX query-attachments Authorization Bypass
    - Stored XSS via data-wp-bind directive
    - XSS allowing override of client-side templates in admin area
    - PclZip Path Traversal
    - Authorization Bypass on Notes feature
    - XXE in external getID3 library
    
    Bug fix in 6.9.3:
    - Restore compatibility for themes using stringable objects with the
      template_include filter (regression introduced in 6.9.2)
    
    Security fixes in 6.9.4 (incomplete fixes from 6.9.2 re-addressed):
    - PclZip Path Traversal
    - Authorization Bypass on Notes feature
    - XXE in external getID3 library
    
    (cherry picked from commit 122fc90edc012755d590b9351834cc3f34ddf439)
    (cherry picked from commit 4ffaf3d60d0fc5e554d73ce71b4b42a83c46b1cb)
---
 chinese/wordpress-zh_CN/distinfo         |   6 +-
 chinese/wordpress-zh_TW/distinfo         |   6 +-
 french/wordpress/distinfo                |   6 +-
 german/wordpress/distinfo                |   6 +-
 japanese/wordpress/distinfo              |   6 +-
 russian/wordpress/distinfo               |   6 +-
 www/wordpress/Makefile                   |  11 +-
 www/wordpress/distinfo                   |   6 +-
 www/wordpress/files/patch-6.9.1-to-6.9.4 | 373 +++++++++++++++++++++++++++++++
 9 files changed, 400 insertions(+), 26 deletions(-)

diff --git a/chinese/wordpress-zh_CN/distinfo b/chinese/wordpress-zh_CN/distinfo
index 9fe473c0fbe5..873dc7844128 100644
--- a/chinese/wordpress-zh_CN/distinfo
+++ b/chinese/wordpress-zh_CN/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823664
-SHA256 (wordpress-6.9-zh_CN.tar.gz) = e532ef2b41ba345649295e195e52e497b986788c271ee759fbe08c6d4101de2a
-SIZE (wordpress-6.9-zh_CN.tar.gz) = 34321880
+TIMESTAMP = 1770179784
+SHA256 (wordpress-6.9.1-zh_CN.tar.gz) = dc11cf7f2db6e7262f32db0e167ef3d2dc0309b9d50f63708747f87d7517b4ea
+SIZE (wordpress-6.9.1-zh_CN.tar.gz) = 34328733
diff --git a/chinese/wordpress-zh_TW/distinfo b/chinese/wordpress-zh_TW/distinfo
index 7020ec9b26c4..b919a31bf9f5 100644
--- a/chinese/wordpress-zh_TW/distinfo
+++ b/chinese/wordpress-zh_TW/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823694
-SHA256 (wordpress-6.9-zh_TW.tar.gz) = 1fcd14767cfff687c531907e65e096af9f41c2ec415f5d529f699393228c5ca4
-SIZE (wordpress-6.9-zh_TW.tar.gz) = 34320400
+TIMESTAMP = 1770179813
+SHA256 (wordpress-6.9.1-zh_TW.tar.gz) = 2f68a081710a6529f8d24f5a9f986f5e7d69f1690833d15d73f333d62bce9e79
+SIZE (wordpress-6.9.1-zh_TW.tar.gz) = 34325828
diff --git a/french/wordpress/distinfo b/french/wordpress/distinfo
index c23e68b452ad..45ae23fb5a11 100644
--- a/french/wordpress/distinfo
+++ b/french/wordpress/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823733
-SHA256 (wordpress-6.9-fr_FR.tar.gz) = 36b777f147462d64fceec63f0d4eb3d19333033f6d170ffcd939439bd9ee0312
-SIZE (wordpress-6.9-fr_FR.tar.gz) = 34356018
+TIMESTAMP = 1770179827
+SHA256 (wordpress-6.9.1-fr_FR.tar.gz) = 740b90ca6ed783d3442b4764157718f185eab12d4f1f0dae09aeb936800de57c
+SIZE (wordpress-6.9.1-fr_FR.tar.gz) = 34366406
diff --git a/german/wordpress/distinfo b/german/wordpress/distinfo
index ae594758c37b..1ae5d70bdb4e 100644
--- a/german/wordpress/distinfo
+++ b/german/wordpress/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823760
-SHA256 (wordpress-6.9-de_DE.tar.gz) = 415a923cddadf98d47cd173f229517cd31e8639ef2390ee20ee1fe67eeee3f14
-SIZE (wordpress-6.9-de_DE.tar.gz) = 34368981
+TIMESTAMP = 1770179838
+SHA256 (wordpress-6.9.1-de_DE.tar.gz) = cbecc30634f93d6eddea4f694800fd35a9448f7f0ee093159293d1a8a12ae8bc
+SIZE (wordpress-6.9.1-de_DE.tar.gz) = 34378191
diff --git a/japanese/wordpress/distinfo b/japanese/wordpress/distinfo
index 780f3cff8d2e..3bf0dfe7f8c7 100644
--- a/japanese/wordpress/distinfo
+++ b/japanese/wordpress/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823787
-SHA256 (wordpress-6.9-ja.tar.gz) = cbdbf39dd18e5053d1b6e630306a7436d9af43aae1cdeea6038d10dc9fc92798
-SIZE (wordpress-6.9-ja.tar.gz) = 34361804
+TIMESTAMP = 1770179856
+SHA256 (wordpress-6.9.1-ja.tar.gz) = fb492dddac535600c19d97303081159366822d7de7b81f9f313a9a66bbffbe64
+SIZE (wordpress-6.9.1-ja.tar.gz) = 34370374
diff --git a/russian/wordpress/distinfo b/russian/wordpress/distinfo
index fa5b9fa79251..ee301434c773 100644
--- a/russian/wordpress/distinfo
+++ b/russian/wordpress/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764823814
-SHA256 (wordpress-6.9-ru_RU.tar.gz) = e4e528bd0c99f94ac7d609e81ee26b96889bc7fa1e5fa715ce7c0007c8a8e2ef
-SIZE (wordpress-6.9-ru_RU.tar.gz) = 34508258
+TIMESTAMP = 1770179868
+SHA256 (wordpress-6.9.1-ru_RU.tar.gz) = 14dea21876ef713259aeb26f156145a061b533c7b69f762e21e0be277ed65260
+SIZE (wordpress-6.9.1-ru_RU.tar.gz) = 34520097
diff --git a/www/wordpress/Makefile b/www/wordpress/Makefile
index b1f304eee299..6779e5eb39ac 100644
--- a/www/wordpress/Makefile
+++ b/www/wordpress/Makefile
@@ -1,16 +1,17 @@
 PORTNAME=	wordpress
-DISTVERSION=	6.9
+PORTVERSION=	6.9.4
 PORTREVISION?=	0
 .ifndef WORDPRESS_LANG
+DISTNAME=	wordpress-6.9.1
 PORTEPOCH=	1
 MASTER_SITES=	https://wordpress.org/
 .else
-DISTVERSIONSUFFIX=	-${WORDPRESS_LANG}
+DISTNAME=	wordpress-6.9.1-${WORDPRESS_LANG}
 MASTER_SITES?=	https://${WORDPRESS_LANG}.wordpress.org/
 .endif
 CATEGORIES+=	www
 
-MAINTAINER=	ports@FreeBSD.org
+MAINTAINER=	delphij@FreeBSD.org
 COMMENT=	State-of-the-art semantic personal publishing platform
 WWW=		${MASTER_SITES}
 
@@ -20,8 +21,8 @@ LICENSE_FILE=	${WRKSRC}/license.txt
 RUN_DEPENDS=	${PECL_PKGNAMEPREFIX}imagick>=2.2.2:graphics/pecl-imagick@${PHP_FLAVOR}
 
 USES=		cpe php:web
-.if ${DISTVERSION:N*.*.*}
-CPE_VERSION=	${DISTVERSION}.0
+.if ${PORTVERSION:N*.*.*}
+CPE_VERSION=	${PORTVERSION}.0
 .endif
 
 .ifdef WORDPRESS_LANG
diff --git a/www/wordpress/distinfo b/www/wordpress/distinfo
index 6bb564b34282..e36b3c01a83f 100644
--- a/www/wordpress/distinfo
+++ b/www/wordpress/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1764821010
-SHA256 (wordpress-6.9.tar.gz) = 5b36390233e32fef68cb5f66435bb32bdd50e0b3dfa5750aceb2de3c5993d720
-SIZE (wordpress-6.9.tar.gz) = 27058021
+TIMESTAMP = 1770179751
+SHA256 (wordpress-6.9.1.tar.gz) = 85c8436998870e42a39ae7558b096d19d294a0cd2adb7c87ee764db973b01953
+SIZE (wordpress-6.9.1.tar.gz) = 27062929
diff --git a/www/wordpress/files/patch-6.9.1-to-6.9.4 b/www/wordpress/files/patch-6.9.1-to-6.9.4
new file mode 100644
index 000000000000..9e5aa53c8598
--- /dev/null
+++ b/www/wordpress/files/patch-6.9.1-to-6.9.4
@@ -0,0 +1,373 @@
+--- wp-admin/about.php.orig	2026-02-03 17:29:37 UTC
++++ wp-admin/about.php
+@@ -60,16 +60,81 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
+ 			<a href="contribute.php" class="nav-tab"><?php _e( 'Get Involved' ); ?></a>
+ 		</nav>
+ 
+-        <div class="about__section changelog has-subtle-background-color">
++		<div class="about__section changelog has-subtle-background-color">
+ 			<div class="column">
+-				<h2><?php _e( 'Maintenance and Security Release' ); ?></h2>
++				<h2><?php _e( 'Maintenance and Security Releases' ); ?></h2>
+ 				<p>
+ 					<?php
+ 					printf(
+-						 /* translators: 1: WordPress version number, 2: Plural number of bugs. */
+-						 _n(
++						/* translators: %s: WordPress version. */
++						__( '<strong>Version %s</strong> addressed some security issues.' ),
++						'6.9.4'
++					);
++					?>
++					<?php
++					printf(
++						/* translators: %s: HelpHub URL. */
++						__( 'For more information, see <a href="%s">the release notes</a>.' ),
++						sprintf(
++							/* translators: %s: WordPress version. */
++							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
++							sanitize_title( '6.9.4' )
++						)
++					);
++					?>
++				</p>
++				<p>
++					<?php
++					printf(
++						/* translators: %s: WordPress version. */
++						_n(
+ 							'<strong>Version %1$s</strong> addressed %2$s bug.',
+ 							'<strong>Version %1$s</strong> addressed %2$s bugs.',
++							1
++						),
++						'6.9.3',
++						1
++					);
++					?>
++					<?php
++					printf(
++						/* translators: %s: HelpHub URL. */
++						__( 'For more information, see <a href="%s">the release notes</a>.' ),
++						sprintf(
++							/* translators: %s: WordPress version. */
++							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
++							sanitize_title( '6.9.3' )
++						)
++					);
++					?>
++				</p>
++				<p>
++					<?php
++					printf(
++						/* translators: %s: WordPress version. */
++						__( '<strong>Version %s</strong> addressed some security issues.' ),
++						'6.9.2'
++					);
++					?>
++					<?php
++					printf(
++						/* translators: %s: HelpHub URL. */
++						__( 'For more information, see <a href="%s">the release notes</a>.' ),
++						sprintf(
++							/* translators: %s: WordPress version. */
++							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
++							sanitize_title( '6.9.2' )
++						)
++					);
++					?>
++				</p>
++				<p>
++					<?php
++					printf(
++						/* translators: 1: WordPress version number, 2: Plural number of bugs. */
++						_n(
++							'<strong>Version %1$s</strong> addressed %2$s bug.',
++							'<strong>Version %1$s</strong> addressed %2$s bugs.',
+ 							49
+ 						),
+ 						'6.9.1',
+@@ -78,9 +143,9 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
+ 					?>
+ 					<?php
+ 					printf(
+-						 /* translators: %s: HelpHub URL. */
+-						 __( 'For more information, see <a href="%s">the release notes</a>.' ),
+-						 sprintf(
++						/* translators: %s: HelpHub URL. */
++						__( 'For more information, see <a href="%s">the release notes</a>.' ),
++						sprintf(
+ 							/* translators: %s: WordPress version. */
+ 							esc_url( __( 'https://wordpress.org/support/wordpress-version/version-%s/' ) ),
+ 							sanitize_title( '6.9.1' )
+--- wp-admin/includes/class-walker-nav-menu-checklist.php.orig	2025-05-01 19:26:29 UTC
++++ wp-admin/includes/class-walker-nav-menu-checklist.php
+@@ -116,11 +116,11 @@ class Walker_Nav_Menu_Checklist extends Walker_Nav_Men
+ 		$output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="' . esc_attr( $menu_item->object ) . '" />';
+ 		$output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="' . esc_attr( $menu_item->menu_item_parent ) . '" />';
+ 		$output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="' . esc_attr( $menu_item->type ) . '" />';
+-		$output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="' . esc_attr( $menu_item->title ) . '" />';
++		$output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="' . htmlspecialchars( $menu_item->title, ENT_QUOTES ) . '" />';
+ 		$output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="' . esc_url( $menu_item->url ) . '" />';
+ 		$output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="' . esc_attr( $menu_item->target ) . '" />';
+-		$output .= '<input type="hidden" class="menu-item-attr-title" name="menu-item[' . $possible_object_id . '][menu-item-attr-title]" value="' . esc_attr( $menu_item->attr_title ) . '" />';
+-		$output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="' . esc_attr( implode( ' ', $menu_item->classes ) ) . '" />';
+-		$output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="' . esc_attr( $menu_item->xfn ) . '" />';
++		$output .= '<input type="hidden" class="menu-item-attr-title" name="menu-item[' . $possible_object_id . '][menu-item-attr-title]" value="' . htmlspecialchars( $menu_item->attr_title, ENT_QUOTES ) . '" />';
++		$output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="' . htmlspecialchars( implode( ' ', $menu_item->classes ), ENT_QUOTES ) . '" />';
++		$output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="' . htmlspecialchars( $menu_item->xfn, ENT_QUOTES ) . '" />';
+ 	}
+ }
+--- wp-admin/includes/class-walker-nav-menu-edit.php.orig	2025-05-01 19:26:29 UTC
++++ wp-admin/includes/class-walker-nav-menu-edit.php
+@@ -203,13 +203,13 @@ class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
+ 				<p class="description description-wide">
+ 					<label for="edit-menu-item-title-<?php echo $item_id; ?>">
+ 						<?php _e( 'Navigation Label' ); ?><br />
+-						<input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->title ); ?>" />
++						<input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo htmlspecialchars( $menu_item->title, ENT_QUOTES ); ?>" />
+ 					</label>
+ 				</p>
+ 				<p class="field-title-attribute field-attr-title description description-wide">
+ 					<label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
+ 						<?php _e( 'Title Attribute' ); ?><br />
+-						<input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->post_excerpt ); ?>" />
++						<input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo htmlspecialchars( $menu_item->post_excerpt, ENT_QUOTES ); ?>" />
+ 					</label>
+ 				</p>
+ 				<p class="field-link-target description">
+@@ -222,20 +222,20 @@ class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
+ 					<p class="field-css-classes description description-thin">
+ 						<label for="edit-menu-item-classes-<?php echo $item_id; ?>">
+ 							<?php _e( 'CSS Classes (optional)' ); ?><br />
+-							<input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode( ' ', $menu_item->classes ) ); ?>" />
++							<input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo htmlspecialchars( implode( ' ', $menu_item->classes ), ENT_QUOTES ); ?>" />
+ 						</label>
+ 					</p>
+ 					<p class="field-xfn description description-thin">
+ 						<label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
+ 							<?php _e( 'Link Relationship (XFN)' ); ?><br />
+-							<input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $menu_item->xfn ); ?>" />
++							<input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo htmlspecialchars( $menu_item->xfn, ENT_QUOTES ); ?>" />
+ 						</label>
+ 					</p>
+ 				</div>
+ 				<p class="field-description description description-wide">
+ 					<label for="edit-menu-item-description-<?php echo $item_id; ?>">
+ 						<?php _e( 'Description' ); ?><br />
+-						<textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $menu_item->description ); // textarea_escaped ?></textarea>
++						<textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_textarea( $menu_item->description ); // textarea_escaped ?></textarea>
+ 						<span class="description"><?php _e( 'The description will be displayed in the menu if the active theme supports it.' ); ?></span>
+ 					</label>
+ 				</p>
+--- wp-admin/includes/file.php.orig	2025-06-14 05:04:28 UTC
++++ wp-admin/includes/file.php
+@@ -1901,6 +1901,11 @@ function _unzip_file_pclzip( $file, $to, $needed_dirs 
+ 			continue;
+ 		}
+ 
++		// Don't extract invalid files:
++		if ( 0 !== validate_file( $file['filename'] ) ) {
++			continue;
++		}
++
+ 		$uncompressed_size += $file['size'];
+ 
+ 		$needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname( $file['filename'] ) );
+--- wp-includes/ID3/getid3.lib.php.orig	2025-11-24 18:38:31 UTC
++++ wp-includes/ID3/getid3.lib.php
+@@ -13,9 +13,9 @@ if (!defined('GETID3_LIBXML_OPTIONS') && defined('LIBX
+ 
+ if (!defined('GETID3_LIBXML_OPTIONS') && defined('LIBXML_VERSION')) {
+ 	if (LIBXML_VERSION >= 20621) {
+-		define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_COMPACT);
++		define('GETID3_LIBXML_OPTIONS', LIBXML_NONET | LIBXML_NOWARNING | LIBXML_COMPACT);
+ 	} else {
+-		define('GETID3_LIBXML_OPTIONS', LIBXML_NOENT | LIBXML_NONET | LIBXML_NOWARNING);
++		define('GETID3_LIBXML_OPTIONS', LIBXML_NONET | LIBXML_NOWARNING);
+ 	}
+ }
+ 
+--- wp-includes/class-wp-block-patterns-registry.php.orig	2025-10-06 11:31:33 UTC
++++ wp-includes/class-wp-block-patterns-registry.php
+@@ -173,12 +173,23 @@ final class WP_Block_Patterns_Registry {
+ 		} else {
+ 			$patterns = &$this->registered_patterns;
+ 		}
+-		if ( ! isset( $patterns[ $pattern_name ]['content'] ) && isset( $patterns[ $pattern_name ]['filePath'] ) ) {
++
++		$file_path    = $patterns[ $pattern_name ]['filePath'] ?? '';
++		$is_stringy   = is_string( $file_path ) || ( is_object( $file_path ) && method_exists( $file_path, '__toString' ) );
++		$pattern_path = $is_stringy ? realpath( (string) $file_path ) : null;
++		if (
++			! isset( $patterns[ $pattern_name ]['content'] ) &&
++			is_string( $pattern_path ) &&
++			( str_ends_with( $pattern_path, '.php' ) || str_ends_with( $pattern_path, '.html' ) ) &&
++			is_file( $pattern_path ) &&
++			is_readable( $pattern_path )
++		) {
+ 			ob_start();
+ 			include $patterns[ $pattern_name ]['filePath'];
+ 			$patterns[ $pattern_name ]['content'] = ob_get_clean();
+ 			unset( $patterns[ $pattern_name ]['filePath'] );
+ 		}
++
+ 		return $patterns[ $pattern_name ]['content'];
+ 	}
+ 
+--- wp-includes/class-wp-http-ixr-client.php.orig	2022-09-12 15:47:14 UTC
++++ wp-includes/class-wp-http-ixr-client.php
+@@ -89,7 +89,7 @@ class WP_HTTP_IXR_Client extends IXR_Client {
+ 			echo '<pre class="ixr_request">' . htmlspecialchars( $xml ) . "\n</pre>\n\n";
+ 		}
+ 
+-		$response = wp_remote_post( $url, $args );
++		$response = wp_safe_remote_post( $url, $args );
+ 
+ 		if ( is_wp_error( $response ) ) {
+ 			$errno       = $response->get_error_code();
+--- wp-includes/html-api/class-wp-html-tag-processor.php.orig	2025-12-04 07:58:36 UTC
++++ wp-includes/html-api/class-wp-html-tag-processor.php
+@@ -4680,4 +4680,13 @@ class WP_HTML_Tag_Processor {
+ 	 * @since 6.7.0
+ 	 */
+ 	const TEXT_IS_WHITESPACE = 'TEXT_IS_WHITESPACE';
++
++	/**
++	 * Wakeup magic method.
++	 *
++	 * @since 6.9.2
++	 */
++	public function __wakeup() {
++		throw new \LogicException( __CLASS__ . ' should never be unserialized' );
++	}
+ }
+--- wp-includes/interactivity-api/class-wp-interactivity-api.php.orig	2025-11-10 22:24:34 UTC
++++ wp-includes/interactivity-api/class-wp-interactivity-api.php
+@@ -1032,6 +1032,20 @@ final class WP_Interactivity_API {
+ 						return;
+ 				}
+ 
++				// Skip if the suffix is an event handler.
++				if ( str_starts_with( $entry['suffix'], 'on' ) ) {
++					_doing_it_wrong(
++						__METHOD__,
++						sprintf(
++							/* translators: %s: The directive, e.g. data-wp-on--click. */
++							__( 'Binding event handler attributes is not supported. Please use "%s" instead.' ),
++							esc_attr( 'data-wp-on--' . substr( $entry['suffix'], 2 ) )
++						),
++						'6.9.2'
++					);
++					continue;
++				}
++
+ 				$result = $this->evaluate( $entry );
+ 
+ 				if (
+--- wp-includes/js/wp-util.js.orig	2022-09-20 03:52:10 UTC
++++ wp-includes/js/wp-util.js
+@@ -36,10 +36,11 @@ window.wp = window.wp || {};
+ 			};
+ 
+ 		return function ( data ) {
+-			if ( ! document.getElementById( 'tmpl-' + id ) ) {
++			var el = document.querySelector( 'script#tmpl-' + id );
++			if ( ! el ) {
+ 				throw new Error( 'Template not found: ' + '#tmpl-' + id );
+ 			}
+-			compiled = compiled || _.template( $( '#tmpl-' + id ).html(),  options );
++			compiled = compiled || _.template( $( el ).html(), options );
+ 			return compiled( data );
+ 		};
+ 	});
+--- wp-includes/js/wp-util.min.js.orig	2025-02-06 17:27:26 UTC
++++ wp-includes/js/wp-util.min.js
+@@ -1,2 +1,2 @@
+ /*! This file is auto-generated */
+-window.wp=window.wp||{},function(s){var t="undefined"==typeof _wpUtilSettings?{}:_wpUtilSettings;wp.template=_.memoize(function(e){var n,a={evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"};return function(t){if(document.getElementById("tmpl-"+e))return(n=n||_.template(s("#tmpl-"+e).html(),a))(t);throw new Error("Template not found: #tmpl-"+e)}}),wp.ajax={settings:t.ajax||{},post:function(t,e){return wp.ajax.send({data:_.isObject(t)?t:_.extend(e||{},{action:t})})},send:function(a,t){var e,n;return _.isObject(a)?t=a:(t=t||{}).data=_.extend(t.data||{},{action:a}),t=_.defaults(t||{},{type:"POST",url:wp.ajax.settings.url,context:this}),(e=(n=s.Deferred(function(n){t.success&&n.done(t.success),t.error&&n.fail(t.error),delete t.success,delete t.error,n.jqXHR=s.ajax(t).done(function(t){var e;"1"!==t&&1!==t||(t={success:!0}),_.isObject(t)&&!_.isUndefined(t.success)?(e=this,n.done(function(){a&&a.data&&"query-attachm
ents"===a.data.action&&n.jqXHR.hasOwnProperty("getResponseHeader")&&n.jqXHR.getResponseHeader("X-WP-Total")?e.totalAttachments=parseInt(n.jqXHR.getResponseHeader("X-WP-Total"),10):e.totalAttachments=0}),n[t.success?"resolveWith":"rejectWith"](this,[t.data])):n.rejectWith(this,[t])}).fail(function(){n.rejectWith(this,arguments)})})).promise()).abort=function(){return n.jqXHR.abort(),this},e}}}(jQuery);
+\ No newline at end of file
++window.wp=window.wp||{},function(r){var t="undefined"==typeof _wpUtilSettings?{}:_wpUtilSettings;wp.template=_.memoize(function(a){var n,s={evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^\}]+?)\}\}(?!\})/g,variable:"data"};return function(t){var e=document.querySelector("script#tmpl-"+a);if(e)return(n=n||_.template(r(e).html(),s))(t);throw new Error("Template not found: #tmpl-"+a)}}),wp.ajax={settings:t.ajax||{},post:function(t,e){return wp.ajax.send({data:_.isObject(t)?t:_.extend(e||{},{action:t})})},send:function(n,t){var e,a;return _.isObject(n)?t=n:(t=t||{}).data=_.extend(t.data||{},{action:n}),t=_.defaults(t||{},{type:"POST",url:wp.ajax.settings.url,context:this}),(e=(a=r.Deferred(function(a){t.success&&a.done(t.success),t.error&&a.fail(t.error),delete t.success,delete t.error,a.jqXHR=r.ajax(t).done(function(t){var e;"1"!==t&&1!==t||(t={success:!0}),_.isObject(t)&&!_.isUndefined(t.success)?(e=this,a.done(function(){n&&n.data&&"query-at
tachments"===n.data.action&&a.jqXHR.hasOwnProperty("getResponseHeader")&&a.jqXHR.getResponseHeader("X-WP-Total")?e.totalAttachments=parseInt(a.jqXHR.getResponseHeader("X-WP-Total"),10):e.totalAttachments=0}),a[t.success?"resolveWith":"rejectWith"](this,[t.data])):a.rejectWith(this,[t])}).fail(function(){a.rejectWith(this,arguments)})})).promise()).abort=function(){return a.jqXHR.abort(),this},e}}}(jQuery);
+\ No newline at end of file
+--- wp-includes/kses.php.orig	2025-10-22 21:02:35 UTC
++++ wp-includes/kses.php
+@@ -2201,8 +2201,8 @@ function wp_kses_normalize_entities( $content, $contex
+ 	 *
+ 	 * Here, each input is normalized to an appropriate output.
+ 	 */
+-	$content = preg_replace_callback( '/&amp;#(0*[0-9]{1,7});/', 'wp_kses_normalize_entities2', $content );
+-	$content = preg_replace_callback( '/&amp;#[Xx](0*[0-9A-Fa-f]{1,6});/', 'wp_kses_normalize_entities3', $content );
++	$content = preg_replace_callback( '/&amp;#(0*[1-9][0-9]{0,6});/', 'wp_kses_normalize_entities2', $content );
++	$content = preg_replace_callback( '/&amp;#[Xx](0*[1-9A-Fa-f][0-9A-Fa-f]{0,5});/', 'wp_kses_normalize_entities3', $content );
+ 	if ( 'xml' === $context ) {
+ 		$content = preg_replace_callback( '/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_xml_named_entities', $content );
+ 	} else {
+--- wp-includes/media.php.orig	2025-12-01 14:29:25 UTC
++++ wp-includes/media.php
+@@ -4570,7 +4570,7 @@ function wp_prepare_attachment_for_js( $attachment ) {
+ 
+ 	if ( $attachment->post_parent ) {
+ 		$post_parent = get_post( $attachment->post_parent );
+-		if ( $post_parent ) {
++		if ( $post_parent && current_user_can( 'read_post', $attachment->post_parent ) ) {
+ 			$response['uploadedToTitle'] = $post_parent->post_title ? $post_parent->post_title : __( '(no title)' );
+ 			$response['uploadedToLink']  = get_edit_post_link( $attachment->post_parent, 'raw' );
+ 		}
+--- wp-includes/nav-menu.php.orig	2024-08-05 19:00:19 UTC
++++ wp-includes/nav-menu.php
+@@ -514,7 +514,7 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_
+ 			}
+ 		}
+ 
+-		if ( wp_unslash( $args['menu-item-title'] ) === wp_specialchars_decode( $original_title ) ) {
++		if ( wp_unslash( $args['menu-item-title'] ) === $original_title ) {
+ 			$args['menu-item-title'] = '';
+ 		}
+ 
+--- wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php.orig	2025-11-25 01:22:32 UTC
++++ wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php
+@@ -560,6 +560,14 @@ class WP_REST_Comments_Controller extends WP_REST_Cont
+ 			}
+ 		}
+ 
++		if ( $is_note && ! empty( $request['post'] ) && ! current_user_can( 'edit_post', (int) $request['post'] ) ) {
++			return new WP_Error(
++				'rest_cannot_create_note',
++				__( 'Sorry, you are not allowed to create notes for this post.' ),
++				array( 'status' => rest_authorization_required_code() )
++			);
++		}
++
+ 		$edit_cap = $is_note ? array( 'edit_post', (int) $request['post'] ) : array( 'moderate_comments' );
+ 		if ( isset( $request['status'] ) && ! current_user_can( ...$edit_cap ) ) {
+ 			return new WP_Error(
+--- wp-includes/template-loader.php.orig	2025-10-15 17:14:39 UTC
++++ wp-includes/template-loader.php
+@@ -111,8 +111,15 @@ if ( wp_using_themes() ) {
+ 	 *
+ 	 * @param string $template The path of the template to include.
+ 	 */
+-	$template = apply_filters( 'template_include', $template );
+-	if ( $template ) {
++	$template   = apply_filters( 'template_include', $template );
++	$is_stringy = is_string( $template ) || ( is_object( $template ) && method_exists( $template, '__toString' ) );
++	$template   = $is_stringy ? realpath( (string) $template ) : null;
++	if (
++		is_string( $template ) &&
++		( str_ends_with( $template, '.php' ) || str_ends_with( $template, '.html' ) ) &&
++		is_file( $template ) &&
++		is_readable( $template )
++	) {
+ 		/**
+ 		 * Fires immediately before including the template.
+ 		 *
+--- wp-includes/version.php.orig	2026-02-03 17:29:37 UTC
++++ wp-includes/version.php
+@@ -16,7 +16,7 @@
+  *
+  * @global string $wp_version
+  */
+-$wp_version = '6.9.1';
++$wp_version = '6.9.4';
+ 
+ /**
+  * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69b25819.22008.d597d60>