Commit 03113b09ce5 for php.net

commit 03113b09ce5ff3dd5f55650c74424767a1fccdff
Author: Niels Dossche <7771979+ndossche@users.noreply.github.com>
Date:   Sun Jan 4 16:11:58 2026 +0100

    Fix GH-20833: mb_str_pad() divide by zero if padding string is invalid in the encoding

    If the padding string is not valid in the given encoding,
    mb_get_strlen() can return 0.

    Closes GH-20834.

diff --git a/NEWS b/NEWS
index 3b76cc83631..fc4f5d3d297 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? ????, PHP 8.4.18

+- MbString:
+  . Fixed bug GH-20833 (mb_str_pad() divide by zero if padding string is
+    invalid in the encoding). (ndossche)
+
 - Readline:
   . Fixed bug GH-18139 (Memory leak when overriding some settings
     via readline_info()). (ndossche)
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 3c3200636ec..1491e1728cd 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -5848,6 +5848,11 @@ PHP_FUNCTION(mb_str_pad)
 	}

 	size_t pad_length = mb_get_strlen(pad, encoding);
+	if (pad_length == 0) {
+		/* Possible with invalidly encoded padding string. */
+		zend_argument_must_not_be_empty_error(3);
+		RETURN_THROWS();
+	}

 	size_t num_mb_pad_chars = pad_to_length - input_length;

diff --git a/ext/mbstring/tests/gh20833.phpt b/ext/mbstring/tests/gh20833.phpt
new file mode 100644
index 00000000000..099aa337923
--- /dev/null
+++ b/ext/mbstring/tests/gh20833.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-20833 (mb_str_pad() divide by zero if padding string is invalid in the encoding)
+--EXTENSIONS--
+mbstring
+--FILE--
+<?php
+$utf8 = "test";
+$utf32 = mb_convert_encoding($utf8, 'UTF-32', 'UTF-8');
+try {
+    mb_str_pad($utf32, 5, "1" /* invalid for encoding */, STR_PAD_RIGHT, "UTF-32");
+} catch (ValueError $e) {
+    echo $e::class, ": ", $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+ValueError: mb_str_pad(): Argument #3 ($pad_string) must not be empty