[packages] php5: upgrade to 5.4.5

- php.ini: remove obsolete options
- drop patch 'patches/900-prevent_buildconf_force.patch' as php now supports
  newer autoconf versions 'buildconf --force' can be called after patching the
  source tree to update build system
- cross compiling issue regarding libdl still present, so because of the last
  point the corresponding patch has to be against configure.in but configure
- update timezone patches



git-svn-id: svn://svn.openwrt.org/openwrt/packages@32872 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
mhei 2012-07-25 20:36:22 +00:00
parent 77ce79457e
commit 42801043b2
6 changed files with 265 additions and 70931 deletions

View File

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=php PKG_NAME:=php
PKG_VERSION:=5.3.10 PKG_VERSION:=5.4.5
PKG_RELEASE:=5 PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=http://www.php.net/distributions/ PKG_SOURCE_URL:=http://www.php.net/distributions/
PKG_MD5SUM:=816259e5ca7d0a7e943e56a3bb32b17f PKG_MD5SUM:=ffcc7f4dcf2b79d667fe0c110e6cb724
PKG_FIXUP:=libtool no-autoreconf PKG_FIXUP:=libtool no-autoreconf
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
@ -40,7 +40,7 @@ PHP5_MODULES = \
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_php5-cgi CONFIG_PACKAGE_php5-cli \ CONFIG_PACKAGE_php5-cgi CONFIG_PACKAGE_php5-cli \
$(patsubst %,CONFIG_PACKAGE_php5-mod-%,$(PHP5_MODULES)) \ $(patsubst %,CONFIG_PACKAGE_php5-mod-%,$(PHP5_MODULES)) \
CONFIG_PHP5_FILTER CONFIG_PHP5_LIBXML CONFIG_PHP5_SYSTEMTZDATA CONFIG_PHP5_FILTER CONFIG_PHP5_LIBXML PHP5_SYSTEMTZDATA
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/nls.mk
@ -133,7 +133,6 @@ CONFIGURE_ARGS+= \
\ \
--with-config-file-path=/etc \ --with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php5 \ --with-config-file-scan-dir=/etc/php5 \
--enable-magic-quotes \
--disable-short-tags \ --disable-short-tags \
\ \
--with-zlib="$(STAGING_DIR)/usr" \ --with-zlib="$(STAGING_DIR)/usr" \
@ -488,6 +487,11 @@ define Package/php5-fastcgi/install
$(INSTALL_BIN) ./files/php5-fastcgi.init $(1)/etc/init.d/php5-fastcgi $(INSTALL_BIN) ./files/php5-fastcgi.init $(1)/etc/init.d/php5-fastcgi
endef endef
define Build/Prepare
$(call Build/Prepare/Default)
( cd $(PKG_BUILD_DIR); touch configure.in; ./buildconf --force )
endef
define Build/InstallDev define Build/InstallDev
make -C $(PKG_BUILD_DIR) install INSTALL_ROOT=$(PKG_BUILD_DIR)/staging make -C $(PKG_BUILD_DIR) install INSTALL_ROOT=$(PKG_BUILD_DIR)/staging
rm -f $(PKG_BUILD_DIR)/staging/usr/bin/php rm -f $(PKG_BUILD_DIR)/staging/usr/bin/php

View File

@ -16,14 +16,7 @@ zlib.output_compression = Off
implicit_flush = Off implicit_flush = Off
unserialize_callback_func = unserialize_callback_func =
serialize_precision = 100 serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
;open_basedir = ;open_basedir =
disable_functions = disable_functions =
disable_classes = disable_classes =

View File

@ -3,9 +3,8 @@ Add support for use of the system timezone database, rather
than embedding a copy. Discussed upstream but was not desired. than embedding a copy. Discussed upstream but was not desired.
History: History:
r7: per Sean Finney's review: simpler lat/long rounding, r8: fix compile error without --with-system-tzdata configured
use stat() not access() to check existence of timezone, r7: improve check for valid timezone id to exclude directories
improve comments throughout.
r6: fix fd leak in r5, fix country code/BC flag use in r6: fix fd leak in r5, fix country code/BC flag use in
timezone_identifiers_list() using system db, timezone_identifiers_list() using system db,
fix use of PECL timezonedb to override system db, fix use of PECL timezonedb to override system db,
@ -49,19 +48,25 @@ r1: initial revision
#if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__)) #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
# if defined(__LITTLE_ENDIAN__) # if defined(__LITTLE_ENDIAN__)
@@ -51,6 +66,11 @@ @@ -51,9 +66,14 @@
static void read_preamble(const unsigned char **tzf, timelib_tzinfo *tz) static void read_preamble(const unsigned char **tzf, timelib_tzinfo *tz)
{ {
+ if (memcmp(tzf, "TZif", 4) == 0) { - /* skip ID */
+ *tzf += 20; - *tzf += 4;
+ return; -
+ } + if (memcmp(tzf, "TZif", 4) == 0) {
+ *tzf += 20;
+ return;
+ }
+ +
/* skip ID */ + /* skip ID */
*tzf += 4; + *tzf += 4;
+
@@ -256,7 +276,435 @@ void timelib_dump_tzinfo(timelib_tzinfo /* read BC flag */
tz->bc = (**tzf == '\1');
*tzf += 1;
@@ -256,7 +276,397 @@ void timelib_dump_tzinfo(timelib_tzinfo
} }
} }
@ -74,201 +79,200 @@ r1: initial revision
+#define ZONEINFO_PREFIX "/usr/share/zoneinfo" +#define ZONEINFO_PREFIX "/usr/share/zoneinfo"
+#endif +#endif
+ +
+/* Hash table entry for the cache of the zone.tab mapping table. */
+struct location_info {
+ char code[2]; /* Country code. */
+ double latitude, longitude;
+ char name[64];
+ char *comment;
+ struct location_info *next;
+};
+
+/* System timezone database pointer. */ +/* System timezone database pointer. */
+static const timelib_tzdb *timezonedb_system = NULL; +static const timelib_tzdb *timezonedb_system = NULL;
+ +
+/* Cache of zone.tab location data. */ +/* Hash table entry for the cache of the zone.tab mapping table. */
+struct location_info {
+ char code[2];
+ double latitude, longitude;
+ char name[64];
+ char *comment;
+ struct location_info *next;
+};
+
+/* Cache of zone.tab. */
+static struct location_info **system_location_table; +static struct location_info **system_location_table;
+ +
+/* Size of the zone.tab hash table; a random-ish prime big enough to +/* Size of the zone.tab hash table; a random-ish prime big enough to
+ * prevent too many collisions. */ + * prevent too many collisions. */
+#define LOCINFO_HASH_SIZE (1021) +#define LOCINFO_HASH_SIZE (1021)
+ +
+/* Hash function for indexing the location_info hash table. */
+static uint32_t tz_hash(const char *str) +static uint32_t tz_hash(const char *str)
+{ +{
+ const unsigned char *p = (const unsigned char *)str; + const unsigned char *p = (const unsigned char *)str;
+ uint32_t hash = 5381; + uint32_t hash = 5381;
+ int c; + int c;
+ +
+ while ((c = *p++) != '\0') { + while ((c = *p++) != '\0') {
+ hash = (hash << 5) ^ hash ^ c; + hash = (hash << 5) ^ hash ^ c;
+ } + }
+ +
+ return hash % LOCINFO_HASH_SIZE; + return hash % LOCINFO_HASH_SIZE;
+} +}
+ +
+/* Parse an ISO-6709 co-ordinate as used in zone.tab. Returns end of +/* Parse an ISO-6709 date as used in zone.tab. Returns end of the
+ * the parsed string on success, or NULL on parse error. On success, + * parsed string on success, or NULL on parse error. On success,
+ * writes the parsed number to *result. */ + * writes the parsed number to *result. */
+static char *parse_iso6709(char *p, double *result) +static char *parse_iso6709(char *p, double *result)
+{ +{
+ double v, sign; + double v, sign;
+ char *pend; + char *pend;
+ size_t len; + size_t len;
+ +
+ if (*p == '+') + if (*p == '+')
+ sign = 1.0; + sign = 1.0;
+ else if (*p == '-') + else if (*p == '-')
+ sign = -1.0; + sign = -1.0;
+ else + else
+ return NULL; + return NULL;
+ +
+ p++; + p++;
+ for (pend = p; *pend >= '0' && *pend <= '9'; pend++) + for (pend = p; *pend >= '0' && *pend <= '9'; pend++)
+ ;; + ;;
+ +
+ /* Annoying encoding used by zone.tab has no decimal point, so use + /* Annoying encoding used by zone.tab has no decimal point, so use
+ * the length to determine the format: + * the length to determine the format:
+ * + *
+ * 4 = DDMM + * 4 = DDMM
+ * 5 = DDDMM + * 5 = DDDMM
+ * 6 = DDMMSS + * 6 = DDMMSS
+ * 7 = DDDMMSS + * 7 = DDDMMSS
+ */ + */
+ len = pend - p; + len = pend - p;
+ if (len < 4 || len > 7) { + if (len < 4 || len > 7) {
+ return NULL; + return NULL;
+ } + }
+ +
+ /* p => [D]DD */ + /* p => [D]DD */
+ v = (p[0] - '0') * 10.0 + (p[1] - '0'); + v = (p[0] - '0') * 10.0 + (p[1] - '0');
+ p += 2; + p += 2;
+ if (len == 5 || len == 7) + if (len == 5 || len == 7)
+ v = v * 10.0 + (*p++ - '0'); + v = v * 10.0 + (*p++ - '0');
+ /* p => MM[SS] */ + /* p => MM[SS] */
+ v += (10.0 * (p[0] - '0') + v += (10.0 * (p[0] - '0')
+ + p[1] - '0') / 60.0; + + p[1] - '0') / 60.0;
+ p += 2; + p += 2;
+ /* p => [SS] */ + /* p => [SS] */
+ if (len > 5) { + if (len > 5) {
+ v += (10.0 * (p[0] - '0') + v += (10.0 * (p[0] - '0')
+ + p[1] - '0') / 3600.0; + + p[1] - '0') / 3600.0;
+ p += 2; + p += 2;
+ } + }
+ +
+ /* Round to five decimal place, not because it's a good idea, + /* Round to five decimal place, not because it's a good idea,
+ * but, because the builtin data uses rounded data, so, match + * but, because the builtin data uses rounded data, so, match
+ * that. */ + * that. */
+ *result = sign * (int)(v * 100000.0 + 0.5) / 100000.0; + *result = round(v * sign * 100000.0) / 100000.0;
+ +
+ return p; + return p;
+} +}
+ +
+/* This function parses the zone.tab file to build up the mapping of +/* This function parses the zone.tab file to build up the mapping of
+ * timezone to country code and geographic location, and returns a + * timezone to country code and geographic location, and returns a
+ * hash table. The hash table is indexed by the function: + * hash table. The hash table is indexed by the function:
+ * + *
+ * tz_hash(timezone-name) + * tz_hash(timezone-name)
+ */ + */
+static struct location_info **create_location_table(void) +static struct location_info **create_location_table(void)
+{ +{
+ struct location_info **li, *i; + struct location_info **li, *i;
+ char zone_tab[PATH_MAX]; + char zone_tab[PATH_MAX];
+ char line[512]; + char line[512];
+ FILE *fp; + FILE *fp;
+ +
+ strncpy(zone_tab, ZONEINFO_PREFIX "/zone.tab", sizeof zone_tab); + strncpy(zone_tab, ZONEINFO_PREFIX "/zone.tab", sizeof zone_tab);
+ +
+ fp = fopen(zone_tab, "r"); + fp = fopen(zone_tab, "r");
+ if (!fp) { + if (!fp) {
+ return NULL; + return NULL;
+ } + }
+ +
+ li = calloc(LOCINFO_HASH_SIZE, sizeof *li); + li = calloc(LOCINFO_HASH_SIZE, sizeof *li);
+ +
+ while (fgets(line, sizeof line, fp)) { + while (fgets(line, sizeof line, fp)) {
+ char *p = line, *code, *name, *comment; + char *p = line, *code, *name, *comment;
+ uint32_t hash; + uint32_t hash;
+ double latitude, longitude; + double latitude, longitude;
+ +
+ while (isspace(*p)) + while (isspace(*p))
+ p++; + p++;
+ +
+ if (*p == '#' || *p == '\0' || *p == '\n') + if (*p == '#' || *p == '\0' || *p == '\n')
+ continue; + continue;
+ +
+ if (!isalpha(p[0]) || !isalpha(p[1]) || p[2] != '\t') + if (!isalpha(p[0]) || !isalpha(p[1]) || p[2] != '\t')
+ continue; + continue;
+ +
+ /* code => AA */ + /* code => AA */
+ code = p; + code = p;
+ p[2] = 0; + p[2] = 0;
+ p += 3; + p += 3;
+ +
+ /* coords => [+-][D]DDMM[SS][+-][D]DDMM[SS] */ + /* coords => [+-][D]DDMM[SS][+-][D]DDMM[SS] */
+ p = parse_iso6709(p, &latitude); + p = parse_iso6709(p, &latitude);
+ if (!p) { + if (!p) {
+ continue; + continue;
+ } + }
+ p = parse_iso6709(p, &longitude); + p = parse_iso6709(p, &longitude);
+ if (!p) { + if (!p) {
+ continue; + continue;
+ } + }
+ +
+ if (!p || *p != '\t') { + if (!p || *p != '\t') {
+ continue; + continue;
+ } + }
+ +
+ /* name = string */ + /* name = string */
+ name = ++p; + name = ++p;
+ while (*p != '\t' && *p && *p != '\n') + while (*p != '\t' && *p && *p != '\n')
+ p++; + p++;
+ +
+ *p++ = '\0'; + *p++ = '\0';
+ +
+ /* comment = string */ + /* comment = string */
+ comment = p; + comment = p;
+ while (*p != '\t' && *p && *p != '\n') + while (*p != '\t' && *p && *p != '\n')
+ p++; + p++;
+ +
+ if (*p == '\n' || *p == '\t') + if (*p == '\n' || *p == '\t')
+ *p = '\0'; + *p = '\0';
+ +
+ hash = tz_hash(name); + hash = tz_hash(name);
+ i = malloc(sizeof *i); + i = malloc(sizeof *i);
+ memcpy(i->code, code, 2); + memcpy(i->code, code, 2);
+ strncpy(i->name, name, sizeof i->name); + strncpy(i->name, name, sizeof i->name);
+ i->comment = strdup(comment); + i->comment = strdup(comment);
+ i->longitude = longitude; + i->longitude = longitude;
+ i->latitude = latitude; + i->latitude = latitude;
+ i->next = li[hash]; + i->next = li[hash];
+ li[hash] = i; + li[hash] = i;
+ /* printf("%s [%u, %f, %f]\n", name, hash, latitude, longitude); */ + /* printf("%s [%u, %f, %f]\n", name, hash, latitude, longitude); */
+ } + }
+ +
+ fclose(fp); + fclose(fp);
+ +
+ return li; + return li;
+} +}
+ +
+/* Return location info from hash table, using given timezone name. +/* Return location info from hash table, using given timezone name.
+ * Returns NULL if the name could not be found. */ + * Returns NULL if the name could not be found. */
+const struct location_info *find_zone_info(struct location_info **li, +const struct location_info *find_zone_info(struct location_info **li,
+ const char *name) + const char *name)
+{ +{
+ uint32_t hash = tz_hash(name); + uint32_t hash = tz_hash(name);
+ const struct location_info *l; + const struct location_info *l;
+ +
+ if (!li) { + if (!li) {
+ return NULL; + return NULL;
+ } + }
+ +
+ for (l = li[hash]; l; l = l->next) { + for (l = li[hash]; l; l = l->next) {
+ if (strcasecmp(l->name, name) == 0) + if (strcasecmp(l->name, name) == 0)
+ return l; + return l;
+ } + }
+ +
+ return NULL; + return NULL;
+} +}
+ +
+/* Filter out some non-tzdata files and the posix/right databases, if +/* Filter out some non-tzdata files and the posix/right databases, if
@ -283,13 +287,11 @@ r1: initial revision
+ && strstr(ent->d_name, ".tab") == NULL; + && strstr(ent->d_name, ".tab") == NULL;
+} +}
+ +
+/* Comparison callback for qsort(), used to alpha-sort the index
+ * array by timezone name. */
+static int sysdbcmp(const void *first, const void *second) +static int sysdbcmp(const void *first, const void *second)
+{ +{
+ const timelib_tzdb_index_entry *alpha = first, *beta = second; + const timelib_tzdb_index_entry *alpha = first, *beta = second;
+ +
+ return strcmp(alpha->id, beta->id); + return strcmp(alpha->id, beta->id);
+} +}
+ +
+ +
@ -344,7 +346,7 @@ r1: initial revision
+ if (dirstack_top == dirstack_size) { + if (dirstack_top == dirstack_size) {
+ dirstack_size *= 2; + dirstack_size *= 2;
+ dirstack = realloc(dirstack, + dirstack = realloc(dirstack,
+ dirstack_size * sizeof *dirstack); + dirstack_size * sizeof *dirstack);
+ } + }
+ dirstack[dirstack_top++] = strdup(name); + dirstack[dirstack_top++] = strdup(name);
+ } + }
@ -352,7 +354,7 @@ r1: initial revision
+ if (index_next == index_size) { + if (index_next == index_size) {
+ index_size *= 2; + index_size *= 2;
+ db_index = realloc(db_index, + db_index = realloc(db_index,
+ index_size * sizeof *db_index); + index_size * sizeof *db_index);
+ } + }
+ +
+ db_index[index_next++].id = strdup(name); + db_index[index_next++].id = strdup(name);
@ -366,10 +368,7 @@ r1: initial revision
+ free(top); + free(top);
+ } while (dirstack_top); + } while (dirstack_top);
+ +
+ /* Alpha-sort the index array; shouldn't be technically necessary + qsort(db_index, index_next, sizeof *db_index, sysdbcmp);
+ * but some of the test cases rely on this, and, it matches the
+ * builtin database. */
+ qsort(db_index, index_next, sizeof *db_index, sysdbcmp);
+ +
+ db->index = db_index; + db->index = db_index;
+ db->index_size = index_next; + db->index_size = index_next;
@ -378,90 +377,59 @@ r1: initial revision
+} +}
+ +
+#define FAKE_HEADER "1234\0??\1??" +#define FAKE_HEADER "1234\0??\1??"
+#define FAKE_BC_POS (0)
+#define FAKE_UTC_POS (7 - 4) +#define FAKE_UTC_POS (7 - 4)
+ +
+/* Create a fake data segment for database 'sysdb'. This mocks +/* Create a fake data segment for database 'sysdb'. */
+ * up a fake ->data segment for the given timezone database.
+ * php_date.c::timezone_identifiers_list() looks at data[pos + 4]
+ * through data[pos + 6] to compare the country code and BC flag,
+ * which are stored in the builtin data array like:
+ *
+ * (pos + 4) => BC flag
+ * (pos + 5, pos + 6) => Two chars of country code
+ *
+ * where pos is the index corresponding to the timezone name.
+ *
+ * Timezone names are classified here into three types:
+ * 1) UTC, which is special
+ * 2) "normal" zone names
+ * 3) "backwards-compat" zone names
+ *
+ * (boolean logic of the BC flag seems to be inverted, but hey)
+ *
+ * UTC is special since it has BC=\1, code = "??"
+ * "normal" zones exist in zone.tab and have the given c-code and BC=\1
+ * "backwards-compat" zones don't exist in zone.tab and have BC=\0
+ *
+ * Since UTC and the BC zones are constant, they are encoded in the
+ * FAKE_HEADER prefix, and pos pointers index into that.
+ *
+ * FAKE_HEADER is hence four random bytes, then the BC zone segment
+ * (three bytes), then the UTC zone segment (another three).
+ *
+ * For all "normal" zones, three bytes are appended to the data array;
+ * the BC flag, always 1, and the two bytes of country code.
+ */
+static void fake_data_segment(timelib_tzdb *sysdb, +static void fake_data_segment(timelib_tzdb *sysdb,
+ struct location_info **info) + struct location_info **info)
+{ +{
+ size_t n; + size_t n;
+ char *data, *p; + char *data, *p;
+ +
+ /* Worst case maximum is 3 bytes per zone, plus the header. */ + data = malloc(3 * sysdb->index_size + 7);
+ data = malloc((3 * sysdb->index_size) + sizeof(FAKE_HEADER) - 1);
+ +
+ /* Append the fake header, p then = next byte */ + p = mempcpy(data, FAKE_HEADER, sizeof(FAKE_HEADER) - 1);
+ p = mempcpy(data, FAKE_HEADER, sizeof(FAKE_HEADER) - 1);
+ +
+ for (n = 0; n < sysdb->index_size; n++) { + for (n = 0; n < sysdb->index_size; n++) {
+ const struct location_info *li; + const struct location_info *li;
+ timelib_tzdb_index_entry *ent; + timelib_tzdb_index_entry *ent;
+ +
+ /* Lost const'ness since we're modifying the pos pointer. */ + ent = (timelib_tzdb_index_entry *)&sysdb->index[n];
+ ent = (timelib_tzdb_index_entry *)&sysdb->index[n];
+ +
+ /* Lookup the timezone name in the hash table. */ + /* Lookup the timezone name in the hash table. */
+ if (strcmp(ent->id, "UTC") == 0) { + if (strcmp(ent->id, "UTC") == 0) {
+ ent->pos = FAKE_UTC_POS; + ent->pos = FAKE_UTC_POS;
+ continue; + continue;
+ } + }
+ +
+ li = find_zone_info(info, ent->id); + li = find_zone_info(info, ent->id);
+ if (li) { + if (li) {
+ /* If found, append the BC byte and the country code; set + /* If found, append the BC byte and the
+ * the position index for the timezone to point to + * country code; set the position for this
+ * this. */ + * section of timezone data. */
+ ent->pos = (p - data) - 4; + ent->pos = (p - data) - 4;
+ *p++ = '\x01'; + *p++ = '\1';
+ *p++ = li->code[0]; + *p++ = li->code[0];
+ *p++ = li->code[1]; + *p++ = li->code[1];
+ } + }
+ else { + else {
+ /* If not found, the timezone data can + /* If not found, the timezone data can
+ * point at the header. */ + * point at the header. */
+ ent->pos = 0; + ent->pos = 0;
+ } + }
+ } + }
+ +
+ /* Store the fake data array */ + sysdb->data = (unsigned char *)data;
+ sysdb->data = (unsigned char *)data;
+} +}
+ +
+/* Evaluates to true if given timezone name is valid. */ +/* Returns true if the passed-in stat structure describes a
+#define is_valid_tz_name(tz_) (tz_[0] && strstr(tz_, "..") == NULL) + * probably-valid timezone file. */
+static int is_valid_tzfile(const struct stat *st)
+{
+ return S_ISREG(st->st_mode) && st->st_size > 20;
+}
+ +
+/* Return the mmap()ed tzfile if found, else NULL. On success, the +/* Return the mmap()ed tzfile if found, else NULL. On success, the
+ * length of the mapped data is placed in *length. */ + * length of the mapped data is placed in *length. */
+static char *map_tzfile(const char *timezone, size_t *length) +static char *map_tzfile(const char *timezone, size_t *length)
+{ +{
@ -470,7 +438,7 @@ r1: initial revision
+ char *p; + char *p;
+ int fd; + int fd;
+ +
+ if (!is_valid_tz_name(timezone)) { + if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) {
+ return NULL; + return NULL;
+ } + }
+ +
@ -479,7 +447,7 @@ r1: initial revision
+ fd = open(fname, O_RDONLY); + fd = open(fname, O_RDONLY);
+ if (fd == -1) { + if (fd == -1) {
+ return NULL; + return NULL;
+ } else if (fstat(fd, &st) != 0 || st.st_size < 21) { + } else if (fstat(fd, &st) != 0 || !is_valid_tzfile(&st)) {
+ close(fd); + close(fd);
+ return NULL; + return NULL;
+ } + }
@ -490,28 +458,21 @@ r1: initial revision
+ +
+ return p != MAP_FAILED ? p : NULL; + return p != MAP_FAILED ? p : NULL;
+} +}
+
+#endif +#endif
+ +
+/* seek_to_tz_position() for a builtin/external database. */ +static int inmem_seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb)
+static int inmem_seek_to_tz_position(const unsigned char **tzf,
+ char *timezone, const timelib_tzdb *tzdb)
{ {
int left = 0, right = tzdb->index_size - 1; int left = 0, right = tzdb->index_size - 1;
#ifdef HAVE_SETLOCALE #ifdef HAVE_SETLOCALE
@@ -295,36 +743,131 @@ static int seek_to_tz_position(const uns @@ -295,36 +705,125 @@ static int seek_to_tz_position(const uns
return 0; return 0;
} }
+/* Modified seek_to_tz_position wrapper which handles the system
+ * database and the builtin/external databases in the same way.
+ * Returns zero on failure on non-zero on success. On success, (*map,
+ * *maplen) is an mmap'ed region if *map is non-NULL, and must be
+ * munmaped after use. */
+static int seek_to_tz_position(const unsigned char **tzf, char *timezone, +static int seek_to_tz_position(const unsigned char **tzf, char *timezone,
+ char **map, size_t *maplen, + char **map, size_t *maplen,
+ const timelib_tzdb *tzdb) + const timelib_tzdb *tzdb)
+{ +{
+#ifdef HAVE_SYSTEM_TZDATA
+ if (tzdb == timezonedb_system) { + if (tzdb == timezonedb_system) {
+ char *orig; + char *orig;
+ +
@ -523,11 +484,9 @@ r1: initial revision
+ (*tzf) = (unsigned char *)orig ; + (*tzf) = (unsigned char *)orig ;
+ *map = orig; + *map = orig;
+ +
+ return 1; + return 1;
+ } + }
+ else + else {
+#endif
+ {
+ return inmem_seek_to_tz_position(tzf, timezone, tzdb); + return inmem_seek_to_tz_position(tzf, timezone, tzdb);
+ } + }
+} +}
@ -542,10 +501,11 @@ r1: initial revision
+ tmp->data = NULL; + tmp->data = NULL;
+ create_zone_index(tmp); + create_zone_index(tmp);
+ system_location_table = create_location_table(); + system_location_table = create_location_table();
+ fake_data_segment(tmp, system_location_table); + fake_data_segment(tmp, system_location_table);
+ timezonedb_system = tmp; + timezonedb_system = tmp;
+ } + }
+ +
+
+ return timezonedb_system; + return timezonedb_system;
+#else +#else
return &timezonedb_builtin; return &timezonedb_builtin;
@ -569,18 +529,18 @@ r1: initial revision
- return (seek_to_tz_position(&tzf, timezone, tzdb)); - return (seek_to_tz_position(&tzf, timezone, tzdb));
+ +
+#ifdef HAVE_SYSTEM_TZDATA +#ifdef HAVE_SYSTEM_TZDATA
+ if (tzdb == timezonedb_system) { + if (tzdb == timezonedb_system) {
+ char fname[PATH_MAX]; + char fname[PATH_MAX];
+ struct stat st; + struct stat st;
+ +
+ if (!is_valid_tz_name(timezone)) { + if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) {
+ return 0; + return 0;
+ } + }
+ +
+ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone); + snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone);
+ +
+ return stat(fname, &st) == 0 && S_ISREG(st.st_mode); + return stat(fname, &st) == 0 && is_valid_tzfile(&st);
+ } + }
+#endif +#endif
+ +
+ return (inmem_seek_to_tz_position(&tzf, timezone, tzdb)); + return (inmem_seek_to_tz_position(&tzf, timezone, tzdb));
@ -609,9 +569,10 @@ r1: initial revision
+ +
+ /* TZif-style - grok the location info from the system database, + /* TZif-style - grok the location info from the system database,
+ * if possible. */ + * if possible. */
+
+ if ((li = find_zone_info(system_location_table, timezone)) != NULL) { + if ((li = find_zone_info(system_location_table, timezone)) != NULL) {
+ tmp->location.comments = strdup(li->comment); + tmp->location.comments = strdup(li->comment);
+ strncpy(tmp->location.country_code, li->code, 2); + strncpy(tmp->location.country_code, li->code, 2);
+ tmp->location.longitude = li->longitude; + tmp->location.longitude = li->longitude;
+ tmp->location.latitude = li->latitude; + tmp->location.latitude = li->latitude;
+ tmp->bc = 1; + tmp->bc = 1;

View File

@ -5,60 +5,15 @@ Description: Silence warnings about using the default system timezone info
set the timezone explicitly), though with our use of the system timezonedb set the timezone explicitly), though with our use of the system timezonedb
patch, we actually feel quite comfortable using the default timezone info. patch, we actually feel quite comfortable using the default timezone info.
Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=571762 Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=571762
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -886,7 +886,7 @@ static char* guess_timezone(const timeli
tzid = "UTC";
}
- php_error_docref(NULL TSRMLS_CC, E_WARNING, DATE_TZ_ERRMSG "We selected '%s' for '%s/%.1f/%s' instead", tzid, ta ? ta->tm_zone : "Unknown", ta ? (float) (ta->tm_gmtoff / 3600) : 0, ta ? (ta->tm_isdst ? "DST" : "no DST") : "Unknown");
+ // php_error_docref(NULL TSRMLS_CC, E_WARNING, DATE_TZ_ERRMSG "We selected '%s' for '%s/%.1f/%s' instead", tzid, ta ? ta->tm_zone : "Unknown", ta ? (float) (ta->tm_gmtoff / 3600) : 0, ta ? (ta->tm_isdst ? "DST" : "no DST") : "Unknown");
return tzid;
}
#endif
--- a/ext/date/tests/date_default_timezone_get-1.phpt
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-date_default_timezone_get() function [1]
---INI--
-date.timezone=
---FILE--
-<?php
- putenv('TZ=');
- echo date_default_timezone_get(), "\n";
- echo date('e'), "\n";
-?>
---EXPECTF--
-Warning: date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in %sdate_default_timezone_get-1.php on line 3
-UTC
-
-Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in %sdate_default_timezone_get-1.php on line 4
-UTC
--- a/ext/date/tests/date_default_timezone_get-2.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-date_default_timezone_get() function [2]
---INI--
-date.timezone=
---FILE--
-<?php
- putenv('TZ=');
- echo date_default_timezone_get(), "\n";
-?>
---EXPECTF--
-Warning: date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in %sdate_default_timezone_get-2.php on line 3
-UTC
--- a/ext/date/tests/date_default_timezone_set-1.phpt --- a/ext/date/tests/date_default_timezone_set-1.phpt
+++ b/ext/date/tests/date_default_timezone_set-1.phpt +++ b/ext/date/tests/date_default_timezone_set-1.phpt
@@ -22,9 +22,6 @@ date.timezone= @@ -22,9 +22,6 @@ date.timezone=
echo date(DATE_ISO8601, $date4), "\n"; echo date(DATE_ISO8601, $date4), "\n";
?> ?>
--EXPECTF-- --EXPECTF--
-Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in %sdate_default_timezone_set-1.php on line 3 -Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in %sdate_default_timezone_set-1.php on line 3
- -
-Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for 'UTC/0.0/no DST' instead in %sdate_default_timezone_set-1.php on line 4 -Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in %sdate_default_timezone_set-1.php on line 4
America/Indiana/Knox America/Indiana/Knox
2005-01-12T03:00:00-0500 2005-01-12T03:00:00-0500
2005-07-12T03:00:00-0500 2005-07-12T03:00:00-0500

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,14 @@
--- a/configure --- a/configure.in
+++ b/configure +++ b/configure.in
@@ -16357,7 +16357,7 @@ fi @@ -453,7 +453,10 @@ PHP_CHECK_FUNC(gethostname, nsl)
ac_libs=$LIBS PHP_CHECK_FUNC(gethostbyaddr, nsl)
LIBS="$LIBS -ldl" PHP_CHECK_FUNC(yp_get_default_domain, nsl)
if test "$cross_compiling" = yes; then
- found=no -PHP_CHECK_FUNC(dlopen, dl)
+ found=$found +PHP_ADD_LIBRARY(dl)
else +PHP_DEF_HAVE(dlopen)
cat > conftest.$ac_ext <<EOF +PHP_DEF_HAVE(libdl)
#line 16364 "configure" +ac_cv_func_dlopen=yes
if test "$ac_cv_func_dlopen" = "yes"; then
AC_DEFINE(HAVE_LIBDL, 1, [ ])
fi