summaryrefslogtreecommitdiffstats
path: root/php-8.1.0-timelib.patch
diff options
context:
space:
mode:
Diffstat (limited to 'php-8.1.0-timelib.patch')
-rw-r--r--php-8.1.0-timelib.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/php-8.1.0-timelib.patch b/php-8.1.0-timelib.patch
new file mode 100644
index 0000000..2512829
--- /dev/null
+++ b/php-8.1.0-timelib.patch
@@ -0,0 +1,106 @@
+From f2903432bf8779f32237cc2e620e2fb0ca161ffa Mon Sep 17 00:00:00 2001
+From: Derick Rethans <github@derickrethans.nl>
+Date: Mon, 26 Apr 2021 09:59:01 +0100
+Subject: [PATCH] Fixed issue #112: Support empty POSIX string in older TZif2
+ files
+
+---
+ parse_tz.c | 19 ++++++++++++---
+ tests/c/files/Casablanca_AmazonLinux1 | Bin 0 -> 2428 bytes
+ tests/c/files/Nuuk_AmazonLinux1 | Bin 0 -> 8294 bytes
+ tests/c/parse_posix.cpp | 32 ++++++++++++++++++++++++++
+ timelib.c | 4 +++-
+ timelib.h | 8 ++++---
+ 6 files changed, 56 insertions(+), 7 deletions(-)
+ create mode 100644 tests/c/files/Casablanca_AmazonLinux1
+ create mode 100644 tests/c/files/Nuuk_AmazonLinux1
+
+diff --git a/ext/date/lib/parse_tz.c b/parse_tz.c
+index ffeae2e..4e31b9e 100644
+--- a/ext/date/lib/parse_tz.c
++++ b/ext/date/lib/parse_tz.c
+@@ -553,11 +553,22 @@ void timelib_dump_tzinfo(timelib_tzinfo *tz)
+ timelib_free(date_str);
+ }
+
++ if (!tz->posix_string) {
++ printf("\n%43sNo POSIX string\n", "");
++ return;
++ }
++
++ if (strcmp("", tz->posix_string) == 0) {
++ printf("\n%43sEmpty POSIX string\n", "");
++ return;
++ }
++
+ printf("\n%43sPOSIX string: %s\n", "", tz->posix_string);
+- if (tz->posix_info->std) {
++ if (tz->posix_info && tz->posix_info->std) {
+ trans_str = format_offset_type(tz, tz->posix_info->type_index_std_type);
+ printf("%43sstd: %s\n", "", trans_str);
+ timelib_free(trans_str);
++
+ if (tz->posix_info->dst) {
+ trans_str = format_offset_type(tz, tz->posix_info->type_index_dst_type);
+ printf("%43sdst: %s\n", "", trans_str);
+@@ -693,8 +704,10 @@ timelib_tzinfo *timelib_parse_tzfile(const char *timezone, const timelib_tzdb *t
+ }
+
+ read_posix_string(&tzf, tmp);
+- if (!integrate_posix_string(tmp)) {
+- *error_code = TIMELIB_ERROR_POSIX_MISSING_TTINFO;
++ if (strcmp("", tmp->posix_string) == 0) {
++ *error_code = TIMELIB_ERROR_EMPTY_POSIX_STRING;
++ } else if (!integrate_posix_string(tmp)) {
++ *error_code = TIMELIB_ERROR_CORRUPT_POSIX_STRING;
+ timelib_tzinfo_dtor(tmp);
+ return NULL;
+ }
+diff --git a/ext/date/lib/timelib.c b/timelib.c
+index 8db4df1..92366be 100644
+--- a/ext/date/lib/timelib.c
++++ b/ext/date/lib/timelib.c
+@@ -35,7 +35,7 @@
+
+ #define TIMELIB_LLABS(y) (y < 0 ? (y * -1) : y)
+
+-const char *timelib_error_messages[9] = {
++const char *timelib_error_messages[10] = {
+ "No error",
+ "Can not allocate buffer for parsing",
+ "Corrupt tzfile: The transitions in the file don't always increase",
+@@ -44,6 +44,8 @@ const char *timelib_error_messages[9] = {
+ "The version used in this timezone identifier is unsupported",
+ "No timezone with this name could be found",
+ "A 'slim' timezone file has been detected",
++ "The embedded POSIX string is not valid",
++ "The embedded POSIX string is empty"
+ };
+
+ const char *timelib_get_error_message(int error_code)
+diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h
+index 7073c6c..8e82e58 100644
+--- a/ext/date/lib/timelib.h
++++ b/ext/date/lib/timelib.h
+@@ -375,7 +375,8 @@ typedef struct _timelib_tzdb {
+ #define TIMELIB_UNSET -99999
+
+ /* An entry for each of these error codes is also in the
+- * timelib_error_messages array in timelib.c */
++ * timelib_error_messages array in timelib.c.
++ * Codes 0x00, 0x07, and 0x09 are warnings only. */
+ #define TIMELIB_ERROR_NO_ERROR 0x00
+ #define TIMELIB_ERROR_CANNOT_ALLOCATE 0x01
+ #define TIMELIB_ERROR_CORRUPT_TRANSITIONS_DONT_INCREASE 0x02
+@@ -383,8 +384,9 @@ typedef struct _timelib_tzdb {
+ #define TIMELIB_ERROR_CORRUPT_NO_ABBREVIATION 0x04
+ #define TIMELIB_ERROR_UNSUPPORTED_VERSION 0x05
+ #define TIMELIB_ERROR_NO_SUCH_TIMEZONE 0x06
+-#define TIMELIB_ERROR_SLIM_FILE 0x07
+-#define TIMELIB_ERROR_POSIX_MISSING_TTINFO 0x08
++#define TIMELIB_ERROR_SLIM_FILE 0x07 /* Warns if the file is SLIM, but we can't read it */
++#define TIMELIB_ERROR_CORRUPT_POSIX_STRING 0x08
++#define TIMELIB_ERROR_EMPTY_POSIX_STRING 0x09 /* Warns if the POSIX string is empty, but still produces results */
+
+ #ifdef __cplusplus
+ extern "C" {