diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c index 39ab9a49c70..5b05c65299c 100644 --- a/ext/standard/strnatcmp.c +++ b/ext/standard/strnatcmp.c @@ -112,10 +112,10 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len ca = a[ai]; cb = b[bi]; /* skip over leading spaces or zeros */ - while (isspace((int)(unsigned char)ca)) + while (isspace((int)(unsigned char)ca) || (ca == '0' && ap+1 < aend)) ca = a[++ai]; - while (isspace((int)(unsigned char)cb)) + while (isspace((int)(unsigned char)cb) || (cb == '0' && bp+1 < bend)) cb = b[++bi]; /* process run of digits */ diff --git a/ext/standard/tests/array/bug44929.phpt b/ext/standard/tests/array/bug44929.phpt new file mode 100644 index 00000000000..ae71e06cffa --- /dev/null +++ b/ext/standard/tests/array/bug44929.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #44929 (natsort doesn't handle leading zeros well) +--FILE-- + +--EXPECT-- +array(10) { + [6]=> + string(4) "-123" + [7]=> + string(5) "0.002" + [8]=> + string(2) "00" + [9]=> + string(1) "0" + [0]=> + string(3) "001" + [4]=> + string(2) "03" + [2]=> + string(3) "005" + [1]=> + string(3) "008" + [3]=> + string(5) "00011" + [5]=> + string(6) "000014" +}