Skip to content

Commit fb92e33

Browse files
author
Derick Rethans
committed
- MFH: Fixed bug #37616: DATE_RFC822 does not product RFC 822 dates. (Patch by
Hannes Magnusson)
1 parent e4a3732 commit fb92e33

File tree

4 files changed

+92
-8
lines changed

4 files changed

+92
-8
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ PHP NEWS
4848
- Fixed memory leaks in openssl streams context options (Pierre)
4949
- Fixed handling of extremely long paths inside tempnam() function. (Ilia)
5050
- Fixed bug #37632 (Protected method access problem). (Marcus)
51+
- Fixed bug #37616: DATE_RFC822 does not product RFC 822 dates. (Hannes
52+
Magnusson, Derick)
5153
- Fixed bug #37620 (mysqli_ssl_set validation is innappropriate). (Georg)
5254
- Fixed bug #37614 (Class name lowercased in error message). (Johannes)
5355
- Fixed bug #37587 (var without attribute causes segfault). (Marcus)

ext/date/php_date.c

Lines changed: 84 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,87 @@ PHP_RSHUTDOWN_FUNCTION(date)
237237

238238
#define DATE_TIMEZONEDB php_date_global_timezone_db ? php_date_global_timezone_db : timelib_builtin_db()
239239

240+
/*
241+
* RFC822, Section 5.1: http://www.ietf.org/rfc/rfc822.txt
242+
* date-time = [ day "," ] date time ; dd mm yy hh:mm:ss zzz
243+
* day = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
244+
* date = 1*2DIGIT month 2DIGIT ; day month year e.g. 20 Jun 82
245+
* month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
246+
* time = hour zone ; ANSI and Military
247+
* hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59
248+
* zone = "UT" / "GMT" / "EST" / "EDT" / "CST" / "CDT" / "MST" / "MDT" / "PST" / "PDT" / 1ALPHA / ( ("+" / "-") 4DIGIT )
249+
*/
250+
#define DATE_FORMAT_RFC822 "D, d M y H:i:s O"
251+
252+
/*
253+
* RFC850, Section 2.1.4: http://www.ietf.org/rfc/rfc850.txt
254+
* Format must be acceptable both to the ARPANET and to the getdate routine.
255+
* One format that is acceptable to both is Weekday, DD-Mon-YY HH:MM:SS TIMEZONE
256+
* TIMEZONE can be any timezone name (3 or more letters)
257+
*/
258+
#define DATE_FORMAT_RFC850 "l, d-M-y H:i:s T"
259+
260+
/*
261+
* RFC1036, Section 2.1.2: http://www.ietf.org/rfc/rfc1036.txt
262+
* Its format must be acceptable both in RFC-822 and to the getdate(3)
263+
* Wdy, DD Mon YY HH:MM:SS TIMEZONE
264+
* There is no hope of having a complete list of timezones. Universal
265+
* Time (GMT), the North American timezones (PST, PDT, MST, MDT, CST,
266+
* CDT, EST, EDT) and the +/-hhmm offset specifed in RFC-822 should be supported.
267+
*/
268+
#define DATE_FORMAT_RFC1036 "D, d M y H:i:s O"
269+
270+
/*
271+
* RFC1123, Section 5.2.14: http://www.ietf.org/rfc/rfc1123.txt
272+
* RFC-822 Date and Time Specification: RFC-822 Section 5
273+
* The syntax for the date is hereby changed to: date = 1*2DIGIT month 2*4DIGIT
274+
*/
275+
#define DATE_FORMAT_RFC1123 "D, d M Y H:i:s O"
276+
277+
/*
278+
* RFC2822, Section 3.3: http://www.ietf.org/rfc/rfc2822.txt
279+
* FWS = ([*WSP CRLF] 1*WSP) / ; Folding white space
280+
* CFWS = *([FWS] comment) (([FWS] comment) / FWS)
281+
*
282+
* date-time = [ day-of-week "," ] date FWS time [CFWS]
283+
* day-of-week = ([FWS] day-name)
284+
* day-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
285+
* date = day month year
286+
* year = 4*DIGIT
287+
* month = (FWS month-name FWS)
288+
* month-name = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
289+
* day = ([FWS] 1*2DIGIT)
290+
* time = time-of-day FWS zone
291+
* time-of-day = hour ":" minute [ ":" second ]
292+
* hour = 2DIGIT
293+
* minute = 2DIGIT
294+
* second = 2DIGIT
295+
* zone = (( "+" / "-" ) 4DIGIT)
296+
*/
297+
#define DATE_FORMAT_RFC2822 "D, d M Y H:i:s O"
298+
/*
299+
* RFC3339, Section 5.6: http://www.ietf.org/rfc/rfc3339.txt
300+
* date-fullyear = 4DIGIT
301+
* date-month = 2DIGIT ; 01-12
302+
* date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
303+
*
304+
* time-hour = 2DIGIT ; 00-23
305+
* time-minute = 2DIGIT ; 00-59
306+
* time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
307+
*
308+
* time-secfrac = "." 1*DIGIT
309+
* time-numoffset = ("+" / "-") time-hour ":" time-minute
310+
* time-offset = "Z" / time-numoffset
311+
*
312+
* partial-time = time-hour ":" time-minute ":" time-second [time-secfrac]
313+
* full-date = date-fullyear "-" date-month "-" date-mday
314+
* full-time = partial-time time-offset
315+
*
316+
* date-time = full-date "T" full-time
317+
*/
240318
#define DATE_FORMAT_RFC3339 "Y-m-d\\TH:i:sP"
319+
241320
#define DATE_FORMAT_ISO8601 "Y-m-d\\TH:i:sO"
242-
#define DATE_FORMAT_RFC1036 "l, d-M-y H:i:s T"
243-
#define DATE_FORMAT_RFC1123 "D, d M Y H:i:s T"
244-
#define DATE_FORMAT_RFC2822 "D, d M Y H:i:s O"
245321

246322
#define DATE_TZ_ERRMSG \
247323
"It is not safe to rely on the system's timezone settings. Please use " \
@@ -266,8 +342,8 @@ PHP_MINIT_FUNCTION(date)
266342
REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT);
267343
REGISTER_STRING_CONSTANT("DATE_COOKIE", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
268344
REGISTER_STRING_CONSTANT("DATE_ISO8601", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT);
269-
REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
270-
REGISTER_STRING_CONSTANT("DATE_RFC850", DATE_FORMAT_RFC1036, CONST_CS | CONST_PERSISTENT);
345+
REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC822, CONST_CS | CONST_PERSISTENT);
346+
REGISTER_STRING_CONSTANT("DATE_RFC850", DATE_FORMAT_RFC850, CONST_CS | CONST_PERSISTENT);
271347
REGISTER_STRING_CONSTANT("DATE_RFC1036", DATE_FORMAT_RFC1036, CONST_CS | CONST_PERSISTENT);
272348
REGISTER_STRING_CONSTANT("DATE_RFC1123", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
273349
REGISTER_STRING_CONSTANT("DATE_RFC2822", DATE_FORMAT_RFC2822, CONST_CS | CONST_PERSISTENT);
@@ -1211,14 +1287,14 @@ static void date_register_classes(TSRMLS_D)
12111287
REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_RFC3339);
12121288
REGISTER_DATE_CLASS_CONST_STRING("COOKIE", DATE_FORMAT_RFC1123);
12131289
REGISTER_DATE_CLASS_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601);
1214-
REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC1123);
1215-
REGISTER_DATE_CLASS_CONST_STRING("RFC850", DATE_FORMAT_RFC1036);
1290+
REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC822);
1291+
REGISTER_DATE_CLASS_CONST_STRING("RFC850", DATE_FORMAT_RFC850);
12161292
REGISTER_DATE_CLASS_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036);
12171293
REGISTER_DATE_CLASS_CONST_STRING("RFC1123", DATE_FORMAT_RFC1123);
12181294
REGISTER_DATE_CLASS_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822);
12191295
REGISTER_DATE_CLASS_CONST_STRING("RFC3339", DATE_FORMAT_RFC3339);
12201296
REGISTER_DATE_CLASS_CONST_STRING("RSS", DATE_FORMAT_RFC1123);
1221-
REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_ISO8601);
1297+
REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_RFC3339);
12221298

12231299

12241300
INIT_CLASS_ENTRY(ce_timezone, "timezone", date_funcs_timezone);

ext/date/tests/bug37616.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<code><span style="color: #000000">
2+
--TEST--<br />Bug&nbsp;#37616&nbsp;(DATE_RFC822&nbsp;does&nbsp;not&nbsp;product&nbsp;RFC&nbsp;822&nbsp;dates)<br />--FILE--<br /><span style="color: #0000BB">&lt;?php<br />&nbsp;&nbsp;&nbsp;&nbsp;date_default_timezone_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Europe/Oslo"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">date</span><span style="color: #007700">(</span><span style="color: #0000BB">DATE_RFC822</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">strtotime</span><span style="color: #007700">(</span><span style="color: #DD0000">"1&nbsp;Jul&nbsp;06&nbsp;14:27:30&nbsp;+0200"</span><span style="color: #007700">)));<br /></span><span style="color: #0000BB">?&gt;<br /></span>--EXPECT--<br />string(29)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;06&nbsp;14:27:30&nbsp;+0200"<br /></span>
3+
</code>

ext/date/tests/date_constants.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<code><span style="color: #000000">
2+
--TEST--<br />Date&nbsp;constants<br />--FILE--<br /><span style="color: #0000BB">&lt;?php<br />&nbsp;&nbsp;&nbsp;&nbsp;date_default_timezone_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"Europe/Oslo"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$constants&nbsp;</span><span style="color: #007700">=&nbsp;array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_ATOM</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_COOKIE</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_ISO8601</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RFC822</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RFC850</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RFC1036</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RFC1123</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RFC2822</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_RSS</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">DATE_W3C<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;foreach(</span><span style="color: #0000BB">$constants&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$const</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">date</span><span style="color: #007700">(</span><span style="color: #0000BB">$const</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">strtotime</span><span style="color: #007700">(</span><span style="color: #DD0000">"1&nbsp;Jul&nbsp;06&nbsp;14:27:30&nbsp;+0200"</span><span style="color: #007700">)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">date</span><span style="color: #007700">(</span><span style="color: #0000BB">$const</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">strtotime</span><span style="color: #007700">(</span><span style="color: #DD0000">"2006-05-30T14:32:13+02:00"</span><span style="color: #007700">)));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000BB">?&gt;<br /></span>--EXPECT--<br />string(25)&nbsp;"2006-07-01T14:27:30+02:00"<br />string(25)&nbsp;"2006-05-30T14:32:13+02:00"<br />string(31)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;2006&nbsp;14:27:30&nbsp;+0200"<br />string(31)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;2006&nbsp;14:32:13&nbsp;+0200"<br />string(24)&nbsp;"2006-07-01T14:27:30+0200"<br />string(24)&nbsp;"2006-05-30T14:32:13+0200"<br />string(29)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;06&nbsp;14:27:30&nbsp;+0200"<br />string(29)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;06&nbsp;14:32:13&nbsp;+0200"<br />string(33)&nbsp;"Saturday,&nbsp;01-Jul-06&nbsp;14:27:30&nbsp;CEST"<br />string(32)&nbsp;"Tuesday,&nbsp;30-May-06&nbsp;14:32:13&nbsp;CEST"<br />string(29)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;06&nbsp;14:27:30&nbsp;+0200"<br />string(29)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;06&nbsp;14:32:13&nbsp;+0200"<br />string(31)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;2006&nbsp;14:27:30&nbsp;+0200"<br />string(31)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;2006&nbsp;14:32:13&nbsp;+0200"<br />string(31)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;2006&nbsp;14:27:30&nbsp;+0200"<br />string(31)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;2006&nbsp;14:32:13&nbsp;+0200"<br />string(31)&nbsp;"Sat,&nbsp;01&nbsp;Jul&nbsp;2006&nbsp;14:27:30&nbsp;+0200"<br />string(31)&nbsp;"Tue,&nbsp;30&nbsp;May&nbsp;2006&nbsp;14:32:13&nbsp;+0200"<br />string(25)&nbsp;"2006-07-01T14:27:30+02:00"<br />string(25)&nbsp;"2006-05-30T14:32:13+02:00"<br /></span>
3+
</code>

0 commit comments

Comments
 (0)