diff --git a/.travis.yml b/.travis.yml index a3dd87ca0088..7318269344bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -74,6 +74,8 @@ jobs: arch: amd64 - env: ENABLE_ZTS=1 ENABLE_DEBUG=1 SKIP_IO_CAPTURE_TESTS=1 ARM64=1 arch: arm64 + - env: ENABLE_ZTS=1 ENABLE_DEBUG=1 SKIP_IO_CAPTURE_TESTS=1 S390X=1 + arch: s390x before_script: - ccache --version diff --git a/ext/exif/exif.c b/ext/exif/exif.c index 7066c5870ccb..57ca8fdaa68e 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -1450,7 +1450,7 @@ static signed short php_ifd_get16s(void *value, int motorola_intel) } /* }}} */ -/* {{{ php_ifd_get32s +/* {{{ php_ifd_get32u * Convert a 32 bit unsigned value from file's native byte order */ static unsigned php_ifd_get32u(void *void_value, int motorola_intel) { @@ -1469,6 +1469,33 @@ static unsigned php_ifd_get32u(void *void_value, int motorola_intel) } /* }}} */ +/* {{{ php_ifd_get64u + * Convert a 64 bit unsigned value from file's native byte order */ +static uint64_t php_ifd_get64u(void *void_value, int motorola_intel) +{ + uchar *value = (uchar *) void_value; + if (motorola_intel) { + return ((uint64_t)value[0] << 56) + | ((uint64_t)value[1] << 48) + | ((uint64_t)value[2] << 40) + | ((uint64_t)value[3] << 32) + | ((uint64_t)value[4] << 24) + | ((uint64_t)value[5] << 16) + | ((uint64_t)value[6] << 8 ) + | ((uint64_t)value[7] ); + } else { + return ((uint64_t)value[7] << 56) + | ((uint64_t)value[6] << 48) + | ((uint64_t)value[5] << 40) + | ((uint64_t)value[4] << 32) + | ((uint64_t)value[3] << 24) + | ((uint64_t)value[2] << 16) + | ((uint64_t)value[1] << 8 ) + | ((uint64_t)value[0] ); + } +} +/* }}} */ + /* {{{ php_ifd_get32u * Convert a 32 bit signed value from file's native byte order */ static unsigned php_ifd_get32s(void *value, int motorola_intel) @@ -1510,17 +1537,15 @@ static void php_ifd_set32u(char *data, size_t value, int motorola_intel) /* }}} */ static float php_ifd_get_float(char *data) { - /* Copy to avoid alignment issues */ - float f; - memcpy(&f, data, sizeof(float)); - return f; + union { uint32_t i; float f; } u; + u.i = php_ifd_get32u(data, 0); + return u.f; } static double php_ifd_get_double(char *data) { - /* Copy to avoid alignment issues */ - double f; - memcpy(&f, data, sizeof(double)); - return f; + union { uint64_t i; double f; } u; + u.i = php_ifd_get64u(data, 0); + return u.f; } #ifdef EXIF_DEBUG diff --git a/travis/compile.sh b/travis/compile.sh index c1cc3aa04ed7..7af4bb21b0d4 100755 --- a/travis/compile.sh +++ b/travis/compile.sh @@ -9,6 +9,11 @@ if [[ "$ENABLE_DEBUG" == 1 ]]; then else DEBUG=""; fi +if [[ "$S390X" == 1 ]]; then + S390X_CONFIG="--without-pcre-jit"; +else + S390X_CONFIG=""; +fi if [[ -z "$CONFIG_LOG_FILE" ]]; then CONFIG_QUIET="--quiet" @@ -32,6 +37,7 @@ MAKE_JOBS=${MAKE_JOBS:-$(nproc)} $CONFIG_QUIET \ $DEBUG \ $TS \ +$S390X_CONFIG \ --enable-phpdbg \ --enable-fpm \ --with-pdo-mysql=mysqlnd \ diff --git a/travis/setup-pgsql.sh b/travis/setup-pgsql.sh index 91723562653c..d0929de9f0af 100755 --- a/travis/setup-pgsql.sh +++ b/travis/setup-pgsql.sh @@ -1,6 +1,6 @@ #!/bin/bash echo ' ' >> "./ext/pgsql/tests/config.inc" -if [ -z "$ARM64" ]; then +if [ -z "$ARM64" -o -z "$S390X"]; then psql -c 'create database test;' -U postgres fi