Skip to content

Commit b069f35

Browse files
author
Moriyoshi Koizumi
committed
Fixed bug #22227
Added test case for bug #22227
1 parent ecaeb30 commit b069f35

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

ext/standard/formatted_print.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -158,24 +158,23 @@ php_sprintf_appendstring(char **buffer, int *pos, int *size, char *add,
158158
int alignment, int len, int sign, int expprec)
159159
{
160160
register int npad;
161+
int req_size;
162+
int copy_len;
161163

162-
if (max_width && min_width) {
163-
expprec = max_width = 0;
164-
}
165-
166-
npad = min_width - MIN(len, (expprec ? max_width : len));
164+
copy_len = (expprec ? MIN(max_width, len) : len);
165+
npad = min_width - copy_len;
167166

168167
if (npad < 0) {
169168
npad = 0;
170169
}
171170

172171
PRINTF_DEBUG(("sprintf: appendstring(%x, %d, %d, \"%s\", %d, '%c', %d)\n",
173172
*buffer, *pos, *size, add, min_width, padding, alignment));
174-
if ((max_width == 0) && (! expprec)) {
175-
max_width = MAX(min_width, len);
176-
}
177-
if ((*pos + max_width) >= *size) {
178-
while ((*pos + max_width) >= *size) {
173+
174+
req_size = *pos + MAX(min_width, copy_len) + 1;
175+
176+
if (req_size > *size) {
177+
while (req_size > *size) {
179178
*size <<= 1;
180179
}
181180
PRINTF_DEBUG(("sprintf ereallocing buffer to %d bytes\n", *size));
@@ -192,8 +191,8 @@ php_sprintf_appendstring(char **buffer, int *pos, int *size, char *add,
192191
}
193192
}
194193
PRINTF_DEBUG(("sprintf: appending \"%s\"\n", add));
195-
memcpy(&(*buffer)[*pos], add, MIN(max_width, len)+1);
196-
*pos += MIN(max_width, len);
194+
memcpy(&(*buffer)[*pos], add, copy_len + 1);
195+
*pos += copy_len;
197196
if (alignment == ALIGN_LEFT) {
198197
while (npad--) {
199198
(*buffer)[(*pos)++] = padding;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
--TEST--
2+
Bug #22227 (printf() field limiters broke between 4.2.3 and 4.3.0)
3+
--FILE--
4+
<?php
5+
printf("%-3.3s", "abcdef");
6+
print "\n";
7+
?>
8+
--EXPECT--
9+
abc

0 commit comments

Comments
 (0)