mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
There are edge cases where computations can cause an integer overflow, which is undefined behaviour. Lately, some fuzzers seem to be hitting these quite frequently. While this behaviour is undefined, it doesn't actually matter in practice, the worst effect is having a wrong computation result, but no sane person would do computations on e.g. the year pow(2,63). Still, undefined behaviour is bad. Make the wrapping behaviour defined by using -fwrapv when possible. The scope of this is limited to timelib and doesn't affect php_date.c. The reason for this is that this may in theory prevent some optimizations and it also seems bad to affect code that lives so close to the PHP-native edge. I tested all issues. This fixes all but one issues, the remaining issue is in php_date.c. Fixes GH-13881. Fixes GH-14075. Fixes GH-15150. Fixes GH-16034. Fixes GH-16035. Fixes GH-16048. Fixes GH-16050. Fixes GH-16051. Fixes GH-16052. Fixes GH-16775. Fixes GH-16864. Fixes GH-16865. Fixes GH-16975. Fixes GH-17025. Fixes GH-17059. Closes GH-17060.
55 lines
1.6 KiB
Plaintext
55 lines
1.6 KiB
Plaintext
dnl Check for headers needed by timelib
|
|
AC_CHECK_HEADERS([io.h])
|
|
|
|
dnl Check for strtoll, atoll
|
|
AC_CHECK_FUNCS([strtoll atoll])
|
|
|
|
AX_CHECK_COMPILE_FLAG([-Wno-implicit-fallthrough],
|
|
[PHP_DATE_CFLAGS="$PHP_DATE_CFLAGS -Wno-implicit-fallthrough"],,
|
|
[-Werror])
|
|
|
|
PHP_DATE_CFLAGS="$PHP_DATE_CFLAGS -DHAVE_TIMELIB_CONFIG_H=1"
|
|
PHP_TIMELIB_CFLAGS="$PHP_DATE_CFLAGS"
|
|
PHP_DATE_CFLAGS="$PHP_DATE_CFLAGS -I@ext_builddir@/lib -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"
|
|
|
|
AX_CHECK_COMPILE_FLAG([-fwrapv],
|
|
[PHP_TIMELIB_CFLAGS="$PHP_TIMELIB_CFLAGS -fwrapv"],,
|
|
[-Werror])
|
|
|
|
timelib_sources="lib/astro.c lib/dow.c lib/parse_date.c lib/parse_tz.c lib/parse_posix.c
|
|
lib/timelib.c lib/tm2unixtime.c lib/unixtime2tm.c lib/parse_iso_intervals.c lib/interval.c"
|
|
|
|
PHP_NEW_EXTENSION([date],
|
|
[php_date.c],
|
|
[no],,
|
|
[$PHP_DATE_CFLAGS])
|
|
|
|
PHP_ADD_SOURCES([$ext_dir], [$timelib_sources], [$PHP_TIMELIB_CFLAGS])
|
|
|
|
PHP_ADD_BUILD_DIR([$ext_builddir/lib], [1])
|
|
PHP_ADD_INCLUDE([$ext_builddir/lib])
|
|
PHP_ADD_INCLUDE([$ext_srcdir/lib])
|
|
|
|
PHP_INSTALL_HEADERS([ext/date], [php_date.h lib/timelib.h lib/timelib_config.h])
|
|
AC_DEFINE([HAVE_TIMELIB_CONFIG_H], [1],
|
|
[Define to 1 if you have the <timelib_config.h> header file.])
|
|
|
|
cat > $ext_builddir/lib/timelib_config.h <<EOF
|
|
#ifdef PHP_WIN32
|
|
# include "config.w32.h"
|
|
#else
|
|
# include <php_config.h>
|
|
#endif
|
|
#include <inttypes.h>
|
|
#include <stdint.h>
|
|
|
|
#include "zend.h"
|
|
|
|
#define timelib_malloc emalloc
|
|
#define timelib_realloc erealloc
|
|
#define timelib_calloc ecalloc
|
|
#define timelib_strdup estrdup
|
|
#define timelib_strndup estrndup
|
|
#define timelib_free efree
|
|
EOF
|