1 |
slords |
1.2 |
|
2 |
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-0789 |
3 |
|
|
|
4 |
|
|
http://git.php.net/?p=php-src.git;a=commitdiff;h=5b2ce47f2e98e672873f6da0f41fff120af1e57e |
5 |
|
|
- with unrelated changes reverted |
6 |
|
|
|
7 |
|
|
--- php-5.3.3/ext/date/lib/parse_date.c.cve0789 |
8 |
|
|
+++ php-5.3.3/ext/date/lib/parse_date.c |
9 |
|
|
@@ -756,7 +756,7 @@ static long timelib_lookup_zone(char **p |
10 |
|
|
return value; |
11 |
|
|
} |
12 |
|
|
|
13 |
|
|
-static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb) |
14 |
|
|
+static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) |
15 |
|
|
{ |
16 |
|
|
timelib_tzinfo *res; |
17 |
|
|
long retval = 0; |
18 |
|
|
@@ -805,7 +805,7 @@ static long timelib_get_zone(char **ptr, |
19 |
|
|
#endif |
20 |
|
|
/* If we have a TimeZone identifier to start with, use it */ |
21 |
|
|
if (strstr(tz_abbr, "/") || strcmp(tz_abbr, "UTC") == 0) { |
22 |
|
|
- if ((res = timelib_parse_tzfile(tz_abbr, tzdb)) != NULL) { |
23 |
|
|
+ if ((res = tz_wrapper(tz_abbr, tzdb)) != NULL) { |
24 |
|
|
t->tz_info = res; |
25 |
|
|
t->zone_type = TIMELIB_ZONETYPE_ID; |
26 |
|
|
found++; |
27 |
|
|
@@ -834,7 +834,7 @@ static long timelib_get_zone(char **ptr, |
28 |
|
|
} \ |
29 |
|
|
} |
30 |
|
|
|
31 |
|
|
-static int scan(Scanner *s) |
32 |
|
|
+static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) |
33 |
|
|
{ |
34 |
|
|
uchar *cursor = s->cur; |
35 |
|
|
char *str, *ptr = NULL; |
36 |
|
|
@@ -1006,7 +1006,7 @@ yy4: |
37 |
|
|
DEBUG_OUTPUT("tzcorrection | tz"); |
38 |
|
|
TIMELIB_INIT; |
39 |
|
|
TIMELIB_HAVE_TZ(); |
40 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
41 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
42 |
|
|
if (tz_not_found) { |
43 |
|
|
add_error(s, "The timezone could not be found in the database"); |
44 |
|
|
} |
45 |
|
|
@@ -4451,7 +4451,7 @@ yy223: |
46 |
|
|
} |
47 |
|
|
|
48 |
|
|
if (*ptr != '\0') { |
49 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
50 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
51 |
|
|
if (tz_not_found) { |
52 |
|
|
add_error(s, "The timezone could not be found in the database"); |
53 |
|
|
} |
54 |
|
|
@@ -9763,7 +9763,7 @@ yy491: |
55 |
|
|
} |
56 |
|
|
|
57 |
|
|
if (*ptr != '\0') { |
58 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
59 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
60 |
|
|
if (tz_not_found) { |
61 |
|
|
add_error(s, "The timezone could not be found in the database"); |
62 |
|
|
} |
63 |
|
|
@@ -12020,7 +12020,7 @@ yy701: |
64 |
|
|
s->time->h = timelib_get_nr((char **) &ptr, 2); |
65 |
|
|
s->time->i = timelib_get_nr((char **) &ptr, 2); |
66 |
|
|
s->time->s = timelib_get_nr((char **) &ptr, 2); |
67 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
68 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
69 |
|
|
if (tz_not_found) { |
70 |
|
|
add_error(s, "The timezone could not be found in the database"); |
71 |
|
|
} |
72 |
|
|
@@ -13391,7 +13391,7 @@ yy843: |
73 |
|
|
if (*ptr == '.') { |
74 |
|
|
s->time->f = timelib_get_frac_nr((char **) &ptr, 9); |
75 |
|
|
if (*ptr) { /* timezone is optional */ |
76 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
77 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
78 |
|
|
if (tz_not_found) { |
79 |
|
|
add_error(s, "The timezone could not be found in the database"); |
80 |
|
|
} |
81 |
|
|
@@ -15731,7 +15731,7 @@ yy1076: |
82 |
|
|
s->time->s = timelib_get_nr((char **) &ptr, 2); |
83 |
|
|
|
84 |
|
|
if (*ptr != '\0') { |
85 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
86 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
87 |
|
|
if (tz_not_found) { |
88 |
|
|
add_error(s, "The timezone could not be found in the database"); |
89 |
|
|
} |
90 |
|
|
@@ -24632,7 +24632,7 @@ yy1537: |
91 |
|
|
|
92 |
|
|
#define YYMAXFILL 31 |
93 |
|
|
|
94 |
|
|
-timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, const timelib_tzdb *tzdb) |
95 |
|
|
+timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper) |
96 |
|
|
{ |
97 |
|
|
Scanner in; |
98 |
|
|
int t; |
99 |
|
|
@@ -24687,7 +24687,7 @@ timelib_time* timelib_strtotime(char *s, |
100 |
|
|
in.time->zone_type = 0; |
101 |
|
|
|
102 |
|
|
do { |
103 |
|
|
- t = scan(&in); |
104 |
|
|
+ t = scan(&in, tz_get_wrapper); |
105 |
|
|
#ifdef DEBUG_PARSER |
106 |
|
|
printf("%d\n", t); |
107 |
|
|
#endif |
108 |
|
|
@@ -24714,7 +24714,7 @@ timelib_time* timelib_strtotime(char *s, |
109 |
|
|
} |
110 |
|
|
|
111 |
|
|
|
112 |
|
|
-timelib_time *timelib_parse_from_format(char *format, char *string, int len, timelib_error_container **errors, const timelib_tzdb *tzdb) |
113 |
|
|
+timelib_time *timelib_parse_from_format(char *format, char *string, int len, timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper) |
114 |
|
|
{ |
115 |
|
|
char *fptr = format; |
116 |
|
|
char *ptr = string; |
117 |
|
|
@@ -24880,7 +24880,7 @@ timelib_time *timelib_parse_from_format( |
118 |
|
|
case 'O': /* timezone */ |
119 |
|
|
{ |
120 |
|
|
int tz_not_found; |
121 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
122 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
123 |
|
|
if (tz_not_found) { |
124 |
|
|
add_pbf_error(s, "The timezone could not be found in the database", string, begin); |
125 |
|
|
} |
126 |
|
|
--- php-5.3.3/ext/date/lib/parse_date.re.cve0789 |
127 |
|
|
+++ php-5.3.3/ext/date/lib/parse_date.re |
128 |
|
|
@@ -755,7 +755,7 @@ static long timelib_lookup_zone(char **p |
129 |
|
|
return value; |
130 |
|
|
} |
131 |
|
|
|
132 |
|
|
-static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb) |
133 |
|
|
+static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_found, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_wrapper) |
134 |
|
|
{ |
135 |
|
|
timelib_tzinfo *res; |
136 |
|
|
long retval = 0; |
137 |
|
|
@@ -804,7 +804,7 @@ static long timelib_get_zone(char **ptr, |
138 |
|
|
#endif |
139 |
|
|
/* If we have a TimeZone identifier to start with, use it */ |
140 |
|
|
if (strstr(tz_abbr, "/") || strcmp(tz_abbr, "UTC") == 0) { |
141 |
|
|
- if ((res = timelib_parse_tzfile(tz_abbr, tzdb)) != NULL) { |
142 |
|
|
+ if ((res = tz_wrapper(tz_abbr, tzdb)) != NULL) { |
143 |
|
|
t->tz_info = res; |
144 |
|
|
t->zone_type = TIMELIB_ZONETYPE_ID; |
145 |
|
|
found++; |
146 |
|
|
@@ -833,7 +833,7 @@ static long timelib_get_zone(char **ptr, |
147 |
|
|
} \ |
148 |
|
|
} |
149 |
|
|
|
150 |
|
|
-static int scan(Scanner *s) |
151 |
|
|
+static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) |
152 |
|
|
{ |
153 |
|
|
uchar *cursor = s->cur; |
154 |
|
|
char *str, *ptr = NULL; |
155 |
|
|
@@ -1166,7 +1166,7 @@ weekdayof = (reltextnumber|reltex |
156 |
|
|
} |
157 |
|
|
|
158 |
|
|
if (*ptr != '\0') { |
159 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
160 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
161 |
|
|
if (tz_not_found) { |
162 |
|
|
add_error(s, "The timezone could not be found in the database"); |
163 |
|
|
} |
164 |
|
|
@@ -1207,7 +1207,7 @@ weekdayof = (reltextnumber|reltex |
165 |
|
|
s->time->h = timelib_get_nr((char **) &ptr, 2); |
166 |
|
|
s->time->i = timelib_get_nr((char **) &ptr, 2); |
167 |
|
|
s->time->s = 0; |
168 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, s->tzdb); |
169 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, s->tzdb, tz_get_wrapper); |
170 |
|
|
break; |
171 |
|
|
case 1: |
172 |
|
|
s->time->y = timelib_get_nr((char **) &ptr, 4); |
173 |
|
|
@@ -1232,7 +1232,7 @@ weekdayof = (reltextnumber|reltex |
174 |
|
|
s->time->s = timelib_get_nr((char **) &ptr, 2); |
175 |
|
|
|
176 |
|
|
if (*ptr != '\0') { |
177 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
178 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
179 |
|
|
if (tz_not_found) { |
180 |
|
|
add_error(s, "The timezone could not be found in the database"); |
181 |
|
|
} |
182 |
|
|
@@ -1425,7 +1425,7 @@ weekdayof = (reltextnumber|reltex |
183 |
|
|
if (*ptr == '.') { |
184 |
|
|
s->time->f = timelib_get_frac_nr((char **) &ptr, 9); |
185 |
|
|
if (*ptr) { /* timezone is optional */ |
186 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
187 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
188 |
|
|
if (tz_not_found) { |
189 |
|
|
add_error(s, "The timezone could not be found in the database"); |
190 |
|
|
} |
191 |
|
|
@@ -1525,7 +1525,7 @@ weekdayof = (reltextnumber|reltex |
192 |
|
|
s->time->h = timelib_get_nr((char **) &ptr, 2); |
193 |
|
|
s->time->i = timelib_get_nr((char **) &ptr, 2); |
194 |
|
|
s->time->s = timelib_get_nr((char **) &ptr, 2); |
195 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
196 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
197 |
|
|
if (tz_not_found) { |
198 |
|
|
add_error(s, "The timezone could not be found in the database"); |
199 |
|
|
} |
200 |
|
|
@@ -1638,7 +1638,7 @@ weekdayof = (reltextnumber|reltex |
201 |
|
|
DEBUG_OUTPUT("tzcorrection | tz"); |
202 |
|
|
TIMELIB_INIT; |
203 |
|
|
TIMELIB_HAVE_TZ(); |
204 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
205 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
206 |
|
|
if (tz_not_found) { |
207 |
|
|
add_error(s, "The timezone could not be found in the database"); |
208 |
|
|
} |
209 |
|
|
@@ -1691,7 +1691,7 @@ weekdayof = (reltextnumber|reltex |
210 |
|
|
} |
211 |
|
|
|
212 |
|
|
if (*ptr != '\0') { |
213 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
214 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
215 |
|
|
if (tz_not_found) { |
216 |
|
|
add_error(s, "The timezone could not be found in the database"); |
217 |
|
|
} |
218 |
|
|
@@ -1737,7 +1737,7 @@ weekdayof = (reltextnumber|reltex |
219 |
|
|
|
220 |
|
|
/*!max:re2c */ |
221 |
|
|
|
222 |
|
|
-timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, const timelib_tzdb *tzdb) |
223 |
|
|
+timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper) |
224 |
|
|
{ |
225 |
|
|
Scanner in; |
226 |
|
|
int t; |
227 |
|
|
@@ -1792,7 +1792,7 @@ timelib_time* timelib_strtotime(char *s, |
228 |
|
|
in.time->zone_type = 0; |
229 |
|
|
|
230 |
|
|
do { |
231 |
|
|
- t = scan(&in); |
232 |
|
|
+ t = scan(&in, tz_get_wrapper); |
233 |
|
|
#ifdef DEBUG_PARSER |
234 |
|
|
printf("%d\n", t); |
235 |
|
|
#endif |
236 |
|
|
@@ -1819,7 +1819,7 @@ timelib_time* timelib_strtotime(char *s, |
237 |
|
|
} |
238 |
|
|
|
239 |
|
|
|
240 |
|
|
-timelib_time *timelib_parse_from_format(char *format, char *string, int len, timelib_error_container **errors, const timelib_tzdb *tzdb) |
241 |
|
|
+timelib_time *timelib_parse_from_format(char *format, char *string, int len, timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper) |
242 |
|
|
{ |
243 |
|
|
char *fptr = format; |
244 |
|
|
char *ptr = string; |
245 |
|
|
@@ -1985,7 +1985,7 @@ timelib_time *timelib_parse_from_format( |
246 |
|
|
case 'O': /* timezone */ |
247 |
|
|
{ |
248 |
|
|
int tz_not_found; |
249 |
|
|
- s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb); |
250 |
|
|
+ s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time, &tz_not_found, s->tzdb, tz_get_wrapper); |
251 |
|
|
if (tz_not_found) { |
252 |
|
|
add_pbf_error(s, "The timezone could not be found in the database", string, begin); |
253 |
|
|
} |
254 |
|
|
--- php-5.3.3/ext/date/lib/timelib.h.cve0789 |
255 |
|
|
+++ php-5.3.3/ext/date/lib/timelib.h |
256 |
|
|
@@ -50,6 +50,9 @@ |
257 |
|
|
#define strncasecmp strnicmp |
258 |
|
|
#endif |
259 |
|
|
|
260 |
|
|
+/* Function pointers */ |
261 |
|
|
+typedef timelib_tzinfo* (*timelib_tz_get_wrapper)(char *tzname, const timelib_tzdb *tzdb); |
262 |
|
|
+ |
263 |
|
|
/* From dow.c */ |
264 |
|
|
timelib_sll timelib_day_of_week(timelib_sll y, timelib_sll m, timelib_sll d); |
265 |
|
|
timelib_sll timelib_iso_day_of_week(timelib_sll y, timelib_sll m, timelib_sll d); |
266 |
|
|
@@ -61,8 +64,8 @@ int timelib_valid_time(timelib_sll h, ti |
267 |
|
|
int timelib_valid_date(timelib_sll y, timelib_sll m, timelib_sll d); |
268 |
|
|
|
269 |
|
|
/* From parse_date.re */ |
270 |
|
|
-timelib_time *timelib_strtotime(char *s, int len, timelib_error_container **errors, const timelib_tzdb *tzdb); |
271 |
|
|
-timelib_time *timelib_parse_from_format(char *format, char *s, int len, timelib_error_container **errors, const timelib_tzdb *tzdb); |
272 |
|
|
+timelib_time *timelib_strtotime(char *s, int len, timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper); |
273 |
|
|
+timelib_time *timelib_parse_from_format(char *format, char *s, int len, timelib_error_container **errors, const timelib_tzdb *tzdb, timelib_tz_get_wrapper tz_get_wrapper); |
274 |
|
|
void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options); |
275 |
|
|
char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst); |
276 |
|
|
const timelib_tz_lookup_table *timelib_timezone_abbreviations_list(void); |
277 |
|
|
--- php-5.3.3/ext/date/php_date.c.cve0789 |
278 |
|
|
+++ php-5.3.3/ext/date/php_date.c |
279 |
|
|
@@ -833,6 +833,12 @@ static timelib_tzinfo *php_date_parse_tz |
280 |
|
|
} |
281 |
|
|
return tzi; |
282 |
|
|
} |
283 |
|
|
+ |
284 |
|
|
+timelib_tzinfo *php_date_parse_tzfile_wrapper(char *formal_tzname, const timelib_tzdb *tzdb) |
285 |
|
|
+{ |
286 |
|
|
+ TSRMLS_FETCH(); |
287 |
|
|
+ return php_date_parse_tzfile(formal_tzname, tzdb TSRMLS_CC); |
288 |
|
|
+} |
289 |
|
|
/* }}} */ |
290 |
|
|
|
291 |
|
|
/* {{{ Helper functions */ |
292 |
|
|
@@ -1366,7 +1372,7 @@ PHPAPI signed long php_parse_date(char * |
293 |
|
|
int error2; |
294 |
|
|
signed long retval; |
295 |
|
|
|
296 |
|
|
- parsed_time = timelib_strtotime(string, strlen(string), &error, DATE_TIMEZONEDB); |
297 |
|
|
+ parsed_time = timelib_strtotime(string, strlen(string), &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
298 |
|
|
if (error->error_count) { |
299 |
|
|
timelib_error_container_dtor(error); |
300 |
|
|
return -1; |
301 |
|
|
@@ -1403,7 +1409,7 @@ PHP_FUNCTION(strtotime) |
302 |
|
|
|
303 |
|
|
initial_ts = emalloc(25); |
304 |
|
|
snprintf(initial_ts, 24, "@%ld UTC", preset_ts); |
305 |
|
|
- t = timelib_strtotime(initial_ts, strlen(initial_ts), NULL, DATE_TIMEZONEDB); /* we ignore the error here, as this should never fail */ |
306 |
|
|
+ t = timelib_strtotime(initial_ts, strlen(initial_ts), NULL, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* we ignore the error here, as this should never fail */ |
307 |
|
|
timelib_update_ts(t, tzi); |
308 |
|
|
now->tz_info = tzi; |
309 |
|
|
now->zone_type = TIMELIB_ZONETYPE_ID; |
310 |
|
|
@@ -1425,7 +1431,7 @@ PHP_FUNCTION(strtotime) |
311 |
|
|
RETURN_FALSE; |
312 |
|
|
} |
313 |
|
|
|
314 |
|
|
- t = timelib_strtotime(times, time_len, &error, DATE_TIMEZONEDB); |
315 |
|
|
+ t = timelib_strtotime(times, time_len, &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
316 |
|
|
error1 = error->error_count; |
317 |
|
|
timelib_error_container_dtor(error); |
318 |
|
|
timelib_fill_holes(t, now, TIMELIB_NO_CLONE); |
319 |
|
|
@@ -2378,9 +2384,9 @@ static int date_initialize(php_date_obj |
320 |
|
|
timelib_time_dtor(dateobj->time); |
321 |
|
|
} |
322 |
|
|
if (format) { |
323 |
|
|
- dateobj->time = timelib_parse_from_format(format, time_str_len ? time_str : "", time_str_len ? time_str_len : 0, &err, DATE_TIMEZONEDB); |
324 |
|
|
+ dateobj->time = timelib_parse_from_format(format, time_str_len ? time_str : "", time_str_len ? time_str_len : 0, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
325 |
|
|
} else { |
326 |
|
|
- dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, &err, DATE_TIMEZONEDB); |
327 |
|
|
+ dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
328 |
|
|
} |
329 |
|
|
|
330 |
|
|
/* update last errors and warnings */ |
331 |
|
|
@@ -2714,7 +2720,7 @@ PHP_FUNCTION(date_parse) |
332 |
|
|
RETURN_FALSE; |
333 |
|
|
} |
334 |
|
|
|
335 |
|
|
- parsed_time = timelib_strtotime(date, date_len, &error, DATE_TIMEZONEDB); |
336 |
|
|
+ parsed_time = timelib_strtotime(date, date_len, &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
337 |
|
|
php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAM_PASSTHRU, parsed_time, error); |
338 |
|
|
} |
339 |
|
|
/* }}} */ |
340 |
|
|
@@ -2733,7 +2739,7 @@ PHP_FUNCTION(date_parse_from_format) |
341 |
|
|
RETURN_FALSE; |
342 |
|
|
} |
343 |
|
|
|
344 |
|
|
- parsed_time = timelib_parse_from_format(format, date, date_len, &error, DATE_TIMEZONEDB); |
345 |
|
|
+ parsed_time = timelib_parse_from_format(format, date, date_len, &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
346 |
|
|
php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAM_PASSTHRU, parsed_time, error); |
347 |
|
|
} |
348 |
|
|
/* }}} */ |
349 |
|
|
@@ -2775,7 +2781,7 @@ PHP_FUNCTION(date_modify) |
350 |
|
|
dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); |
351 |
|
|
DATE_CHECK_INITIALIZED(dateobj->time, DateTime); |
352 |
|
|
|
353 |
|
|
- tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB); |
354 |
|
|
+ tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
355 |
|
|
|
356 |
|
|
/* update last errors and warnings */ |
357 |
|
|
update_errors_warnings(err TSRMLS_CC); |
358 |
|
|
@@ -3571,7 +3577,7 @@ PHP_FUNCTION(date_interval_create_from_d |
359 |
|
|
|
360 |
|
|
date_instantiate(date_ce_interval, return_value TSRMLS_CC); |
361 |
|
|
|
362 |
|
|
- time = timelib_strtotime(time_str, time_str_len, &err, DATE_TIMEZONEDB); |
363 |
|
|
+ time = timelib_strtotime(time_str, time_str_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); |
364 |
|
|
diobj = (php_interval_obj *) zend_object_store_get_object(return_value TSRMLS_CC); |
365 |
|
|
diobj->diff = timelib_rel_time_clone(&time->relative); |
366 |
|
|
diobj->initialized = 1; |
367 |
|
|
--- php-5.3.3/ext/date/tests/bug53502.phpt.cve0789 |
368 |
|
|
+++ php-5.3.3/ext/date/tests/bug53502.phpt |
369 |
|
|
@@ -0,0 +1,13 @@ |
370 |
|
|
+--TEST-- |
371 |
|
|
+Bug #53502 (strtotime with timezone memory leak) |
372 |
|
|
+--INI-- |
373 |
|
|
+date.timezone=UTC |
374 |
|
|
+--FILE-- |
375 |
|
|
+<?php |
376 |
|
|
+for ($i = 0; $i < 1000; $i++) { |
377 |
|
|
+ strtotime('Monday 00:00 Europe/Paris'); // Memory leak |
378 |
|
|
+} |
379 |
|
|
+echo "Nothing, test only makes sense through valgrind.\n"; |
380 |
|
|
+?> |
381 |
|
|
+--EXPECT-- |
382 |
|
|
+Nothing, test only makes sense through valgrind. |