diff --git a/.github/nightly_matrix.php b/.github/nightly_matrix.php new file mode 100644 index 0000000000000..a099a3ba2ad67 --- /dev/null +++ b/.github/nightly_matrix.php @@ -0,0 +1,71 @@ + $branch_key, + 'ref' => $branch, + ]; + }, $branches); + + return $result; +} + +function get_branches() { + $branch_commit_cache_file = get_branch_commit_cache_file_path(); + $branch_commit_map = []; + if (file_exists($branch_commit_cache_file)) { + $branch_commit_map = json_decode(file_get_contents($branch_commit_cache_file), JSON_THROW_ON_ERROR); + } + + $changed_branches = []; + foreach (BRANCHES as $branch) { + $previous_commit_hash = $branch_commit_map[$branch] ?? null; + $current_commit_hash = trim(shell_exec('git rev-parse origin/' . $branch)); + + if ($previous_commit_hash !== $current_commit_hash) { + $changed_branches[] = $branch; + } + + $branch_commit_map[$branch] = $current_commit_hash; + } + + file_put_contents($branch_commit_cache_file, json_encode($branch_commit_map)); + + return get_branch_matrix($changed_branches); +} + +function get_asan_matrix(array $branches) { + $jobs = []; + foreach ($branches as $branch) { + $jobs[] = [ + 'name' => '_ASAN_UBSAN', + 'branch' => $branch, + 'debug' => true, + 'zts' => true, + 'configuration_parameters' => "CFLAGS='-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC' LDFLAGS='-fsanitize=undefined,address'", + 'run_tests_parameters' => '--asan', + ]; + } + return $jobs; +} + +$trigger = $argv[1] ?? 'schedule'; +$attempt = (int) ($argv[2] ?? 1); +$discard_cache = ($trigger === 'schedule' && $attempt !== 1) || $trigger === 'workflow_dispatch'; +if ($discard_cache) { + @unlink(get_branch_commit_cache_file_path()); +} + +$branches = get_branches(); +$asan_matrix = get_asan_matrix($branches); + +echo '::set-output name=branches::' . json_encode($branches, JSON_UNESCAPED_SLASHES) . "\n"; +echo '::set-output name=asan-matrix::' . json_encode($asan_matrix, JSON_UNESCAPED_SLASHES) . "\n"; diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000000000..1b847554afe9a --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,144 @@ +name: Nightly +on: + schedule: + - cron: "0 1 * * *" + workflow_dispatch: ~ +jobs: + GENERATE_MATRIX: + name: Generate Matrix + runs-on: ubuntu-latest + outputs: + branches: ${{ steps.set-matrix.outputs.branches }} + asan-matrix: ${{ steps.set-matrix.outputs.asan-matrix }} + steps: + - uses: actions/checkout@v2 + with: + # Set fetch-depth to 0 to clone the full repository + # including all branches. This is required to find + # the correct commit hashes. + fetch-depth: 0 + - name: Grab the commit mapping + uses: actions/cache@v3 + with: + path: branch-commit-cache.json + # The cache key needs to change every time for the + # cache to be updated after this job finishes. + key: nightly-${{ github.run_id }}-${{ github.run_attempt }} + restore-keys: | + nightly- + - name: Generate Matrix + id: set-matrix + run: php .github/nightly_matrix.php "${{ github.event_name }}" "${{ github.run_attempt }}" + LINUX_X64: + needs: GENERATE_MATRIX + if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} + strategy: + fail-fast: false + matrix: + branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} + debug: [true, false] + zts: [true, false] + include: ${{ fromJson(needs.GENERATE_MATRIX.outputs.asan-matrix) }} + name: "${{ matrix.branch.name }}_LINUX_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: ubuntu-20.04 + steps: + - name: git checkout + uses: actions/checkout@v2 + with: + ref: ${{ matrix.branch.ref }} + - name: Create mssql container + uses: ./.github/actions/mssql + - name: apt + uses: ./.github/actions/apt-x64 + - name: ./configure + uses: ./.github/actions/configure-x64 + with: + configurationParameters: >- + ${{ matrix.configuration_parameters }} + --${{ matrix.debug && 'enable' || 'disable' }}-debug + --${{ matrix.zts && 'enable' || 'disable' }}-zts + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux + - name: Setup + uses: ./.github/actions/setup-x64 + - name: Test + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + ${{ matrix.run_tests_parameters }} + - name: Test Tracing JIT + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + ${{ matrix.run_tests_parameters }} + -d zend_extension=opcache.so + -d opcache.jit_buffer_size=16M + - name: Test OpCache + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + ${{ matrix.run_tests_parameters }} + -d zend_extension=opcache.so + - name: Test Function JIT + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + ${{ matrix.run_tests_parameters }} + -d zend_extension=opcache.so + -d opcache.jit_buffer_size=16M + -d opcache.jit=1205 + MACOS: + needs: GENERATE_MATRIX + if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} + strategy: + fail-fast: false + matrix: + branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} + debug: [true, false] + zts: [true, false] + name: "${{ matrix.branch.name }}_MACOS_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: macos-10.15 + steps: + - name: git checkout + uses: actions/checkout@v2 + with: + ref: ${{ matrix.branch.ref }} + - name: brew + uses: ./.github/actions/brew + - name: ./configure + uses: ./.github/actions/configure-macos + with: + configurationParameters: >- + --${{ matrix.debug && 'enable' || 'disable' }}-debug + --${{ matrix.zts && 'enable' || 'disable' }}-zts + - name: make + run: |- + export PATH="/usr/local/opt/bison/bin:$PATH" + make -j$(sysctl -n hw.logicalcpu) >/dev/null + - name: make install + run: sudo make install + - name: Test + uses: ./.github/actions/test-macos + - name: Test Tracing JIT + uses: ./.github/actions/test-macos + with: + runTestsParameters: >- + -d zend_extension=opcache.so + -d opcache.protect_memory=1 + -d opcache.jit_buffer_size=16M + - name: Test OpCache + uses: ./.github/actions/test-macos + with: + runTestsParameters: >- + -d zend_extension=opcache.so + -d opcache.protect_memory=1 + - name: Test Function JIT + uses: ./.github/actions/test-macos + with: + runTestsParameters: >- + -d zend_extension=opcache.so + -d opcache.protect_memory=1 + -d opcache.jit_buffer_size=16M + -d opcache.jit=1205 diff --git a/.gitignore b/.gitignore index 78dcc1f7ac2ff..1d55b6d9e20da 100644 --- a/.gitignore +++ b/.gitignore @@ -277,6 +277,11 @@ tmp-php.ini /Zend/zend_dtrace_gen.h /Zend/zend_dtrace_gen.h.bak +# ------------------------------------------------------------------------------ +# GitHub actions cache +# ------------------------------------------------------------------------------ +/branch-commit-cache.json + # ------------------------------------------------------------------------------ # Special cases to invert previous ignore patterns # ------------------------------------------------------------------------------ diff --git a/NEWS b/NEWS index 75e3600f5480a..4178005c7b733 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,11 @@ PHP NEWS . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) +- FPM: + . Emit error for invalid port setting. (David Carlier) + . Added extra check for FPM proc dumpable on SELinux based systems. + (David Carlier) + - Intl: . Update all grandfathered language tags with preferred values . Fixed GH-7939 (Cannot unserialize IntlTimeZone objects). (cmb) @@ -23,6 +28,9 @@ PHP NEWS . Fixed bug #80909 (crash with persistent connections in PDO_ODBC). (Calvin Buckley) +- Sodium: + . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) + - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) diff --git a/UPGRADING b/UPGRADING index b91229ec627ea..12cffeb9127e5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -27,10 +27,24 @@ PHP 8.2 UPGRADE NOTES array_change_key_case and sorting with SORT_FLAG_CASE use ASCII case conversion. +- SPL: + . The following methods now enforce their signature: + * SplFileInfo::_bad_state_ex() + * SplFileObject::getCsvControl() + * SplFileObject::fflush() + * SplFileObject::ftell() + * SplFileObject::fgetc() + * SplFileObject::fpassthru() + ======================================== 2. New Features ======================================== +- Core: + . Added the #[\SensitiveParameter] attribute to redact sensitive data in + backtraces. + RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces + - Curl: . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. @@ -114,6 +128,9 @@ PHP 8.2 UPGRADE NOTES 6. New Functions ======================================== +- Sodium: + . sodium_crypto_stream_xchacha20_xor_ic() + - Standard: . The peak memory usage can now be reset to the current usage thanks to memory_reset_peak_usage(). diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h index d0d54989dc71d..ff89312fb3f4b 100644 --- a/Zend/Optimizer/zend_func_infos.h +++ b/Zend/Optimizer/zend_func_infos.h @@ -508,7 +508,7 @@ static const func_info_t func_infos[] = { F1("long2ip", MAY_BE_STRING|MAY_BE_FALSE), F1("getenv", MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), F1("getopt", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_FALSE|MAY_BE_FALSE), -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) F1("time_nanosleep", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_BOOL), #endif F1("get_current_user", MAY_BE_STRING), @@ -522,10 +522,10 @@ static const func_info_t func_infos[] = { F1("set_include_path", MAY_BE_STRING|MAY_BE_FALSE), F1("get_include_path", MAY_BE_STRING|MAY_BE_FALSE), F1("print_r", MAY_BE_STRING|MAY_BE_BOOL), -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) F1("getservbyport", MAY_BE_STRING|MAY_BE_FALSE), #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) F1("getprotobynumber", MAY_BE_STRING|MAY_BE_FALSE), #endif F1("parse_ini_file", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_FALSE|MAY_BE_ARRAY_OF_TRUE|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_DOUBLE|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_NULL|MAY_BE_FALSE), @@ -538,7 +538,7 @@ static const func_info_t func_infos[] = { #endif F1("get_browser", MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_ANY|MAY_BE_FALSE), F1("crypt", MAY_BE_STRING), -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) F1("strptime", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), #endif #if defined(HAVE_GETHOSTNAME) @@ -547,7 +547,7 @@ static const func_info_t func_infos[] = { F1("gethostbyaddr", MAY_BE_STRING|MAY_BE_FALSE), F1("gethostbyname", MAY_BE_STRING), F1("gethostbynamel", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) F1("dns_get_record", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE), #endif F1("md5", MAY_BE_STRING), @@ -573,7 +573,7 @@ static const func_info_t func_infos[] = { F1("get_html_translation_table", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING), F1("bin2hex", MAY_BE_STRING), F1("hex2bin", MAY_BE_STRING|MAY_BE_FALSE), -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) F1("nl_langinfo", MAY_BE_STRING|MAY_BE_FALSE), #endif F1("wordwrap", MAY_BE_STRING), @@ -701,7 +701,7 @@ static const func_info_t func_infos[] = { F1("stream_socket_server", MAY_BE_RESOURCE|MAY_BE_FALSE), F1("stream_socket_accept", MAY_BE_RESOURCE|MAY_BE_FALSE), F1("stream_socket_recvfrom", MAY_BE_STRING|MAY_BE_FALSE), -#if HAVE_SOCKETPAIR +#if defined(HAVE_SOCKETPAIR) F1("stream_socket_pair", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_FALSE), #endif F1("stream_get_contents", MAY_BE_STRING|MAY_BE_FALSE), diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index b9c65fc8959dd..068b8f0fe8c65 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -1758,11 +1758,6 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { (ssa_var_info[__var].type & MAY_BE_REF) \ == (__type & MAY_BE_REF)); \ if (ssa_var_info[__var].type & ~__type) { \ - if ((ssa_var_info[__var].type & ~__type & \ - ~(MAY_BE_RC1|MAY_BE_RCN)) == 0) { \ - ssa_var_info[__var].type |= __type; \ - break; \ - } \ emit_type_narrowing_warning(op_array, ssa, __var); \ return FAILURE; \ } \ @@ -1858,7 +1853,13 @@ static void emit_type_narrowing_warning(const zend_op_array *op_array, zend_ssa int def_op_num = ssa->vars[var].definition; const zend_op *def_opline = def_op_num >= 0 ? &op_array->opcodes[def_op_num] : NULL; const char *def_op_name = def_opline ? zend_get_opcode_name(def_opline->opcode) : "PHI"; - zend_error(E_WARNING, "Narrowing occurred during type inference of %s. Please file a bug report on bugs.php.net", def_op_name); + uint32_t lineno = def_opline ? def_opline->lineno : 0; + zend_error_at( + E_WARNING, op_array->filename, lineno, + "Narrowing occurred during type inference of %s. Please file a bug report on https://github.com/php/php-src/issues", def_op_name); +#if ZEND_DEBUG + ZEND_ASSERT(0 && "Narrowing during type inference"); +#endif } ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv) @@ -3371,6 +3372,20 @@ static zend_always_inline zend_result _zend_update_type_info( if (opline->opcode == ZEND_FETCH_DIM_IS && (t1 & MAY_BE_STRING)) { tmp |= MAY_BE_NULL; } + if ((tmp & (MAY_BE_RC1|MAY_BE_RCN)) == MAY_BE_RCN && opline->result_type == IS_TMP_VAR) { + /* refcount may be indirectly decremented. Make an exception if the result is used in the next instruction */ + if (!ssa_opcodes) { + if (ssa->vars[ssa_op->result_def].use_chain < 0 + || opline + 1 != op_array->opcodes + ssa->vars[ssa_op->result_def].use_chain) { + tmp |= MAY_BE_RC1; + } + } else { + if (ssa->vars[ssa_op->result_def].use_chain < 0 + || opline + 1 != ssa_opcodes[ssa->vars[ssa_op->result_def].use_chain]) { + tmp |= MAY_BE_RC1; + } + } + } UPDATE_SSA_TYPE(tmp, ssa_op->result_def); break; case ZEND_FETCH_THIS: @@ -3384,33 +3399,40 @@ static zend_always_inline zend_result _zend_update_type_info( case ZEND_FETCH_OBJ_UNSET: case ZEND_FETCH_OBJ_FUNC_ARG: if (ssa_op->result_def >= 0) { - zend_property_info *prop_info = zend_fetch_prop_info(op_array, ssa, opline, ssa_op); - - tmp = zend_fetch_prop_type(script, prop_info, &ce); - if (opline->result_type == IS_VAR) { - tmp |= MAY_BE_REF | MAY_BE_INDIRECT; - } else if (!(opline->op1_type & (IS_VAR|IS_TMP_VAR)) || !(t1 & MAY_BE_RC1)) { - zend_class_entry *ce = NULL; - - if (opline->op1_type == IS_UNUSED) { - ce = op_array->scope; - } else if (ssa_op->op1_use >= 0 && !ssa->var_info[ssa_op->op1_use].is_instanceof) { - ce = ssa->var_info[ssa_op->op1_use].ce; - } - if (prop_info) { - /* FETCH_OBJ_R/IS for plain property increments reference counter, - so it can't be 1 */ - if (ce && !ce->create_object && !result_may_be_separated(ssa, ssa_op)) { - tmp &= ~MAY_BE_RC1; + uint32_t tmp = 0; + ce = NULL; + if (opline->op1_type != IS_UNUSED + && (t1 & (MAY_BE_ANY | MAY_BE_UNDEF) & ~MAY_BE_OBJECT)) { + tmp |= MAY_BE_NULL; + } + if (opline->op1_type == IS_UNUSED || (t1 & MAY_BE_OBJECT)) { + zend_property_info *prop_info = zend_fetch_prop_info(op_array, ssa, opline, ssa_op); + tmp |= zend_fetch_prop_type(script, prop_info, &ce); + if (opline->result_type == IS_VAR) { + tmp |= MAY_BE_REF | MAY_BE_INDIRECT; + } else if (!(opline->op1_type & (IS_VAR|IS_TMP_VAR)) || !(t1 & MAY_BE_RC1)) { + zend_class_entry *ce = NULL; + + if (opline->op1_type == IS_UNUSED) { + ce = op_array->scope; + } else if (ssa_op->op1_use >= 0 && !ssa->var_info[ssa_op->op1_use].is_instanceof) { + ce = ssa->var_info[ssa_op->op1_use].ce; } - } else { - if (ce && !ce->create_object && !ce->__get && !result_may_be_separated(ssa, ssa_op)) { - tmp &= ~MAY_BE_RC1; + if (prop_info) { + /* FETCH_OBJ_R/IS for plain property increments reference counter, + so it can't be 1 */ + if (ce && !ce->create_object && !result_may_be_separated(ssa, ssa_op)) { + tmp &= ~MAY_BE_RC1; + } + } else { + if (ce && !ce->create_object && !ce->__get && !result_may_be_separated(ssa, ssa_op)) { + tmp &= ~MAY_BE_RC1; + } + } + if (opline->opcode == ZEND_FETCH_OBJ_IS) { + /* IS check may return null for uninitialized typed property. */ + tmp |= MAY_BE_NULL; } - } - if (opline->opcode == ZEND_FETCH_OBJ_IS) { - /* IS check may return null for uninitialized typed property. */ - tmp |= MAY_BE_NULL; } } UPDATE_SSA_TYPE(tmp, ssa_op->result_def); diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index d4dcd5459078b..fe28134dd92d6 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -256,7 +256,7 @@ typedef union _mm_align_test { int main() { - int i = ZEND_MM_ALIGNMENT; + size_t i = ZEND_MM_ALIGNMENT; int zeros = 0; FILE *fp; @@ -266,7 +266,7 @@ int main() } fp = fopen("conftest.zend", "w"); - fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros); + fprintf(fp, "(size_t)%zu (size_t)%d %d\n", ZEND_MM_ALIGNMENT, zeros, ZEND_MM_ALIGNMENT < 4); fclose(fp); return 0; @@ -274,12 +274,15 @@ int main() ]])], [ LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1` LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2` + LIBZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT=`cat conftest.zend | cut -d ' ' -f 3` AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ]) AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ]) + AC_DEFINE_UNQUOTED(ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, $LIBZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, [ ]) ], [], [ dnl Cross compilation needs something here. - AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, 8, [ ]) - AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, 3, [ ]) + AC_DEFINE(ZEND_MM_ALIGNMENT, 8, [ ]) + AC_DEFINE(ZEND_MM_ALIGNMENT_LOG2, 3, [ ]) + AC_DEFINE(ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, 0, [ ]) ]) AC_MSG_RESULT(done) diff --git a/Zend/tests/bug63882_2.phpt b/Zend/tests/bug63882_2.phpt new file mode 100644 index 0000000000000..c457a7ad4542e --- /dev/null +++ b/Zend/tests/bug63882_2.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #63882_2 (arsort crash on recursion) +--FILE-- + +DONE +--EXPECT-- +DONE diff --git a/Zend/tests/enum/json_encode.phpt b/Zend/tests/enum/json_encode.phpt index 12ed0d3d445ab..f1174db7ae8ee 100644 --- a/Zend/tests/enum/json_encode.phpt +++ b/Zend/tests/enum/json_encode.phpt @@ -26,6 +26,10 @@ enum CustomFoo implements JsonSerializable { function test($value) { var_dump(json_encode($value)); echo json_last_error_msg() . "\n"; + if (json_last_error() !== JSON_ERROR_NONE) { + echo json_last_error() . ' === ' . JSON_ERROR_NON_BACKED_ENUM . ":\n"; + var_dump(json_last_error() === JSON_ERROR_NON_BACKED_ENUM); + } try { var_dump(json_encode($value, JSON_THROW_ON_ERROR)); @@ -44,6 +48,8 @@ test(CustomFoo::Bar); --EXPECT-- bool(false) Non-backed enums have no default serialization +11 === 11: +bool(true) JsonException: Non-backed enums have no default serialization string(1) "0" No error diff --git a/Zend/tests/function_arguments/sensitive_parameter.phpt b/Zend/tests/function_arguments/sensitive_parameter.phpt new file mode 100644 index 0000000000000..8a76db6626de0 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter.phpt @@ -0,0 +1,51 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument. +--FILE-- +getTrace()); +} + +test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter.php(10): test(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter.php" + ["line"]=> + int(10) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter.php" + ["line"]=> + int(10) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt b/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt new file mode 100644 index 0000000000000..da57bc55e7f46 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt @@ -0,0 +1,28 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument for arrow functions. +--FILE-- + (new Exception)->getTrace(); + +var_dump($test('sensitive')); + +?> +--EXPECTF-- +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_arrow_function.php" + ["line"]=> + int(5) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_closure.phpt b/Zend/tests/function_arguments/sensitive_parameter_closure.phpt new file mode 100644 index 0000000000000..f2b038ceab953 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_closure.phpt @@ -0,0 +1,51 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument for closures. +--FILE-- +getTrace()); +}; + +$test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_closure.php(10): {closure}(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_closure.php" + ["line"]=> + int(10) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_closure.php" + ["line"]=> + int(10) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt b/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt new file mode 100644 index 0000000000000..1a6dc97dd2e43 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt @@ -0,0 +1,70 @@ +--TEST-- +The SensitiveParameterValue replacement value correctly captures the original value. +--FILE-- +getMessage(), PHP_EOL; + $testFrame = $e->getTrace()[0]; + var_dump($testFrame['function']); + var_dump(count($testFrame['args'])); + var_dump($testFrame['args'][0]); + assert($testFrame['args'][1] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][1]->getValue()); + var_dump($testFrame['args'][2]); + echo "Success", PHP_EOL; +} + +function test2( + $foo, + #[SensitiveParameter] ...$variadic, +) { + throw new Exception('Error 2'); +} + +try { + test2('foo', 'variadic1', 'variadic2', 'variadic3'); + echo 'Not reached'; +} catch (Exception $e) { + echo $e->getMessage(), PHP_EOL; + $testFrame = $e->getTrace()[0]; + var_dump($testFrame['function']); + var_dump(count($testFrame['args'])); + var_dump($testFrame['args'][0]); + assert($testFrame['args'][1] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][1]->getValue()); + assert($testFrame['args'][2] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][2]->getValue()); + assert($testFrame['args'][3] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][3]->getValue()); + echo "Success", PHP_EOL; +} + +?> +--EXPECTF-- +Error +string(4) "test" +int(3) +string(3) "foo" +string(3) "bar" +string(3) "baz" +Success +Error 2 +string(5) "test2" +int(4) +string(3) "foo" +string(9) "variadic1" +string(9) "variadic2" +string(9) "variadic3" +Success diff --git a/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt b/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt new file mode 100644 index 0000000000000..8bb8bc736f477 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt @@ -0,0 +1,72 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument in a function called in eval(). +--FILE-- +getTrace()); +} + +eval(<<<'EOT' +test('sensitive'); +EOT); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_eval_call.php(11) : eval()'d code(1): test(Object(SensitiveParameterValue)) +#1 %ssensitive_parameter_eval_call.php(11): eval() +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php(11) : eval()'d code" + ["line"]=> + int(1) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(3) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php" + ["line"]=> + int(11) + ["function"]=> + string(4) "eval" + } +} +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php(11) : eval()'d code" + ["line"]=> + int(1) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(3) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php" + ["line"]=> + int(11) + ["function"]=> + string(4) "eval" + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt b/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt new file mode 100644 index 0000000000000..29fdbc95a9ca9 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt @@ -0,0 +1,53 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument in a function created in eval(). +--FILE-- +getTrace()); +} +EOT); + +test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_eval_define.php(12): test(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_define.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_define.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt new file mode 100644 index 0000000000000..823e13f2ea790 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt @@ -0,0 +1,62 @@ +--TEST-- +The SensitiveParameter attribute does not suppress superfluous arguments if the last parameter is sensitive. +--FILE-- +getTrace()); +} + +test('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_extra_arguments.php(13): test('foo', Object(SensitiveParameterValue), 'baz') +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_extra_arguments.php" + ["line"]=> + int(13) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + string(3) "baz" + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_extra_arguments.php" + ["line"]=> + int(13) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + string(3) "baz" + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt new file mode 100644 index 0000000000000..f0962d88829f8 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute suppresses the correct sensitive arguments. +--FILE-- +getTrace()); +} + +test('sensitive1', 'non_sensitive', 'sensitive2'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_multiple_arguments.php(14): test(Object(SensitiveParameterValue), 'non_sensitive', Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_multiple_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_multiple_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt new file mode 100644 index 0000000000000..24e2268e8d956 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute handles named arguments. +--FILE-- +getTrace()); +} + +test(non_sensitive: 'non_sensitive', sensitive2: 'sensitive2'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_named_arguments.php(14): test(Object(SensitiveParameterValue), 'non_sensitive', Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_named_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_named_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt b/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt new file mode 100644 index 0000000000000..6f481b72cbe71 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt @@ -0,0 +1,115 @@ +--TEST-- +The SensitiveParameter attribute handles nested function calls correctly. +--FILE-- +getTrace()); +} + +function wrapper( + $non_sensitive = null, + #[SensitiveParameter] $sensitive1 = null, + #[SensitiveParameter] $sensitive2 = null, +) +{ + test($non_sensitive, $sensitive1, $sensitive2); +} + +wrapper('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_nested_calls.php(20): test(Object(SensitiveParameterValue), 'bar', Object(SensitiveParameterValue)) +#1 %ssensitive_parameter_nested_calls.php(23): wrapper('foo', Object(SensitiveParameterValue), Object(SensitiveParameterValue)) +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(20) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(3) "bar" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(23) + ["function"]=> + string(7) "wrapper" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(20) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(3) "bar" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(23) + ["function"]=> + string(7) "wrapper" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_value.phpt b/Zend/tests/function_arguments/sensitive_parameter_value.phpt new file mode 100644 index 0000000000000..2949b0b18de61 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value.phpt @@ -0,0 +1,43 @@ +--TEST-- +A SensitiveParameterValue keeps the inner value secret. +--FILE-- +getValue()", PHP_EOL; +var_dump($v->getValue()); + +?> +--EXPECTF-- +# var_dump() / debug_zval_dump() +object(SensitiveParameterValue)#%d (0) { +} +object(SensitiveParameterValue)#%d (%d) refcount(%d){ +} + +# var_export() +SensitiveParameterValue::__set_state(array( +)) + +# (array) / json_encode() +array(0) { +} +string(2) "{}" + +# ->getValue() +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt new file mode 100644 index 0000000000000..5170e62ebe3d4 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue is clonable. +--FILE-- +getValue()); +var_dump($v2->getValue()); + +?> +--EXPECTF-- +string(6) "secret" +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt new file mode 100644 index 0000000000000..e7b0de51b969e --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt @@ -0,0 +1,74 @@ +--TEST-- +A SensitiveParameterValue keeps inner objects alive. +--FILE-- +id, PHP_EOL; + } + + public function __destruct() + { + echo __METHOD__, " - ", $this->id, PHP_EOL; + } + + public function getId(): int + { + return $this->id; + } +} + +function test(#[SensitiveParameter] CustomDestructor $o, bool $throw) +{ + if ($throw) { + throw new Exception('Error'); + } +} + +function wrapper(int $id, bool $throw) +{ + $o = new CustomDestructor($id); + test($o, $throw); +} + +function main(): SensitiveParameterValue +{ + try { + echo "Before 1", PHP_EOL; + wrapper(1, false); + echo "After 1", PHP_EOL; + echo "Before 2", PHP_EOL; + wrapper(2, true); + echo "Not Reached: After 2", PHP_EOL; + } catch (Exception $e) { + echo "catch", PHP_EOL; + return $e->getTrace()[0]['args'][0]; + } +} + +$v = main(); + +var_dump($v->getValue()->getId()); + +echo "Before unset", PHP_EOL; + +unset($v); + +echo "After unset", PHP_EOL; + +?> +--EXPECT-- +Before 1 +CustomDestructor::__construct - 1 +CustomDestructor::__destruct - 1 +After 1 +Before 2 +CustomDestructor::__construct - 2 +catch +int(2) +Before unset +CustomDestructor::__destruct - 2 +After unset diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt new file mode 100644 index 0000000000000..86cbc2a1ae3e5 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue does not allow dynamic properties. +--FILE-- +foo = 'bar'; + +?> +--EXPECTF-- +Fatal error: Uncaught Error: Cannot create dynamic property SensitiveParameterValue::$foo in %ssensitive_parameter_value_no_dynamic_property.php:5 +Stack trace: +#0 {main} + thrown in %ssensitive_parameter_value_no_dynamic_property.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt new file mode 100644 index 0000000000000..020cbef38d269 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue's value is accessible using reflection. +--FILE-- +getProperty('value'); + +var_dump($p->getValue($v)); + +?> +--EXPECTF-- +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt new file mode 100644 index 0000000000000..79a2e359cd8cb --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt @@ -0,0 +1,16 @@ +--TEST-- +A SensitiveParameterValue may not be serialized. +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Exception: Serialization of 'SensitiveParameterValue' is not allowed in %ssensitive_parameter_value_serialize.php:5 +Stack trace: +#0 %ssensitive_parameter_value_serialize.php(5): serialize(Object(SensitiveParameterValue)) +#1 {main} + thrown in %ssensitive_parameter_value_serialize.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt new file mode 100644 index 0000000000000..5945259224ab8 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue may not be converted to a string. +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Object of class SensitiveParameterValue could not be converted to string in %ssensitive_parameter_value_to_string.php:5 +Stack trace: +#0 {main} + thrown in %ssensitive_parameter_value_to_string.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt new file mode 100644 index 0000000000000..3d9bf20a978c2 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute suppresses all variadic arguments. +--FILE-- +getTrace()); +} + +test('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_variadic_arguments.php(12): test(Object(SensitiveParameterValue), Object(SensitiveParameterValue), Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_variadic_arguments.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_variadic_arguments.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/generators/gh8289.phpt b/Zend/tests/generators/gh8289.phpt new file mode 100644 index 0000000000000..f5bb1fc64be0b --- /dev/null +++ b/Zend/tests/generators/gh8289.phpt @@ -0,0 +1,34 @@ +--TEST-- +GH-8289 (Exceptions thrown within a yielded from iterator are not rethrown into the generator) +--FILE-- + $v) { + var_dump($v); +} + +?> +--EXPECTF-- +int(1) +Exception in %s:%d +Stack trace: +#0 %s(%d): IteratorIterator@anonymous->key() +#1 %s(%d): yieldFromIteratorGeneratorThrows() +#2 {main} +int(2) diff --git a/Zend/tests/generators/yield_from_throw_with_throwing_exception.phpt b/Zend/tests/generators/yield_from_throw_with_throwing_exception.phpt new file mode 100644 index 0000000000000..2217670f31f84 --- /dev/null +++ b/Zend/tests/generators/yield_from_throw_with_throwing_exception.phpt @@ -0,0 +1,28 @@ +--TEST-- +Exceptions are properly appended when thrown from yield from values destruction +--FILE-- +throw(new Exception("outer")); + +?> +--EXPECTF-- +Fatal error: Uncaught Exception: outer in %s:%d +Stack trace: +#0 {main} + +Next Exception: dtor in %s:%d +Stack trace: +#0 %s(%d): class@anonymous->__destruct() +#1 [internal function]: gen() +#2 %s(%d): Generator->throw(Object(Exception)) +#3 {main} + thrown %s on line %d diff --git a/Zend/tests/type_declarations/standalone_null.phpt b/Zend/tests/type_declarations/standalone_null.phpt new file mode 100644 index 0000000000000..d96a1f471e483 --- /dev/null +++ b/Zend/tests/type_declarations/standalone_null.phpt @@ -0,0 +1,14 @@ +--TEST-- +Null can be used as a standalone type +--FILE-- + +--EXPECT-- +NULL diff --git a/Zend/tests/type_declarations/typed_properties_110.phpt b/Zend/tests/type_declarations/typed_properties_110.phpt new file mode 100644 index 0000000000000..6a108b4529c66 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_110.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties allow null +--FILE-- +value = null; + +try { + $foo->value = 1; +} catch (\TypeError $e) { + echo $e->getMessage(); +} + +?> +--EXPECT-- +Cannot assign int to property Foo::$value of type null diff --git a/Zend/tests/type_declarations/typed_properties_111.phpt b/Zend/tests/type_declarations/typed_properties_111.phpt new file mode 100644 index 0000000000000..c23fb72e5d657 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_111.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties allow false +--FILE-- +value = false; + +try { + $foo->value = true; +} catch (\TypeError $e) { + echo $e->getMessage(); +} + +?> +--EXPECT-- +Cannot assign bool to property Foo::$value of type false diff --git a/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt b/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt new file mode 100644 index 0000000000000..ae785c9a126d3 --- /dev/null +++ b/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt @@ -0,0 +1,14 @@ +--TEST-- +Typed null|false return without value generates compile-time error +--FILE-- + +--EXPECTF-- +Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in %s on line %d diff --git a/Zend/tests/type_declarations/typed_return_null_without_value.phpt b/Zend/tests/type_declarations/typed_return_null_without_value.phpt new file mode 100644 index 0000000000000..9152622a4a338 --- /dev/null +++ b/Zend/tests/type_declarations/typed_return_null_without_value.phpt @@ -0,0 +1,14 @@ +--TEST-- +Typed null return without value generates compile-time error +--FILE-- + +--EXPECTF-- +Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/null_false_union.phpt b/Zend/tests/type_declarations/union_types/null_false_union.phpt new file mode 100644 index 0000000000000..1cf6b46066189 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/null_false_union.phpt @@ -0,0 +1,12 @@ +--TEST-- +Null and false can be used in a union type +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt index 0e0e915bdd223..9c35978576237 100644 --- a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt +++ b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt @@ -8,4 +8,4 @@ function test(): ?null { ?> --EXPECTF-- -Fatal error: Null cannot be used as a standalone type in %s on line %d +Fatal error: null cannot be marked as nullable in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/standalone_false.phpt b/Zend/tests/type_declarations/union_types/standalone_false.phpt index 76d8c9b7a1ede..1a31e23d22988 100644 --- a/Zend/tests/type_declarations/union_types/standalone_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_false.phpt @@ -1,10 +1,11 @@ --TEST-- -False cannot be used as a standalone type +False can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: False cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt b/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt new file mode 100644 index 0000000000000..3baac82f7e905 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt @@ -0,0 +1,11 @@ +--TEST-- +False can be used as a standalone type even with implicit nullability +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_null.phpt b/Zend/tests/type_declarations/union_types/standalone_null.phpt index d66f27c117a75..a18375d68cb4e 100644 --- a/Zend/tests/type_declarations/union_types/standalone_null.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_null.phpt @@ -1,10 +1,11 @@ --TEST-- -Null cannot be used as a standalone type +Null can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: Null cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt index aa1bf34db1eb9..b4a3f88451ae0 100644 --- a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt @@ -1,10 +1,11 @@ --TEST-- -Nullable false cannot be used as a standalone type +Nullable false can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: False cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index f517b1231d1d2..9e10e6971f810 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -27,13 +27,7 @@ #include "zend.h" #ifndef ZEND_MM_ALIGNMENT -# define ZEND_MM_ALIGNMENT Z_UL(8) -# define ZEND_MM_ALIGNMENT_LOG2 Z_L(3) -#elif ZEND_MM_ALIGNMENT < 4 -# undef ZEND_MM_ALIGNMENT -# undef ZEND_MM_ALIGNMENT_LOG2 -# define ZEND_MM_ALIGNMENT Z_UL(4) -# define ZEND_MM_ALIGNMENT_LOG2 Z_L(2) +# error "ZEND_MM_ALIGNMENT was not defined during configure" #endif #define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT - 1) diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 8a37375247269..9f7b8f01448b5 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -21,11 +21,16 @@ #include "zend_API.h" #include "zend_attributes.h" #include "zend_attributes_arginfo.h" +#include "zend_exceptions.h" #include "zend_smart_str.h" ZEND_API zend_class_entry *zend_ce_attribute; ZEND_API zend_class_entry *zend_ce_return_type_will_change_attribute; ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties; +ZEND_API zend_class_entry *zend_ce_sensitive_parameter; +ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value; + +static zend_object_handlers attributes_object_handlers_sensitive_parameter_value; static HashTable internal_attributes; @@ -91,6 +96,53 @@ ZEND_METHOD(AllowDynamicProperties, __construct) ZEND_PARSE_PARAMETERS_NONE(); } +ZEND_METHOD(SensitiveParameter, __construct) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +ZEND_METHOD(SensitiveParameterValue, __construct) +{ + zval *value; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(value) + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), value); +} + +ZEND_METHOD(SensitiveParameterValue, getValue) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + ZVAL_COPY(return_value, OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0)); +} + +ZEND_METHOD(SensitiveParameterValue, __debugInfo) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + RETURN_EMPTY_ARRAY(); +} + +static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce) +{ + zend_object *object; + + object = zend_objects_new(ce); + object->handlers = &attributes_object_handlers_sensitive_parameter_value; + + object_properties_init(object, ce); + + return object; +} + +static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose) +{ + return NULL; +} + static zend_attribute *get_attribute(HashTable *attributes, zend_string *lcname, uint32_t offset) { if (attributes) { @@ -112,10 +164,8 @@ static zend_attribute *get_attribute_str(HashTable *attributes, const char *str, zend_attribute *attr; ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { - if (attr->offset == offset && ZSTR_LEN(attr->lcname) == len) { - if (0 == memcmp(ZSTR_VAL(attr->lcname), str, len)) { - return attr; - } + if (attr->offset == offset && zend_string_equals_cstr(attr->lcname, str, len)) { + return attr; } } ZEND_HASH_FOREACH_END(); } @@ -315,6 +365,16 @@ void zend_register_attribute_ce(void) zend_ce_allow_dynamic_properties = register_class_AllowDynamicProperties(); attr = zend_internal_attribute_register(zend_ce_allow_dynamic_properties, ZEND_ATTRIBUTE_TARGET_CLASS); attr->validator = validate_allow_dynamic_properties; + + zend_ce_sensitive_parameter = register_class_SensitiveParameter(); + attr = zend_internal_attribute_register(zend_ce_sensitive_parameter, ZEND_ATTRIBUTE_TARGET_PARAMETER); + + memcpy(&attributes_object_handlers_sensitive_parameter_value, &std_object_handlers, sizeof(zend_object_handlers)); + attributes_object_handlers_sensitive_parameter_value.get_properties_for = attributes_sensitive_parameter_value_get_properties_for; + + /* This is not an actual attribute, thus the zend_internal_attribute_register() call is missing. */ + zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue(); + zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new; } void zend_attributes_shutdown(void) diff --git a/Zend/zend_attributes.h b/Zend/zend_attributes.h index a55dc562450d2..7b6c919527d34 100644 --- a/Zend/zend_attributes.h +++ b/Zend/zend_attributes.h @@ -41,6 +41,8 @@ BEGIN_EXTERN_C() extern ZEND_API zend_class_entry *zend_ce_attribute; extern ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties; +extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter; +extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value; typedef struct { zend_string *name; diff --git a/Zend/zend_attributes.stub.php b/Zend/zend_attributes.stub.php index 0469016704b16..842ed9229cd6e 100644 --- a/Zend/zend_attributes.stub.php +++ b/Zend/zend_attributes.stub.php @@ -18,3 +18,26 @@ final class AllowDynamicProperties { public function __construct() {} } + +/** + * @strict-properties + */ +final class SensitiveParameter +{ + public function __construct() {} +} + +/** + * @strict-properties + * @not-serializable + */ +final class SensitiveParameterValue +{ + private readonly mixed $value; + + public function __construct(mixed $value) {} + + public function getValue(): mixed {} + + public function __debugInfo(): array {} +} diff --git a/Zend/zend_attributes_arginfo.h b/Zend/zend_attributes_arginfo.h index 657ab924c745a..7c624949bf24b 100644 --- a/Zend/zend_attributes_arginfo.h +++ b/Zend/zend_attributes_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 024e849a9dfa8789f13dd1d2ac222a48e4b017f1 */ + * Stub hash: 5d9a092c1f0da5f32d9a161cc5166ed794ffe8e9 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Attribute___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "Attribute::TARGET_ALL") @@ -10,10 +10,26 @@ ZEND_END_ARG_INFO() #define arginfo_class_AllowDynamicProperties___construct arginfo_class_ReturnTypeWillChange___construct +#define arginfo_class_SensitiveParameter___construct arginfo_class_ReturnTypeWillChange___construct + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SensitiveParameterValue___construct, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue_getValue, 0, 0, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue___debugInfo, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + ZEND_METHOD(Attribute, __construct); ZEND_METHOD(ReturnTypeWillChange, __construct); ZEND_METHOD(AllowDynamicProperties, __construct); +ZEND_METHOD(SensitiveParameter, __construct); +ZEND_METHOD(SensitiveParameterValue, __construct); +ZEND_METHOD(SensitiveParameterValue, getValue); +ZEND_METHOD(SensitiveParameterValue, __debugInfo); static const zend_function_entry class_Attribute_methods[] = { @@ -33,6 +49,20 @@ static const zend_function_entry class_AllowDynamicProperties_methods[] = { ZEND_FE_END }; + +static const zend_function_entry class_SensitiveParameter_methods[] = { + ZEND_ME(SensitiveParameter, __construct, arginfo_class_SensitiveParameter___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + +static const zend_function_entry class_SensitiveParameterValue_methods[] = { + ZEND_ME(SensitiveParameterValue, __construct, arginfo_class_SensitiveParameterValue___construct, ZEND_ACC_PUBLIC) + ZEND_ME(SensitiveParameterValue, getValue, arginfo_class_SensitiveParameterValue_getValue, ZEND_ACC_PUBLIC) + ZEND_ME(SensitiveParameterValue, __debugInfo, arginfo_class_SensitiveParameterValue___debugInfo, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + static zend_class_entry *register_class_Attribute(void) { zend_class_entry ce, *class_entry; @@ -71,3 +101,31 @@ static zend_class_entry *register_class_AllowDynamicProperties(void) return class_entry; } + +static zend_class_entry *register_class_SensitiveParameter(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SensitiveParameter", class_SensitiveParameter_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES; + + return class_entry; +} + +static zend_class_entry *register_class_SensitiveParameterValue(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SensitiveParameterValue", class_SensitiveParameterValue_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE; + + zval property_value_default_value; + ZVAL_UNDEF(&property_value_default_value); + zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1); + zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PRIVATE|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY)); + zend_string_release(property_value_name); + + return class_entry; +} diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 529ade072aa24..963332e0f7ed8 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -24,6 +24,7 @@ #include "zend_builtin_functions.h" #include "zend_constants.h" #include "zend_ini.h" +#include "zend_interfaces.h" #include "zend_exceptions.h" #include "zend_extensions.h" #include "zend_closures.h" @@ -1557,27 +1558,66 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / */ while (i < first_extra_arg) { zend_string *arg_name = call->func->op_array.vars[i]; + zval original_arg; zval *arg = zend_hash_find_ex_ind(call->symbol_table, arg_name, 1); + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + i + ); + + bool is_sensitive = attribute != NULL; + if (arg) { ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); + } else { + ZVAL_NULL(&original_arg); + } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); } else { - ZEND_HASH_FILL_SET_NULL(); + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); } + ZEND_HASH_FILL_NEXT(); i++; } } else { while (i < first_extra_arg) { + zval original_arg; + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + i + ); + bool is_sensitive = attribute != NULL; + if (EXPECTED(Z_TYPE_INFO_P(p) != IS_UNDEF)) { zval *arg = p; ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); + } else { + ZVAL_NULL(&original_arg); + } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); } else { - ZEND_HASH_FILL_SET_NULL(); + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); } + ZEND_HASH_FILL_NEXT(); p++; i++; @@ -1587,14 +1627,37 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / } while (i < num_args) { + zval original_arg; + bool is_sensitive = 0; + + if (i < call->func->common.num_args || call->func->common.fn_flags & ZEND_ACC_VARIADIC) { + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + MIN(i, call->func->common.num_args) + ); + is_sensitive = attribute != NULL; + } + if (EXPECTED(Z_TYPE_INFO_P(p) != IS_UNDEF)) { zval *arg = p; ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); } else { - ZEND_HASH_FILL_SET_NULL(); + ZVAL_NULL(&original_arg); } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); + } else { + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); + } + ZEND_HASH_FILL_NEXT(); p++; i++; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 039e95913f6d3..444dee5b0d7d4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -266,9 +266,7 @@ static zend_always_inline bool zend_is_confusable_type(const zend_string *name, /* Intentionally using case-sensitive comparison here, because "integer" is likely intended * as a scalar type, while "Integer" is likely a class type. */ for (; info->name; ++info) { - if (ZSTR_LEN(name) == info->name_len - && memcmp(ZSTR_VAL(name), info->name, info->name_len) == 0 - ) { + if (zend_string_equals_cstr(name, info->name, info->name_len)) { *correct_name = info->correct_name; return 1; } @@ -3379,7 +3377,7 @@ static uint32_t zend_get_arg_num(zend_function *fn, zend_string *arg_name) { for (uint32_t i = 0; i < fn->common.num_args; i++) { zend_internal_arg_info *arg_info = &fn->internal_function.arg_info[i]; size_t len = strlen(arg_info->name); - if (len == ZSTR_LEN(arg_name) && !memcmp(arg_info->name, ZSTR_VAL(arg_name), len)) { + if (zend_string_equals_cstr(arg_name, arg_info->name, len)) { return i + 1; } } @@ -6188,11 +6186,11 @@ static bool zend_type_contains_traversable(zend_type type) { static zend_type zend_compile_typename( zend_ast *ast, bool force_allow_null) /* {{{ */ { - bool allow_null = force_allow_null; + bool is_marked_nullable = ast->attr & ZEND_TYPE_NULLABLE; zend_ast_attr orig_ast_attr = ast->attr; zend_type type = ZEND_TYPE_INIT_NONE(0); - if (ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; + + if (is_marked_nullable) { ast->attr &= ~ZEND_TYPE_NULLABLE; } @@ -6316,10 +6314,6 @@ static zend_type zend_compile_typename( type = zend_compile_single_typename(ast); } - if (allow_null) { - ZEND_TYPE_FULL_MASK(type) |= MAY_BE_NULL; - } - uint32_t type_mask = ZEND_TYPE_PURE_MASK(type); if ((type_mask & (MAY_BE_ARRAY|MAY_BE_ITERABLE)) == (MAY_BE_ARRAY|MAY_BE_ITERABLE)) { zend_string *type_str = zend_type_to_string(type); @@ -6334,7 +6328,7 @@ static zend_type zend_compile_typename( ZSTR_VAL(type_str)); } - if (type_mask == MAY_BE_ANY && (orig_ast_attr & ZEND_TYPE_NULLABLE)) { + if (type_mask == MAY_BE_ANY && is_marked_nullable) { zend_error_noreturn(E_COMPILE_ERROR, "Type mixed cannot be marked as nullable since mixed already includes null"); } @@ -6345,6 +6339,15 @@ static zend_type zend_compile_typename( ZSTR_VAL(type_str)); } + if ((type_mask & MAY_BE_NULL) && is_marked_nullable) { + zend_error_noreturn(E_COMPILE_ERROR, "null cannot be marked as nullable"); + } + + if (is_marked_nullable || force_allow_null) { + ZEND_TYPE_FULL_MASK(type) |= MAY_BE_NULL; + type_mask = ZEND_TYPE_PURE_MASK(type); + } + if ((type_mask & MAY_BE_VOID) && (ZEND_TYPE_IS_COMPLEX(type) || type_mask != MAY_BE_VOID)) { zend_error_noreturn(E_COMPILE_ERROR, "Void can only be used as a standalone type"); } @@ -6353,15 +6356,6 @@ static zend_type zend_compile_typename( zend_error_noreturn(E_COMPILE_ERROR, "never can only be used as a standalone type"); } - if ((type_mask & (MAY_BE_NULL|MAY_BE_FALSE)) - && !ZEND_TYPE_IS_COMPLEX(type) && !(type_mask & ~(MAY_BE_NULL|MAY_BE_FALSE))) { - if (type_mask == MAY_BE_NULL) { - zend_error_noreturn(E_COMPILE_ERROR, "Null cannot be used as a standalone type"); - } else { - zend_error_noreturn(E_COMPILE_ERROR, "False cannot be used as a standalone type"); - } - } - ast->attr = orig_ast_attr; return type; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5b2ce68ffb3b7..436a5a2fd2a94 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4516,11 +4516,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval } if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path)) { - zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); - zend_destroy_file_handle(&file_handle); - zend_string_release_ex(resolved_path, 0); - zend_tmp_string_release(tmp_inc_filename); - return op_array; + new_op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); } else { new_op_array = ZEND_FAKE_OP_ARRAY; } @@ -4675,7 +4671,7 @@ static zend_always_inline uint32_t zend_get_arg_offset_by_name( for (uint32_t i = 0; i < num_args; i++) { zend_internal_arg_info *arg_info = &fbc->internal_function.arg_info[i]; size_t len = strlen(arg_info->name); - if (len == ZSTR_LEN(arg_name) && !memcmp(arg_info->name, ZSTR_VAL(arg_name), len)) { + if (zend_string_equals_cstr(arg_name, arg_info->name, len)) { *cache_slot = fbc; *(uintptr_t *)(cache_slot + 1) = i; return i; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e791f986f8e74..e9ecc5d6697d6 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1817,8 +1817,7 @@ ZEND_API zend_result zend_set_local_var_str(const char *name, size_t len, zval * do { if (ZSTR_H(*str) == h && - ZSTR_LEN(*str) == len && - memcmp(ZSTR_VAL(*str), name, len) == 0) { + zend_string_equals_cstr(*str, name, len)) { zval *var = EX_VAR_NUM(str - op_array->vars); zval_ptr_dtor(var); ZVAL_COPY_VALUE(var, value); diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index c73563ec2f399..99c888ee09e93 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -458,21 +458,23 @@ static void zend_generator_throw_exception(zend_generator *generator, zval *exce { zend_execute_data *original_execute_data = EG(current_execute_data); - /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */ - if (UNEXPECTED(Z_TYPE(generator->values) != IS_UNDEF)) { - zval_ptr_dtor(&generator->values); - ZVAL_UNDEF(&generator->values); - } - /* Throw the exception in the context of the generator. Decrementing the opline * to pretend the exception happened during the YIELD opcode. */ EG(current_execute_data) = generator->execute_data; generator->execute_data->opline--; + if (exception) { zend_throw_exception_object(exception); } else { zend_rethrow_exception(EG(current_execute_data)); } + + /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */ + if (UNEXPECTED(Z_TYPE(generator->values) != IS_UNDEF)) { + zval_ptr_dtor(&generator->values); + ZVAL_UNDEF(&generator->values); + } + generator->execute_data->opline++; EG(current_execute_data) = original_execute_data; } @@ -603,6 +605,8 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator static zend_result zend_generator_get_next_delegated_value(zend_generator *generator) /* {{{ */ { + --generator->execute_data->opline; + zval *value; if (Z_TYPE(generator->values) == IS_ARRAY) { HashTable *ht = Z_ARR(generator->values); @@ -655,22 +659,17 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener if (iter->index++ > 0) { iter->funcs->move_forward(iter); if (UNEXPECTED(EG(exception) != NULL)) { - goto exception; + goto failure; } } if (iter->funcs->valid(iter) == FAILURE) { - if (UNEXPECTED(EG(exception) != NULL)) { - goto exception; - } /* reached end of iteration */ goto failure; } value = iter->funcs->get_current_data(iter); - if (UNEXPECTED(EG(exception) != NULL)) { - goto exception; - } else if (UNEXPECTED(!value)) { + if (UNEXPECTED(EG(exception) != NULL) || UNEXPECTED(!value)) { goto failure; } @@ -682,20 +681,21 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener iter->funcs->get_current_key(iter, &generator->key); if (UNEXPECTED(EG(exception) != NULL)) { ZVAL_UNDEF(&generator->key); - goto exception; + goto failure; } } else { ZVAL_LONG(&generator->key, iter->index); } } + + ++generator->execute_data->opline; return SUCCESS; -exception: - zend_generator_throw_exception(generator, NULL); - failure: zval_ptr_dtor(&generator->values); ZVAL_UNDEF(&generator->values); + + ++generator->execute_data->opline; return FAILURE; } /* }}} */ @@ -724,8 +724,33 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */ /* Drop the AT_FIRST_YIELD flag */ orig_generator->flags &= ~ZEND_GENERATOR_AT_FIRST_YIELD; + /* Backup executor globals */ + zend_execute_data *original_execute_data = EG(current_execute_data); + uint32_t original_jit_trace_num = EG(jit_trace_num); + + /* Set executor globals */ + EG(current_execute_data) = generator->execute_data; + EG(jit_trace_num) = 0; + + /* We want the backtrace to look as if the generator function was + * called from whatever method we are current running (e.g. next()). + * So we have to link generator call frame with caller call frame. */ + if (generator == orig_generator) { + generator->execute_data->prev_execute_data = original_execute_data; + } else { + /* We need some execute_data placeholder in stacktrace to be replaced + * by the real stack trace when needed */ + generator->execute_data->prev_execute_data = &orig_generator->execute_fake; + orig_generator->execute_fake.prev_execute_data = original_execute_data; + } + + /* Ensure this is run after executor_data swap to have a proper stack trace */ if (UNEXPECTED(!Z_ISUNDEF(generator->values))) { if (EXPECTED(zend_generator_get_next_delegated_value(generator) == SUCCESS)) { + /* Restore executor globals */ + EG(current_execute_data) = original_execute_data; + EG(jit_trace_num) = original_jit_trace_num; + orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT; return; } @@ -733,85 +758,63 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */ * after the "yield from" expression. */ } - { - /* Backup executor globals */ - zend_execute_data *original_execute_data = EG(current_execute_data); - uint32_t original_jit_trace_num = EG(jit_trace_num); - - /* Set executor globals */ - EG(current_execute_data) = generator->execute_data; - EG(jit_trace_num) = 0; - - /* We want the backtrace to look as if the generator function was - * called from whatever method we are current running (e.g. next()). - * So we have to link generator call frame with caller call frame. */ - if (generator == orig_generator) { - generator->execute_data->prev_execute_data = original_execute_data; - } else { - /* We need some execute_data placeholder in stacktrace to be replaced - * by the real stack trace when needed */ - generator->execute_data->prev_execute_data = &orig_generator->execute_fake; - orig_generator->execute_fake.prev_execute_data = original_execute_data; - } + if (UNEXPECTED(generator->frozen_call_stack)) { + /* Restore frozen call-stack */ + zend_generator_restore_call_stack(generator); + } - if (UNEXPECTED(generator->frozen_call_stack)) { - /* Restore frozen call-stack */ - zend_generator_restore_call_stack(generator); + /* Resume execution */ + generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING; + if (!ZEND_OBSERVER_ENABLED) { + zend_execute_ex(generator->execute_data); + } else { + zend_observer_generator_resume(generator->execute_data); + zend_execute_ex(generator->execute_data); + if (generator->execute_data) { + /* On the final return, this will be called from ZEND_GENERATOR_RETURN */ + zend_observer_fcall_end(generator->execute_data, &generator->value); } + } + generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING; - /* Resume execution */ - generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING; - if (!ZEND_OBSERVER_ENABLED) { - zend_execute_ex(generator->execute_data); - } else { - zend_observer_generator_resume(generator->execute_data); - zend_execute_ex(generator->execute_data); - if (generator->execute_data) { - /* On the final return, this will be called from ZEND_GENERATOR_RETURN */ - zend_observer_fcall_end(generator->execute_data, &generator->value); - } - } - generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING; + generator->frozen_call_stack = NULL; + if (EXPECTED(generator->execute_data) && + UNEXPECTED(generator->execute_data->call)) { + /* Frize call-stack */ + generator->frozen_call_stack = zend_generator_freeze_call_stack(generator->execute_data); + } - generator->frozen_call_stack = NULL; - if (EXPECTED(generator->execute_data) && - UNEXPECTED(generator->execute_data->call)) { - /* Frize call-stack */ - generator->frozen_call_stack = zend_generator_freeze_call_stack(generator->execute_data); - } + /* Restore executor globals */ + EG(current_execute_data) = original_execute_data; + EG(jit_trace_num) = original_jit_trace_num; - /* Restore executor globals */ - EG(current_execute_data) = original_execute_data; - EG(jit_trace_num) = original_jit_trace_num; - - /* If an exception was thrown in the generator we have to internally - * rethrow it in the parent scope. - * In case we did yield from, the Exception must be rethrown into - * its calling frame (see above in if (check_yield_from). */ - if (UNEXPECTED(EG(exception) != NULL)) { - if (generator == orig_generator) { - zend_generator_close(generator, 0); - if (!EG(current_execute_data)) { - zend_throw_exception_internal(NULL); - } else if (EG(current_execute_data)->func && - ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) { - zend_rethrow_exception(EG(current_execute_data)); - } - } else { - generator = zend_generator_get_current(orig_generator); - zend_generator_throw_exception(generator, NULL); - orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT; - goto try_again; + /* If an exception was thrown in the generator we have to internally + * rethrow it in the parent scope. + * In case we did yield from, the Exception must be rethrown into + * its calling frame (see above in if (check_yield_from). */ + if (UNEXPECTED(EG(exception) != NULL)) { + if (generator == orig_generator) { + zend_generator_close(generator, 0); + if (!EG(current_execute_data)) { + zend_throw_exception_internal(NULL); + } else if (EG(current_execute_data)->func && + ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) { + zend_rethrow_exception(EG(current_execute_data)); } - } - - /* yield from was used, try another resume. */ - if (UNEXPECTED((generator != orig_generator && !Z_ISUNDEF(generator->retval)) || (generator->execute_data && (generator->execute_data->opline - 1)->opcode == ZEND_YIELD_FROM))) { + } else { generator = zend_generator_get_current(orig_generator); + zend_generator_throw_exception(generator, NULL); + orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT; goto try_again; } } + /* yield from was used, try another resume. */ + if (UNEXPECTED((generator != orig_generator && !Z_ISUNDEF(generator->retval)) || (generator->execute_data && (generator->execute_data->opline - 1)->opcode == ZEND_YIELD_FROM))) { + generator = zend_generator_get_current(orig_generator); + goto try_again; + } + orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT; } /* }}} */ diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 6e809c873417a..eca8812325db8 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -711,8 +711,7 @@ static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, p = HT_HASH_TO_BUCKET_EX(arData, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { return p; } idx = Z_NEXT(p->val); @@ -1556,8 +1555,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const ch p = HT_HASH_TO_BUCKET(ht, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { if (Z_TYPE(p->val) == IS_INDIRECT) { zval *data = Z_INDIRECT(p->val); @@ -1602,8 +1600,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char * p = HT_HASH_TO_BUCKET(ht, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { zend_string_release(p->key); p->key = NULL; _zend_hash_del_el_ex(ht, idx, p, prev); @@ -2866,6 +2863,16 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b ht->nNumUsed = i; } + if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { + /* We broke the hash colisions chains overriding Z_NEXT() by Z_EXTRA(). + * Reset the hash headers table as well to avoid possilbe inconsistent + * access on recursive data structures. + * + * See Zend/tests/bug63882_2.phpt + */ + HT_HASH_RESET(ht); + } + sort((void *)ht->arData, ht->nNumUsed, sizeof(Bucket), (compare_func_t) compar, (swap_func_t)(renumber? zend_hash_bucket_renum_swap : (HT_IS_PACKED(ht) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); diff --git a/Zend/zend_string.c b/Zend/zend_string.c index c24d5dfcdb478..1284e908a55b1 100644 --- a/Zend/zend_string.c +++ b/Zend/zend_string.c @@ -135,10 +135,8 @@ static zend_always_inline zend_string *zend_interned_string_ht_lookup_ex(zend_ul idx = HT_HASH(interned_strings, nIndex); while (idx != HT_INVALID_IDX) { p = HT_HASH_TO_BUCKET(interned_strings, idx); - if ((p->h == h) && (ZSTR_LEN(p->key) == size)) { - if (!memcmp(ZSTR_VAL(p->key), str, size)) { - return p->key; - } + if ((p->h == h) && zend_string_equals_cstr(p->key, str, size)) { + return p->key; } idx = Z_NEXT(p->val); } diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 19cd926eff7be..06a4edc01ae51 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -339,6 +339,11 @@ static zend_always_inline void zend_string_release_ex(zend_string *s, bool persi } } +static zend_always_inline bool zend_string_equals_cstr(const zend_string *s1, const char *s2, size_t s2_length) +{ + return ZSTR_LEN(s1) == s2_length && !memcmp(ZSTR_VAL(s1), s2, s2_length); +} + #if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__))) BEGIN_EXTERN_C() ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2); @@ -367,7 +372,20 @@ static zend_always_inline bool zend_string_equals(zend_string *s1, zend_string * (ZSTR_LEN(str) == sizeof(c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1)) #define zend_string_equals_literal(str, literal) \ - (ZSTR_LEN(str) == sizeof(literal)-1 && !memcmp(ZSTR_VAL(str), literal, sizeof(literal) - 1)) + zend_string_equals_cstr(str, literal, strlen(literal)) + +static zend_always_inline bool zend_string_starts_with_cstr(const zend_string *str, const char *prefix, size_t prefix_length) +{ + return ZSTR_LEN(str) >= prefix_length && !memcmp(ZSTR_VAL(str), prefix, prefix_length); +} + +static zend_always_inline bool zend_string_starts_with(const zend_string *str, const zend_string *prefix) +{ + return zend_string_starts_with_cstr(str, ZSTR_VAL(prefix), ZSTR_LEN(prefix)); +} + +#define zend_string_starts_with_literal(str, prefix) \ + zend_string_starts_with_cstr(str, prefix, strlen(prefix)) /* * DJBX33A (Daniel J. Bernstein, Times 33 with Addition) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5207a09d34dea..bbba2ca0dfc97 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2548,7 +2548,18 @@ ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(O ZEND_VM_C_LABEL(try_assign_dim_array): SEPARATE_ARRAY(object_ptr); if (OP2_TYPE == IS_UNUSED) { - value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R); + if (OP_DATA_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + ZEND_VM_C_GOTO(assign_dim_error); + } + } if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) { ZVAL_DEREF(value); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index cb9654688e919..1b27785470062 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23443,6 +23443,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -23580,6 +23591,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -23718,6 +23740,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -23855,7 +23888,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -26098,6 +26142,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -26235,6 +26290,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -26373,6 +26439,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -26510,7 +26587,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -27585,6 +27673,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -27722,6 +27821,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -27860,6 +27970,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -27997,7 +28118,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -30217,6 +30349,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -30354,6 +30497,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -30492,6 +30646,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -30629,7 +30794,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -41262,6 +41438,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -41399,6 +41586,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -41537,6 +41735,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -41674,7 +41883,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -45002,6 +45222,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -45139,6 +45370,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -45277,6 +45519,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -45414,7 +45667,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -46936,6 +47200,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -47073,6 +47348,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -47211,6 +47497,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -47348,7 +47645,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -50237,6 +50545,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -50374,6 +50693,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -50512,6 +50842,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -50649,7 +50990,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2489cd40072e3..abb7c3f970923 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -27,20 +27,11 @@ schedules: - master jobs: - # Azure pipelines don't work atm - # - template: azure/i386/job.yml - # parameters: - # configurationName: I386_DEBUG_ZTS - # configurationParameters: '--enable-debug --enable-zts' + - template: azure/i386/job.yml + parameters: + configurationName: I386_DEBUG_ZTS + configurationParameters: '--enable-debug --enable-zts' - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - - template: azure/job.yml - parameters: - configurationName: DEBUG_ZTS - configurationParameters: '--enable-debug --enable-zts' - - template: azure/job.yml - parameters: - configurationName: RELEASE_NTS - configurationParameters: '--disable-debug --disable-zts' - template: azure/i386/job.yml parameters: configurationName: I386_DEBUG_NTS @@ -53,30 +44,6 @@ jobs: parameters: configurationName: I386_RELEASE_ZTS configurationParameters: '--disable-debug --enable-zts' - - template: azure/macos/job.yml - parameters: - configurationName: MACOS_DEBUG_ZTS - configurationParameters: '--enable-debug --enable-zts' - - template: azure/macos/job.yml - parameters: - configurationName: MACOS_RELEASE_NTS - configurationParameters: '--disable-debug --disable-zts' - - template: azure/macos/job.yml - parameters: - configurationName: MACOS_RELEASE_ZTS - configurationParameters: '--disable-debug --enable-zts' - - template: azure/job.yml - parameters: - configurationName: DEBUG_ZTS_ASAN_UBSAN - configurationParameters: '--enable-debug --enable-zts --enable-address-sanitizer --enable-undefined-sanitizer' - runTestsParameters: --asan - timeoutInMinutes: 360 - - template: azure/msan_job.yml - parameters: - configurationName: DEBUG_ZTS_MSAN - configurationParameters: '--enable-debug --enable-zts' - runTestsParameters: --msan - timeoutInMinutes: 120 - template: azure/community_job.yml parameters: configurationName: COMMUNITY diff --git a/azure/macos/brew.yml b/azure/macos/brew.yml deleted file mode 100644 index df4c5a532d740..0000000000000 --- a/azure/macos/brew.yml +++ /dev/null @@ -1,33 +0,0 @@ -parameters: - packages: '' - -steps: - - script: | - brew install pkg-config \ - autoconf \ - bison \ - re2c - displayName: 'Install Build Tools' - - script: | - brew install openssl@1.1 \ - krb5 \ - bzip2 \ - enchant \ - libffi \ - libpng \ - webp \ - freetype \ - intltool \ - icu4c \ - libiconv \ - zlib \ - t1lib \ - gd \ - libzip \ - gmp \ - tidyp \ - libxml2 \ - libxslt \ - postgresql - brew link icu4c gettext --force - displayName: 'Install Build Dependencies' diff --git a/azure/macos/job.yml b/azure/macos/job.yml deleted file mode 100644 index ed2e8d9d223e1..0000000000000 --- a/azure/macos/job.yml +++ /dev/null @@ -1,98 +0,0 @@ -parameters: - configurationName: '' - configurationParameters: '' - -jobs: - - job: ${{ parameters.configurationName }} - pool: - vmImage: 'macOS-10.15' - steps: - - template: brew.yml - - script: | - export PATH="/usr/local/opt/bison/bin:$PATH" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/openssl@1.1/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/krb5/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/libffi/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/libxml2/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/libxslt/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/zlib/lib/pkgconfig" - export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/icu4c/lib/pkgconfig" - ./buildconf --force - ./configure ${{ parameters.configurationParameters }} \ - --enable-option-checking=fatal \ - --prefix=/usr/local \ - --enable-fpm \ - --with-pdo-mysql=mysqlnd \ - --with-mysqli=mysqlnd \ - --with-pgsql=/usr/local/opt/libpq \ - --with-pdo-pgsql=/usr/local/opt/libpq \ - --with-pdo-sqlite \ - --without-pear \ - --enable-gd \ - --with-jpeg \ - --with-webp \ - --with-freetype \ - --enable-exif \ - --with-zip \ - --with-zlib \ - --enable-soap \ - --enable-xmlreader \ - --with-xsl \ - --with-tidy=/usr/local/opt/tidyp \ - --with-libxml \ - --enable-sysvsem \ - --enable-sysvshm \ - --enable-shmop \ - --enable-pcntl \ - --with-readline=/usr/local/opt/readline \ - --enable-mbstring \ - --with-curl \ - --with-gettext=/usr/local/opt/gettext \ - --enable-sockets \ - --with-bz2=/usr/local/opt/bzip2 \ - --with-openssl \ - --with-gmp=/usr/local/opt/gmp \ - --with-iconv=/usr/local/opt/libiconv \ - --enable-bcmath \ - --enable-calendar \ - --enable-ftp \ - --with-pspell=/usr/local/opt/aspell \ - --with-kerberos \ - --enable-sysvmsg \ - --with-ffi \ - --enable-zend-test \ - --enable-intl \ - --with-mhash \ - --with-sodium \ - --enable-dba \ - --enable-werror \ - --with-config-file-path=/etc \ - --with-config-file-scan-dir=/etc/php.d - displayName: 'Configure Build' - - script: | - export PATH="/usr/local/opt/bison/bin:$PATH" - make -j$(sysctl -n hw.logicalcpu) >/dev/null - displayName: 'Make Build' - - script: | - sudo make install - displayName: 'Install Build' - - template: test.yml - parameters: - configurationName: ${{ parameters.configurationName }} - - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - - template: test.yml - parameters: - configurationName: ${{ parameters.configurationName }} - runTestsName: 'OpCache' - runTestsParameters: -d zend_extension=opcache.so -d opcache.enable_cli=1 -d opcache.protect_memory=1 - - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - - template: test.yml - parameters: - configurationName: ${{ parameters.configurationName }} - runTestsName: 'Function JIT' - runTestsParameters: -d zend_extension=opcache.so -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit_buffer_size=16M -d opcache.jit=1205 - - template: test.yml - parameters: - configurationName: ${{ parameters.configurationName }} - runTestsName: 'Tracing JIT' - runTestsParameters: -d zend_extension=opcache.so -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit_buffer_size=16M diff --git a/azure/macos/test.yml b/azure/macos/test.yml deleted file mode 100644 index cc7db39660497..0000000000000 --- a/azure/macos/test.yml +++ /dev/null @@ -1,29 +0,0 @@ -parameters: - runTestsName: '' - runTestsParameters: '' - -steps: - - script: | - export TEST_PHP_JUNIT=junit.xml - export REPORT_EXIT_STATUS=no - export SKIP_IO_CAPTURE_TESTS=1 - export CI_NO_IPV6=1 - rm -rf junit.xml | true - sapi/cli/php run-tests.php -P -q \ - -j$(sysctl -n hw.ncpu) \ - -g FAIL,XFAIL,BORK,WARN,LEAK,XLEAK,SKIP \ - --offline \ - --show-diff \ - --show-slow 1000 \ - --set-timeout 120 \ - ${{ parameters.runTestsParameters }} - displayName: 'Test ${{ parameters.configurationName }} ${{ parameters.runTestsName }}' - condition: or(succeeded(), failed()) - - task: PublishTestResults@2 - inputs: - testResultsFormat: 'JUnit' - testResultsFiles: junit.xml - testRunTitle: '${{ parameters.configurationName }} ${{ parameters.runTestsName }}' - failTaskOnFailedTests: true - displayName: 'Export ${{ parameters.configurationName }} ${{ parameters.runTestsName }} Results' - condition: or(succeeded(), failed()) diff --git a/build/php.m4 b/build/php.m4 index 94e824f6cc263..fb28f462396fc 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -2152,7 +2152,7 @@ EOF else break fi - $as_echo "$CURRENT_ARG \\" >>$1 + AS_ECHO(["$CURRENT_ARG \\"]) >>$1 CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS $CURRENT_ARG" done echo '"[$]@"' >> $1 diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 3292458d63554..0062586c64ec9 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1991,6 +1991,54 @@ static void free_cb(void *arg) /* {{{ */ /* }}} */ #endif +static inline CURLcode add_simple_field(curl_mime *mime, zend_string *string_key, zval *current) +{ + CURLcode error = CURLE_OK; +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ + curl_mimepart *part; + CURLcode form_error; +#else + struct HttpPost *first = NULL; + struct HttpPost *last = NULL; + CURLFORMcode form_error; +#endif + zend_string *postval, *tmp_postval; + + postval = zval_get_tmp_string(current, &tmp_postval); + +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ + part = curl_mime_addpart(mime); + if (part == NULL) { + zend_tmp_string_release(tmp_postval); + zend_string_release_ex(string_key, 0); + return CURLE_OUT_OF_MEMORY; + } + if ((form_error = curl_mime_name(part, ZSTR_VAL(string_key))) != CURLE_OK + || (form_error = curl_mime_data(part, ZSTR_VAL(postval), ZSTR_LEN(postval))) != CURLE_OK) { + error = form_error; + } +#else + /* The arguments after _NAMELENGTH and _CONTENTSLENGTH + * must be explicitly cast to long in curl_formadd + * use since curl needs a long not an int. */ + form_error = curl_formadd(&first, &last, + CURLFORM_COPYNAME, ZSTR_VAL(string_key), + CURLFORM_NAMELENGTH, ZSTR_LEN(string_key), + CURLFORM_COPYCONTENTS, ZSTR_VAL(postval), + CURLFORM_CONTENTSLENGTH, ZSTR_LEN(postval), + CURLFORM_END + ); + + if (form_error != CURL_FORMADD_OK) { + /* Not nice to convert between enums but we only have place for one error type */ + error = (CURLcode)form_error; + } +#endif + zend_tmp_string_release(tmp_postval); + + return error; +} + static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpostfields) /* {{{ */ { HashTable *postfields = Z_ARRVAL_P(zpostfields); @@ -2018,7 +2066,7 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo #endif ZEND_HASH_FOREACH_KEY_VAL(postfields, num_key, string_key, current) { - zend_string *postval, *tmp_postval; + zend_string *postval; /* Pretend we have a string_key here */ if (!string_key) { string_key = zend_long_to_str(num_key); @@ -2181,36 +2229,19 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo continue; } - postval = zval_get_tmp_string(current, &tmp_postval); + if (Z_TYPE_P(current) == IS_ARRAY) { + zval *current_element; + + ZEND_HASH_FOREACH_VAL(HASH_OF(current), current_element) { + add_simple_field(mime, string_key, current_element); + } ZEND_HASH_FOREACH_END(); -#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ - part = curl_mime_addpart(mime); - if (part == NULL) { - zend_tmp_string_release(tmp_postval); zend_string_release_ex(string_key, 0); - return FAILURE; - } - if ((form_error = curl_mime_name(part, ZSTR_VAL(string_key))) != CURLE_OK - || (form_error = curl_mime_data(part, ZSTR_VAL(postval), ZSTR_LEN(postval))) != CURLE_OK) { - error = form_error; + continue; } -#else - /* The arguments after _NAMELENGTH and _CONTENTSLENGTH - * must be explicitly cast to long in curl_formadd - * use since curl needs a long not an int. */ - form_error = curl_formadd(&first, &last, - CURLFORM_COPYNAME, ZSTR_VAL(string_key), - CURLFORM_NAMELENGTH, ZSTR_LEN(string_key), - CURLFORM_COPYCONTENTS, ZSTR_VAL(postval), - CURLFORM_CONTENTSLENGTH, ZSTR_LEN(postval), - CURLFORM_END); - if (form_error != CURL_FORMADD_OK) { - /* Not nice to convert between enums but we only have place for one error type */ - error = (CURLcode)form_error; - } -#endif - zend_tmp_string_release(tmp_postval); + add_simple_field(mime, string_key, current); + zend_string_release_ex(string_key, 0); } ZEND_HASH_FOREACH_END(); diff --git a/ext/curl/tests/curl_postfields_array.phpt b/ext/curl/tests/curl_postfields_array.phpt new file mode 100644 index 0000000000000..05aa91a3f06df --- /dev/null +++ b/ext/curl/tests/curl_postfields_array.phpt @@ -0,0 +1,64 @@ +--TEST-- +CURLOPT_POSTFIELDS with multi-value fields +--EXTENSIONS-- +curl +sockets +--FILE-- +\n"; + return; +} + +$url = "http://127.0.0.1:29999/get.inc?test=raw"; + +$fields = [ + 'single' => 'SingleValue', + 'multi' => [ + 'Multi1', + 'Multi2', + ] +]; + +$options = [ + CURLOPT_POST => 1, + CURLOPT_HEADER => 0, + CURLOPT_URL => $url, + CURLOPT_FRESH_CONNECT => 1, + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_FORBID_REUSE => 1, + CURLOPT_TIMEOUT => 1, + CURLOPT_POSTFIELDS => $fields, +]; + +$ch = curl_init(); +curl_setopt_array($ch, $options); + +$curl_content = curl_exec($ch); +curl_close($ch); + +$conn = stream_socket_accept($socket); +echo stream_get_contents($conn); +?> +--EXPECTF-- +POST /get.inc?test=raw HTTP/1.1 +Host: %s +Accept: */* +Content-Length: %d +Content-Type: multipart/form-data; boundary=------------------------%s + +--------------------------%s +Content-Disposition: form-data; name="single" + +SingleValue +--------------------------%s +Content-Disposition: form-data; name="multi" + +Multi1 +--------------------------%s +Content-Disposition: form-data; name="multi" + +Multi2 +--------------------------%s-- diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 411ef5b44254e..60cc4b3ab6cc9 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -270,340 +270,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0247C2 }, { "Asia/Famagusta" , 0x02493C }, { "Asia/Gaza" , 0x024D03 }, - { "Asia/Harbin" , 0x0251E7 }, - { "Asia/Hebron" , 0x02537C }, - { "Asia/Ho_Chi_Minh" , 0x025871 }, - { "Asia/Hong_Kong" , 0x025969 }, - { "Asia/Hovd" , 0x025C7C }, - { "Asia/Irkutsk" , 0x025F05 }, - { "Asia/Istanbul" , 0x026223 }, - { "Asia/Jakarta" , 0x0266DF }, - { "Asia/Jayapura" , 0x0267F0 }, - { "Asia/Jerusalem" , 0x0268DD }, - { "Asia/Kabul" , 0x026D1B }, - { "Asia/Kamchatka" , 0x026DC6 }, - { "Asia/Karachi" , 0x0270BB }, - { "Asia/Kashgar" , 0x0271D1 }, - { "Asia/Kathmandu" , 0x027262 }, - { "Asia/Katmandu" , 0x02730F }, - { "Asia/Khandyga" , 0x0273BC }, - { "Asia/Kolkata" , 0x0276ED }, - { "Asia/Krasnoyarsk" , 0x0277D5 }, - { "Asia/Kuala_Lumpur" , 0x027ADF }, - { "Asia/Kuching" , 0x027BFF }, - { "Asia/Kuwait" , 0x027D59 }, - { "Asia/Macao" , 0x027DEA }, - { "Asia/Macau" , 0x02810D }, - { "Asia/Magadan" , 0x028430 }, - { "Asia/Makassar" , 0x02873B }, - { "Asia/Manila" , 0x02884E }, - { "Asia/Muscat" , 0x028948 }, - { "Asia/Nicosia" , 0x0289D9 }, - { "Asia/Novokuznetsk" , 0x028C4D }, - { "Asia/Novosibirsk" , 0x028F40 }, - { "Asia/Omsk" , 0x029251 }, - { "Asia/Oral" , 0x02954F }, - { "Asia/Phnom_Penh" , 0x0297DB }, - { "Asia/Pontianak" , 0x02987F }, - { "Asia/Pyongyang" , 0x029998 }, - { "Asia/Qatar" , 0x029A5B }, - { "Asia/Qostanay" , 0x029AFF }, - { "Asia/Qyzylorda" , 0x029D8C }, - { "Asia/Rangoon" , 0x02A025 }, - { "Asia/Riyadh" , 0x02A0EC }, - { "Asia/Saigon" , 0x02A17D }, - { "Asia/Sakhalin" , 0x02A275 }, - { "Asia/Samarkand" , 0x02A58C }, - { "Asia/Seoul" , 0x02A717 }, - { "Asia/Shanghai" , 0x02A8C2 }, - { "Asia/Singapore" , 0x02AA63 }, - { "Asia/Srednekolymsk" , 0x02AB6F }, - { "Asia/Taipei" , 0x02AE83 }, - { "Asia/Tashkent" , 0x02B08E }, - { "Asia/Tbilisi" , 0x02B219 }, - { "Asia/Tehran" , 0x02B49A }, - { "Asia/Tel_Aviv" , 0x02BC7A }, - { "Asia/Thimbu" , 0x02C0B8 }, - { "Asia/Thimphu" , 0x02C15E }, - { "Asia/Tokyo" , 0x02C204 }, - { "Asia/Tomsk" , 0x02C2E5 }, - { "Asia/Ujung_Pandang" , 0x02C5F0 }, - { "Asia/Ulaanbaatar" , 0x02C6BA }, - { "Asia/Ulan_Bator" , 0x02C92D }, - { "Asia/Urumqi" , 0x02CB8B }, - { "Asia/Ust-Nera" , 0x02CC29 }, - { "Asia/Vientiane" , 0x02CF4C }, - { "Asia/Vladivostok" , 0x02CFF0 }, - { "Asia/Yakutsk" , 0x02D2F5 }, - { "Asia/Yangon" , 0x02D5F9 }, - { "Asia/Yekaterinburg" , 0x02D6C0 }, - { "Asia/Yerevan" , 0x02D9D2 }, - { "Atlantic/Azores" , 0x02DCA2 }, - { "Atlantic/Bermuda" , 0x02E261 }, - { "Atlantic/Canary" , 0x02E66D }, - { "Atlantic/Cape_Verde" , 0x02E865 }, - { "Atlantic/Faeroe" , 0x02E920 }, - { "Atlantic/Faroe" , 0x02EAE5 }, - { "Atlantic/Jan_Mayen" , 0x02ECAA }, - { "Atlantic/Madeira" , 0x02EF5A }, - { "Atlantic/Reykjavik" , 0x02F522 }, - { "Atlantic/South_Georgia" , 0x02F81F }, - { "Atlantic/St_Helena" , 0x02F8AF }, - { "Atlantic/Stanley" , 0x02F93D }, - { "Australia/ACT" , 0x02FC5E }, - { "Australia/Adelaide" , 0x02FFF2 }, - { "Australia/Brisbane" , 0x0303A6 }, - { "Australia/Broken_Hill" , 0x0304EA }, - { "Australia/Canberra" , 0x0308BF }, - { "Australia/Currie" , 0x030C53 }, - { "Australia/Darwin" , 0x03104A }, - { "Australia/Eucla" , 0x031152 }, - { "Australia/Hobart" , 0x0312B1 }, - { "Australia/LHI" , 0x0316B0 }, - { "Australia/Lindeman" , 0x031970 }, - { "Australia/Lord_Howe" , 0x031AE0 }, - { "Australia/Melbourne" , 0x031DB0 }, - { "Australia/North" , 0x03214C }, - { "Australia/NSW" , 0x032242 }, - { "Australia/Perth" , 0x0325D6 }, - { "Australia/Queensland" , 0x032732 }, - { "Australia/South" , 0x03285F }, - { "Australia/Sydney" , 0x032C04 }, - { "Australia/Tasmania" , 0x032FB4 }, - { "Australia/Victoria" , 0x0333AB }, - { "Australia/West" , 0x03373F }, - { "Australia/Yancowinna" , 0x03387D }, - { "Brazil/Acre" , 0x033C36 }, - { "Brazil/DeNoronha" , 0x033DE4 }, - { "Brazil/East" , 0x033FD4 }, - { "Brazil/West" , 0x034398 }, - { "Canada/Atlantic" , 0x034540 }, - { "Canada/Central" , 0x034BD4 }, - { "Canada/Eastern" , 0x0350EE }, - { "Canada/Mountain" , 0x0357AF }, - { "Canada/Newfoundland" , 0x035B85 }, - { "Canada/Pacific" , 0x0362E7 }, - { "Canada/Saskatchewan" , 0x036825 }, - { "Canada/Yukon" , 0x036AAF }, - { "CET" , 0x036EC0 }, - { "Chile/Continental" , 0x037139 }, - { "Chile/EasterIsland" , 0x037647 }, - { "CST6CDT" , 0x037AA1 }, - { "Cuba" , 0x037E64 }, - { "EET" , 0x0382CD }, - { "Egypt" , 0x0384CA }, - { "Eire" , 0x0389D2 }, - { "EST" , 0x038FB6 }, - { "EST5EDT" , 0x039031 }, - { "Etc/GMT" , 0x0393F4 }, - { "Etc/GMT+0" , 0x03946F }, - { "Etc/GMT+1" , 0x0394EA }, - { "Etc/GMT+10" , 0x039567 }, - { "Etc/GMT+11" , 0x0395E5 }, - { "Etc/GMT+12" , 0x039663 }, - { "Etc/GMT+2" , 0x0396E1 }, - { "Etc/GMT+3" , 0x03975E }, - { "Etc/GMT+4" , 0x0397DB }, - { "Etc/GMT+5" , 0x039858 }, - { "Etc/GMT+6" , 0x0398D5 }, - { "Etc/GMT+7" , 0x039952 }, - { "Etc/GMT+8" , 0x0399CF }, - { "Etc/GMT+9" , 0x039A4C }, - { "Etc/GMT-0" , 0x039AC9 }, - { "Etc/GMT-1" , 0x039B44 }, - { "Etc/GMT-10" , 0x039BC2 }, - { "Etc/GMT-11" , 0x039C41 }, - { "Etc/GMT-12" , 0x039CC0 }, - { "Etc/GMT-13" , 0x039D3F }, - { "Etc/GMT-14" , 0x039DBE }, - { "Etc/GMT-2" , 0x039E3D }, - { "Etc/GMT-3" , 0x039EBB }, - { "Etc/GMT-4" , 0x039F39 }, - { "Etc/GMT-5" , 0x039FB7 }, - { "Etc/GMT-6" , 0x03A035 }, - { "Etc/GMT-7" , 0x03A0B3 }, - { "Etc/GMT-8" , 0x03A131 }, - { "Etc/GMT-9" , 0x03A1AF }, - { "Etc/GMT0" , 0x03A22D }, - { "Etc/Greenwich" , 0x03A2A8 }, - { "Etc/UCT" , 0x03A323 }, - { "Etc/Universal" , 0x03A39E }, - { "Etc/UTC" , 0x03A419 }, - { "Etc/Zulu" , 0x03A494 }, - { "Europe/Amsterdam" , 0x03A50F }, - { "Europe/Andorra" , 0x03A94A }, - { "Europe/Astrakhan" , 0x03AADB }, - { "Europe/Athens" , 0x03ADCF }, - { "Europe/Belfast" , 0x03B085 }, - { "Europe/Belgrade" , 0x03B6D0 }, - { "Europe/Berlin" , 0x03B8BA }, - { "Europe/Bratislava" , 0x03BB9B }, - { "Europe/Brussels" , 0x03BE7A }, - { "Europe/Bucharest" , 0x03C2D5 }, - { "Europe/Budapest" , 0x03C576 }, - { "Europe/Busingen" , 0x03C880 }, - { "Europe/Chisinau" , 0x03CA85 }, - { "Europe/Copenhagen" , 0x03CD84 }, - { "Europe/Dublin" , 0x03CFFF }, - { "Europe/Gibraltar" , 0x03D5E3 }, - { "Europe/Guernsey" , 0x03DAB3 }, - { "Europe/Helsinki" , 0x03E0FE }, - { "Europe/Isle_of_Man" , 0x03E2EB }, - { "Europe/Istanbul" , 0x03E936 }, - { "Europe/Jersey" , 0x03EDF2 }, - { "Europe/Kaliningrad" , 0x03F43D }, - { "Europe/Kiev" , 0x03F7E5 }, - { "Europe/Kirov" , 0x03FA2A }, - { "Europe/Lisbon" , 0x03FD11 }, - { "Europe/Ljubljana" , 0x0402DE }, - { "Europe/London" , 0x0404C8 }, - { "Europe/Luxembourg" , 0x040B13 }, - { "Europe/Madrid" , 0x040F5E }, - { "Europe/Malta" , 0x0412FB }, - { "Europe/Mariehamn" , 0x0416A7 }, - { "Europe/Minsk" , 0x041894 }, - { "Europe/Monaco" , 0x041BC8 }, - { "Europe/Moscow" , 0x04202E }, - { "Europe/Nicosia" , 0x0423DA }, - { "Europe/Oslo" , 0x04263B }, - { "Europe/Paris" , 0x0428EB }, - { "Europe/Podgorica" , 0x042D48 }, - { "Europe/Prague" , 0x042F32 }, - { "Europe/Riga" , 0x043211 }, - { "Europe/Rome" , 0x0434D3 }, - { "Europe/Samara" , 0x043892 }, - { "Europe/San_Marino" , 0x043B93 }, - { "Europe/Sarajevo" , 0x043F52 }, - { "Europe/Saratov" , 0x04413C }, - { "Europe/Simferopol" , 0x04442E }, - { "Europe/Skopje" , 0x0447A1 }, - { "Europe/Sofia" , 0x04498B }, - { "Europe/Stockholm" , 0x044BE7 }, - { "Europe/Tallinn" , 0x044DE4 }, - { "Europe/Tirane" , 0x045093 }, - { "Europe/Tiraspol" , 0x0452FB }, - { "Europe/Ulyanovsk" , 0x0455FA }, - { "Europe/Uzhgorod" , 0x045910 }, - { "Europe/Vaduz" , 0x045B3C }, - { "Europe/Vatican" , 0x045D39 }, - { "Europe/Vienna" , 0x0460F8 }, - { "Europe/Vilnius" , 0x046396 }, - { "Europe/Volgograd" , 0x046646 }, - { "Europe/Warsaw" , 0x046943 }, - { "Europe/Zagreb" , 0x046CEA }, - { "Europe/Zaporozhye" , 0x046ED4 }, - { "Europe/Zurich" , 0x04712B }, - { "Factory" , 0x047328 }, - { "GB" , 0x0473A5 }, - { "GB-Eire" , 0x0479F0 }, - { "GMT" , 0x04803B }, - { "GMT+0" , 0x0480B6 }, - { "GMT-0" , 0x048131 }, - { "GMT0" , 0x0481AC }, - { "Greenwich" , 0x048227 }, - { "Hongkong" , 0x0482A2 }, - { "HST" , 0x0485B5 }, - { "Iceland" , 0x048631 }, - { "Indian/Antananarivo" , 0x04892E }, - { "Indian/Chagos" , 0x0489F9 }, - { "Indian/Christmas" , 0x048A9D }, - { "Indian/Cocos" , 0x048B2E }, - { "Indian/Comoro" , 0x048BC6 }, - { "Indian/Kerguelen" , 0x048C91 }, - { "Indian/Mahe" , 0x048D22 }, - { "Indian/Maldives" , 0x048DB3 }, - { "Indian/Mauritius" , 0x048E57 }, - { "Indian/Mayotte" , 0x048F16 }, - { "Indian/Reunion" , 0x048FE1 }, - { "Iran" , 0x049072 }, - { "Israel" , 0x049852 }, - { "Jamaica" , 0x049C90 }, - { "Japan" , 0x049DEF }, - { "Kwajalein" , 0x049ED0 }, - { "Libya" , 0x049FB7 }, - { "MET" , 0x04A172 }, - { "Mexico/BajaNorte" , 0x04A3EB }, - { "Mexico/BajaSur" , 0x04A7F8 }, - { "Mexico/General" , 0x04A973 }, - { "MST" , 0x04AB1B }, - { "MST7MDT" , 0x04AB96 }, - { "Navajo" , 0x04AF59 }, - { "NZ" , 0x04B377 }, - { "NZ-CHAT" , 0x04B796 }, - { "Pacific/Apia" , 0x04BACA }, - { "Pacific/Auckland" , 0x04BC6D }, - { "Pacific/Bougainville" , 0x04C0A4 }, - { "Pacific/Chatham" , 0x04C185 }, - { "Pacific/Chuuk" , 0x04C4C8 }, - { "Pacific/Easter" , 0x04C5A6 }, - { "Pacific/Efate" , 0x04CA0D }, - { "Pacific/Enderbury" , 0x04CB6F }, - { "Pacific/Fakaofo" , 0x04CC27 }, - { "Pacific/Fiji" , 0x04CCCC }, - { "Pacific/Funafuti" , 0x04CE84 }, - { "Pacific/Galapagos" , 0x04CF16 }, - { "Pacific/Gambier" , 0x04CFE2 }, - { "Pacific/Guadalcanal" , 0x04D081 }, - { "Pacific/Guam" , 0x04D113 }, - { "Pacific/Honolulu" , 0x04D27D }, - { "Pacific/Johnston" , 0x04D36C }, - { "Pacific/Kanton" , 0x04D455 }, - { "Pacific/Kiritimati" , 0x04D51C }, - { "Pacific/Kosrae" , 0x04D5E2 }, - { "Pacific/Kwajalein" , 0x04D6E6 }, - { "Pacific/Majuro" , 0x04D7D6 }, - { "Pacific/Marquesas" , 0x04D8D9 }, - { "Pacific/Midway" , 0x04D981 }, - { "Pacific/Nauru" , 0x04DA2D }, - { "Pacific/Niue" , 0x04DAF0 }, - { "Pacific/Norfolk" , 0x04DB96 }, - { "Pacific/Noumea" , 0x04DC99 }, - { "Pacific/Pago_Pago" , 0x04DD6B }, - { "Pacific/Palau" , 0x04DE09 }, - { "Pacific/Pitcairn" , 0x04DEA9 }, - { "Pacific/Pohnpei" , 0x04DF4E }, - { "Pacific/Ponape" , 0x04E03E }, - { "Pacific/Port_Moresby" , 0x04E120 }, - { "Pacific/Rarotonga" , 0x04E1E3 }, - { "Pacific/Saipan" , 0x04E385 }, - { "Pacific/Samoa" , 0x04E4EF }, - { "Pacific/Tahiti" , 0x04E58D }, - { "Pacific/Tarawa" , 0x04E62D }, - { "Pacific/Tongatapu" , 0x04E6CE }, - { "Pacific/Truk" , 0x04E7C7 }, - { "Pacific/Wake" , 0x04E896 }, - { "Pacific/Wallis" , 0x04E933 }, - { "Pacific/Yap" , 0x04E9C5 }, - { "Poland" , 0x04EA94 }, - { "Portugal" , 0x04EE3B }, - { "PRC" , 0x04F3F5 }, - { "PST8PDT" , 0x04F58A }, - { "ROC" , 0x04F94D }, - { "ROK" , 0x04FB58 }, - { "Singapore" , 0x04FD03 }, - { "Turkey" , 0x04FE0F }, - { "UCT" , 0x0502CB }, - { "Universal" , 0x050346 }, - { "US/Alaska" , 0x0503C1 }, - { "US/Aleutian" , 0x05079E }, - { "US/Arizona" , 0x050B73 }, - { "US/Central" , 0x050C6F }, - { "US/East-Indiana" , 0x051355 }, - { "US/Eastern" , 0x051574 }, - { "US/Hawaii" , 0x051C50 }, - { "US/Indiana-Starke" , 0x051D39 }, - { "US/Michigan" , 0x05213D }, - { "US/Mountain" , 0x0524CC }, - { "US/Pacific" , 0x0528EA }, - { "US/Samoa" , 0x052E04 }, - { "UTC" , 0x052EA2 }, - { "W-SU" , 0x052F1D }, - { "WET" , 0x0532B5 }, - { "Zulu" , 0x0534AF }, + { "Asia/Harbin" , 0x0251F1 }, + { "Asia/Hebron" , 0x025386 }, + { "Asia/Ho_Chi_Minh" , 0x025885 }, + { "Asia/Hong_Kong" , 0x02597D }, + { "Asia/Hovd" , 0x025C90 }, + { "Asia/Irkutsk" , 0x025F19 }, + { "Asia/Istanbul" , 0x026237 }, + { "Asia/Jakarta" , 0x0266F3 }, + { "Asia/Jayapura" , 0x026804 }, + { "Asia/Jerusalem" , 0x0268F1 }, + { "Asia/Kabul" , 0x026D2F }, + { "Asia/Kamchatka" , 0x026DDA }, + { "Asia/Karachi" , 0x0270CF }, + { "Asia/Kashgar" , 0x0271E5 }, + { "Asia/Kathmandu" , 0x027276 }, + { "Asia/Katmandu" , 0x027323 }, + { "Asia/Khandyga" , 0x0273D0 }, + { "Asia/Kolkata" , 0x027701 }, + { "Asia/Krasnoyarsk" , 0x0277E9 }, + { "Asia/Kuala_Lumpur" , 0x027AF3 }, + { "Asia/Kuching" , 0x027C13 }, + { "Asia/Kuwait" , 0x027D6D }, + { "Asia/Macao" , 0x027DFE }, + { "Asia/Macau" , 0x028121 }, + { "Asia/Magadan" , 0x028444 }, + { "Asia/Makassar" , 0x02874F }, + { "Asia/Manila" , 0x028862 }, + { "Asia/Muscat" , 0x02895C }, + { "Asia/Nicosia" , 0x0289ED }, + { "Asia/Novokuznetsk" , 0x028C61 }, + { "Asia/Novosibirsk" , 0x028F54 }, + { "Asia/Omsk" , 0x029265 }, + { "Asia/Oral" , 0x029563 }, + { "Asia/Phnom_Penh" , 0x0297EF }, + { "Asia/Pontianak" , 0x029893 }, + { "Asia/Pyongyang" , 0x0299AC }, + { "Asia/Qatar" , 0x029A6F }, + { "Asia/Qostanay" , 0x029B13 }, + { "Asia/Qyzylorda" , 0x029DA0 }, + { "Asia/Rangoon" , 0x02A039 }, + { "Asia/Riyadh" , 0x02A100 }, + { "Asia/Saigon" , 0x02A191 }, + { "Asia/Sakhalin" , 0x02A289 }, + { "Asia/Samarkand" , 0x02A5A0 }, + { "Asia/Seoul" , 0x02A72B }, + { "Asia/Shanghai" , 0x02A8D6 }, + { "Asia/Singapore" , 0x02AA77 }, + { "Asia/Srednekolymsk" , 0x02AB83 }, + { "Asia/Taipei" , 0x02AE97 }, + { "Asia/Tashkent" , 0x02B0A2 }, + { "Asia/Tbilisi" , 0x02B22D }, + { "Asia/Tehran" , 0x02B4AE }, + { "Asia/Tel_Aviv" , 0x02BC8E }, + { "Asia/Thimbu" , 0x02C0CC }, + { "Asia/Thimphu" , 0x02C172 }, + { "Asia/Tokyo" , 0x02C218 }, + { "Asia/Tomsk" , 0x02C2F9 }, + { "Asia/Ujung_Pandang" , 0x02C604 }, + { "Asia/Ulaanbaatar" , 0x02C6CE }, + { "Asia/Ulan_Bator" , 0x02C941 }, + { "Asia/Urumqi" , 0x02CB9F }, + { "Asia/Ust-Nera" , 0x02CC3D }, + { "Asia/Vientiane" , 0x02CF60 }, + { "Asia/Vladivostok" , 0x02D004 }, + { "Asia/Yakutsk" , 0x02D309 }, + { "Asia/Yangon" , 0x02D60D }, + { "Asia/Yekaterinburg" , 0x02D6D4 }, + { "Asia/Yerevan" , 0x02D9E6 }, + { "Atlantic/Azores" , 0x02DCB6 }, + { "Atlantic/Bermuda" , 0x02E275 }, + { "Atlantic/Canary" , 0x02E681 }, + { "Atlantic/Cape_Verde" , 0x02E879 }, + { "Atlantic/Faeroe" , 0x02E934 }, + { "Atlantic/Faroe" , 0x02EAF9 }, + { "Atlantic/Jan_Mayen" , 0x02ECBE }, + { "Atlantic/Madeira" , 0x02EF6E }, + { "Atlantic/Reykjavik" , 0x02F536 }, + { "Atlantic/South_Georgia" , 0x02F833 }, + { "Atlantic/St_Helena" , 0x02F8C3 }, + { "Atlantic/Stanley" , 0x02F951 }, + { "Australia/ACT" , 0x02FC72 }, + { "Australia/Adelaide" , 0x030006 }, + { "Australia/Brisbane" , 0x0303BA }, + { "Australia/Broken_Hill" , 0x0304FE }, + { "Australia/Canberra" , 0x0308D3 }, + { "Australia/Currie" , 0x030C67 }, + { "Australia/Darwin" , 0x03105E }, + { "Australia/Eucla" , 0x031166 }, + { "Australia/Hobart" , 0x0312C5 }, + { "Australia/LHI" , 0x0316C4 }, + { "Australia/Lindeman" , 0x031984 }, + { "Australia/Lord_Howe" , 0x031AF4 }, + { "Australia/Melbourne" , 0x031DC4 }, + { "Australia/North" , 0x032160 }, + { "Australia/NSW" , 0x032256 }, + { "Australia/Perth" , 0x0325EA }, + { "Australia/Queensland" , 0x032746 }, + { "Australia/South" , 0x032873 }, + { "Australia/Sydney" , 0x032C18 }, + { "Australia/Tasmania" , 0x032FC8 }, + { "Australia/Victoria" , 0x0333BF }, + { "Australia/West" , 0x033753 }, + { "Australia/Yancowinna" , 0x033891 }, + { "Brazil/Acre" , 0x033C4A }, + { "Brazil/DeNoronha" , 0x033DF8 }, + { "Brazil/East" , 0x033FE8 }, + { "Brazil/West" , 0x0343AC }, + { "Canada/Atlantic" , 0x034554 }, + { "Canada/Central" , 0x034BE8 }, + { "Canada/Eastern" , 0x035102 }, + { "Canada/Mountain" , 0x0357C3 }, + { "Canada/Newfoundland" , 0x035B99 }, + { "Canada/Pacific" , 0x0362FB }, + { "Canada/Saskatchewan" , 0x036839 }, + { "Canada/Yukon" , 0x036AC3 }, + { "CET" , 0x036ED4 }, + { "Chile/Continental" , 0x03714D }, + { "Chile/EasterIsland" , 0x03765B }, + { "CST6CDT" , 0x037AB5 }, + { "Cuba" , 0x037E78 }, + { "EET" , 0x0382E1 }, + { "Egypt" , 0x0384DE }, + { "Eire" , 0x0389E6 }, + { "EST" , 0x038FCA }, + { "EST5EDT" , 0x039045 }, + { "Etc/GMT" , 0x039408 }, + { "Etc/GMT+0" , 0x039483 }, + { "Etc/GMT+1" , 0x0394FE }, + { "Etc/GMT+10" , 0x03957B }, + { "Etc/GMT+11" , 0x0395F9 }, + { "Etc/GMT+12" , 0x039677 }, + { "Etc/GMT+2" , 0x0396F5 }, + { "Etc/GMT+3" , 0x039772 }, + { "Etc/GMT+4" , 0x0397EF }, + { "Etc/GMT+5" , 0x03986C }, + { "Etc/GMT+6" , 0x0398E9 }, + { "Etc/GMT+7" , 0x039966 }, + { "Etc/GMT+8" , 0x0399E3 }, + { "Etc/GMT+9" , 0x039A60 }, + { "Etc/GMT-0" , 0x039ADD }, + { "Etc/GMT-1" , 0x039B58 }, + { "Etc/GMT-10" , 0x039BD6 }, + { "Etc/GMT-11" , 0x039C55 }, + { "Etc/GMT-12" , 0x039CD4 }, + { "Etc/GMT-13" , 0x039D53 }, + { "Etc/GMT-14" , 0x039DD2 }, + { "Etc/GMT-2" , 0x039E51 }, + { "Etc/GMT-3" , 0x039ECF }, + { "Etc/GMT-4" , 0x039F4D }, + { "Etc/GMT-5" , 0x039FCB }, + { "Etc/GMT-6" , 0x03A049 }, + { "Etc/GMT-7" , 0x03A0C7 }, + { "Etc/GMT-8" , 0x03A145 }, + { "Etc/GMT-9" , 0x03A1C3 }, + { "Etc/GMT0" , 0x03A241 }, + { "Etc/Greenwich" , 0x03A2BC }, + { "Etc/UCT" , 0x03A337 }, + { "Etc/Universal" , 0x03A3B2 }, + { "Etc/UTC" , 0x03A42D }, + { "Etc/Zulu" , 0x03A4A8 }, + { "Europe/Amsterdam" , 0x03A523 }, + { "Europe/Andorra" , 0x03A95E }, + { "Europe/Astrakhan" , 0x03AAEF }, + { "Europe/Athens" , 0x03ADE3 }, + { "Europe/Belfast" , 0x03B099 }, + { "Europe/Belgrade" , 0x03B6E4 }, + { "Europe/Berlin" , 0x03B8CE }, + { "Europe/Bratislava" , 0x03BBAF }, + { "Europe/Brussels" , 0x03BE8E }, + { "Europe/Bucharest" , 0x03C2E9 }, + { "Europe/Budapest" , 0x03C58A }, + { "Europe/Busingen" , 0x03C894 }, + { "Europe/Chisinau" , 0x03CA99 }, + { "Europe/Copenhagen" , 0x03CD98 }, + { "Europe/Dublin" , 0x03D013 }, + { "Europe/Gibraltar" , 0x03D5F7 }, + { "Europe/Guernsey" , 0x03DAC7 }, + { "Europe/Helsinki" , 0x03E112 }, + { "Europe/Isle_of_Man" , 0x03E2FF }, + { "Europe/Istanbul" , 0x03E94A }, + { "Europe/Jersey" , 0x03EE06 }, + { "Europe/Kaliningrad" , 0x03F451 }, + { "Europe/Kiev" , 0x03F7F9 }, + { "Europe/Kirov" , 0x03FA47 }, + { "Europe/Lisbon" , 0x03FD2E }, + { "Europe/Ljubljana" , 0x0402FB }, + { "Europe/London" , 0x0404E5 }, + { "Europe/Luxembourg" , 0x040B30 }, + { "Europe/Madrid" , 0x040F7B }, + { "Europe/Malta" , 0x041318 }, + { "Europe/Mariehamn" , 0x0416C4 }, + { "Europe/Minsk" , 0x0418B1 }, + { "Europe/Monaco" , 0x041BE5 }, + { "Europe/Moscow" , 0x04204B }, + { "Europe/Nicosia" , 0x0423F7 }, + { "Europe/Oslo" , 0x042658 }, + { "Europe/Paris" , 0x042908 }, + { "Europe/Podgorica" , 0x042D65 }, + { "Europe/Prague" , 0x042F4F }, + { "Europe/Riga" , 0x04322E }, + { "Europe/Rome" , 0x0434F0 }, + { "Europe/Samara" , 0x0438AF }, + { "Europe/San_Marino" , 0x043BB0 }, + { "Europe/Sarajevo" , 0x043F6F }, + { "Europe/Saratov" , 0x044159 }, + { "Europe/Simferopol" , 0x04444B }, + { "Europe/Skopje" , 0x0447BE }, + { "Europe/Sofia" , 0x0449A8 }, + { "Europe/Stockholm" , 0x044C04 }, + { "Europe/Tallinn" , 0x044E01 }, + { "Europe/Tirane" , 0x0450B0 }, + { "Europe/Tiraspol" , 0x045318 }, + { "Europe/Ulyanovsk" , 0x045617 }, + { "Europe/Uzhgorod" , 0x04592D }, + { "Europe/Vaduz" , 0x045B62 }, + { "Europe/Vatican" , 0x045D5F }, + { "Europe/Vienna" , 0x04611E }, + { "Europe/Vilnius" , 0x0463BC }, + { "Europe/Volgograd" , 0x04666C }, + { "Europe/Warsaw" , 0x046969 }, + { "Europe/Zagreb" , 0x046D10 }, + { "Europe/Zaporozhye" , 0x046EFA }, + { "Europe/Zurich" , 0x04715A }, + { "Factory" , 0x047357 }, + { "GB" , 0x0473D4 }, + { "GB-Eire" , 0x047A1F }, + { "GMT" , 0x04806A }, + { "GMT+0" , 0x0480E5 }, + { "GMT-0" , 0x048160 }, + { "GMT0" , 0x0481DB }, + { "Greenwich" , 0x048256 }, + { "Hongkong" , 0x0482D1 }, + { "HST" , 0x0485E4 }, + { "Iceland" , 0x048660 }, + { "Indian/Antananarivo" , 0x04895D }, + { "Indian/Chagos" , 0x048A28 }, + { "Indian/Christmas" , 0x048ACC }, + { "Indian/Cocos" , 0x048B5D }, + { "Indian/Comoro" , 0x048BF5 }, + { "Indian/Kerguelen" , 0x048CC0 }, + { "Indian/Mahe" , 0x048D51 }, + { "Indian/Maldives" , 0x048DE2 }, + { "Indian/Mauritius" , 0x048E86 }, + { "Indian/Mayotte" , 0x048F45 }, + { "Indian/Reunion" , 0x049010 }, + { "Iran" , 0x0490A1 }, + { "Israel" , 0x049881 }, + { "Jamaica" , 0x049CBF }, + { "Japan" , 0x049E1E }, + { "Kwajalein" , 0x049EFF }, + { "Libya" , 0x049FE6 }, + { "MET" , 0x04A1A1 }, + { "Mexico/BajaNorte" , 0x04A41A }, + { "Mexico/BajaSur" , 0x04A827 }, + { "Mexico/General" , 0x04A9A2 }, + { "MST" , 0x04AB4A }, + { "MST7MDT" , 0x04ABC5 }, + { "Navajo" , 0x04AF88 }, + { "NZ" , 0x04B3A6 }, + { "NZ-CHAT" , 0x04B7C5 }, + { "Pacific/Apia" , 0x04BAF9 }, + { "Pacific/Auckland" , 0x04BC9C }, + { "Pacific/Bougainville" , 0x04C0D3 }, + { "Pacific/Chatham" , 0x04C1B4 }, + { "Pacific/Chuuk" , 0x04C4F7 }, + { "Pacific/Easter" , 0x04C5D5 }, + { "Pacific/Efate" , 0x04CA3C }, + { "Pacific/Enderbury" , 0x04CB9E }, + { "Pacific/Fakaofo" , 0x04CC56 }, + { "Pacific/Fiji" , 0x04CCFB }, + { "Pacific/Funafuti" , 0x04CEB3 }, + { "Pacific/Galapagos" , 0x04CF45 }, + { "Pacific/Gambier" , 0x04D011 }, + { "Pacific/Guadalcanal" , 0x04D0B0 }, + { "Pacific/Guam" , 0x04D142 }, + { "Pacific/Honolulu" , 0x04D2AC }, + { "Pacific/Johnston" , 0x04D39B }, + { "Pacific/Kanton" , 0x04D484 }, + { "Pacific/Kiritimati" , 0x04D54B }, + { "Pacific/Kosrae" , 0x04D611 }, + { "Pacific/Kwajalein" , 0x04D715 }, + { "Pacific/Majuro" , 0x04D805 }, + { "Pacific/Marquesas" , 0x04D908 }, + { "Pacific/Midway" , 0x04D9B0 }, + { "Pacific/Nauru" , 0x04DA5C }, + { "Pacific/Niue" , 0x04DB1F }, + { "Pacific/Norfolk" , 0x04DBC5 }, + { "Pacific/Noumea" , 0x04DCC8 }, + { "Pacific/Pago_Pago" , 0x04DD9A }, + { "Pacific/Palau" , 0x04DE38 }, + { "Pacific/Pitcairn" , 0x04DED8 }, + { "Pacific/Pohnpei" , 0x04DF7D }, + { "Pacific/Ponape" , 0x04E06D }, + { "Pacific/Port_Moresby" , 0x04E14F }, + { "Pacific/Rarotonga" , 0x04E212 }, + { "Pacific/Saipan" , 0x04E3B4 }, + { "Pacific/Samoa" , 0x04E51E }, + { "Pacific/Tahiti" , 0x04E5BC }, + { "Pacific/Tarawa" , 0x04E65C }, + { "Pacific/Tongatapu" , 0x04E6FD }, + { "Pacific/Truk" , 0x04E7F6 }, + { "Pacific/Wake" , 0x04E8C5 }, + { "Pacific/Wallis" , 0x04E962 }, + { "Pacific/Yap" , 0x04E9F4 }, + { "Poland" , 0x04EAC3 }, + { "Portugal" , 0x04EE6A }, + { "PRC" , 0x04F424 }, + { "PST8PDT" , 0x04F5B9 }, + { "ROC" , 0x04F97C }, + { "ROK" , 0x04FB87 }, + { "Singapore" , 0x04FD32 }, + { "Turkey" , 0x04FE3E }, + { "UCT" , 0x0502FA }, + { "Universal" , 0x050375 }, + { "US/Alaska" , 0x0503F0 }, + { "US/Aleutian" , 0x0507CD }, + { "US/Arizona" , 0x050BA2 }, + { "US/Central" , 0x050C9E }, + { "US/East-Indiana" , 0x051384 }, + { "US/Eastern" , 0x0515A3 }, + { "US/Hawaii" , 0x051C7F }, + { "US/Indiana-Starke" , 0x051D68 }, + { "US/Michigan" , 0x05216C }, + { "US/Mountain" , 0x0524FB }, + { "US/Pacific" , 0x052919 }, + { "US/Samoa" , 0x052E33 }, + { "UTC" , 0x052ED1 }, + { "W-SU" , 0x052F4C }, + { "WET" , 0x0532E4 }, + { "Zulu" , 0x0534DE }, }; -const unsigned char timelib_timezone_db_data_builtin[341290] = { +const unsigned char timelib_timezone_db_data_builtin[341337] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7531,9 +7531,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -7596,7 +7596,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x06, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, +0x03, 0x05, 0x06, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, @@ -8018,9 +8018,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -8086,8 +8086,8 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, -0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, +0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, +0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, @@ -10702,7 +10702,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10761,21 +10761,21 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x20, 0x50, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, -0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, -0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, -0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, -0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, -0x74, 0x72, 0x69, 0x70, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, +0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, +0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, +0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10811,7 +10811,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10871,21 +10871,21 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, -0x20, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, -0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, -0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, -0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, -0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, -0x20, 0x42, 0x61, 0x6E, 0x6B, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, +0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, +0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, +0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, +0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, +0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -15680,9 +15680,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -15748,8 +15748,8 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, -0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, +0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, +0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, @@ -17987,7 +17987,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCD, 0x2E, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -18002,23 +18002,23 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x20, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, -0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, -0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, -0x07, 0x02, 0x07, 0x02, 0x07, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, -0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, -0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, -0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, -0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, 0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, 0x00, 0x00, 0x00, -0x14, 0x55, 0x6B, 0x72, 0x61, 0x69, 0x6E, 0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, -0x72, 0x65, 0x61, 0x73, 0x29, +0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, +0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, +0x03, 0x06, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x00, 0x00, +0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, +0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, +0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, +0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, +0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, +0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, 0x00, 0x00, 0x00, 0x14, 0x55, 0x6B, 0x72, 0x61, 0x69, 0x6E, +0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, /* Europe/Kirov */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -19279,9 +19279,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, @@ -19617,7 +19617,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, @@ -19632,21 +19632,22 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x00, 0x00, 0x14, 0xE8, -0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, -0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, -0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, -0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, -0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, -0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, 0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, -0x61, 0x6E, 0x73, 0x63, 0x61, 0x72, 0x70, 0x61, 0x74, 0x68, 0x69, 0x61, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, +0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, +0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, +0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, +0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, +0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x63, 0x61, 0x72, 0x70, +0x61, 0x74, 0x68, 0x69, 0x61, /* Europe/Vaduz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -19984,7 +19985,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAA, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -20000,23 +20001,24 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, -0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, -0x03, 0x06, 0x03, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x00, 0x00, -0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, -0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, -0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, -0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, -0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, 0x51, 0x7A, 0x00, 0x00, 0x00, 0x1B, 0x5A, 0x61, 0x70, 0x6F, -0x72, 0x6F, 0x7A, 0x68, 0x79, 0x65, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x65, 0x61, 0x73, 0x74, 0x20, -0x4C, 0x75, 0x67, 0x61, 0x6E, 0x73, 0x6B, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, +0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, +0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x07, 0x02, 0x07, 0x02, 0x07, +0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, +0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, +0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, +0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, +0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, +0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, +0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, +0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, 0x51, +0x7A, 0x00, 0x00, 0x00, 0x1B, 0x5A, 0x61, 0x70, 0x6F, 0x72, 0x6F, 0x7A, 0x68, 0x79, 0x65, 0x20, +0x61, 0x6E, 0x64, 0x20, 0x65, 0x61, 0x73, 0x74, 0x20, 0x4C, 0x75, 0x67, 0x61, 0x6E, 0x73, 0x6B, + /* Europe/Zurich */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23690,340 +23692,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0476ED }, { "Asia/Famagusta" , 0x047948 }, { "Asia/Gaza" , 0x04814F }, - { "Asia/Harbin" , 0x048ADA }, - { "Asia/Hebron" , 0x048D17 }, - { "Asia/Ho_Chi_Minh" , 0x0496BD }, - { "Asia/Hong_Kong" , 0x049828 }, - { "Asia/Hovd" , 0x049CE7 }, - { "Asia/Irkutsk" , 0x04A099 }, - { "Asia/Istanbul" , 0x04A59A }, - { "Asia/Jakarta" , 0x04AD41 }, - { "Asia/Jayapura" , 0x04AEBD }, - { "Asia/Jerusalem" , 0x04AFDC }, - { "Asia/Kabul" , 0x04B93C }, - { "Asia/Kamchatka" , 0x04BA18 }, - { "Asia/Karachi" , 0x04BEC4 }, - { "Asia/Kashgar" , 0x04C04B }, - { "Asia/Kathmandu" , 0x04C0FC }, - { "Asia/Katmandu" , 0x04C1DC }, - { "Asia/Khandyga" , 0x04C2BC }, - { "Asia/Kolkata" , 0x04C7DD }, - { "Asia/Krasnoyarsk" , 0x04C906 }, - { "Asia/Kuala_Lumpur" , 0x04CDE2 }, - { "Asia/Kuching" , 0x04CF81 }, - { "Asia/Kuwait" , 0x04D17E }, - { "Asia/Macao" , 0x04D22F }, - { "Asia/Macau" , 0x04D706 }, - { "Asia/Magadan" , 0x04DBDD }, - { "Asia/Makassar" , 0x04E0BF }, - { "Asia/Manila" , 0x04E212 }, - { "Asia/Muscat" , 0x04E366 }, - { "Asia/Nicosia" , 0x04E417 }, - { "Asia/Novokuznetsk" , 0x04EC08 }, - { "Asia/Novosibirsk" , 0x04F0B2 }, - { "Asia/Omsk" , 0x04F597 }, - { "Asia/Oral" , 0x04FA67 }, - { "Asia/Phnom_Penh" , 0x04FE6F }, - { "Asia/Pontianak" , 0x04FF42 }, - { "Asia/Pyongyang" , 0x0500C5 }, - { "Asia/Qatar" , 0x0501BE }, - { "Asia/Qostanay" , 0x050291 }, - { "Asia/Qyzylorda" , 0x0506AA }, - { "Asia/Rangoon" , 0x050AD4 }, - { "Asia/Riyadh" , 0x050BEC }, - { "Asia/Saigon" , 0x050C9D }, - { "Asia/Sakhalin" , 0x050E08 }, - { "Asia/Samarkand" , 0x0512DE }, - { "Asia/Seoul" , 0x05153C }, - { "Asia/Shanghai" , 0x0517B1 }, - { "Asia/Singapore" , 0x0519FA }, - { "Asia/Srednekolymsk" , 0x051B85 }, - { "Asia/Taipei" , 0x05206B }, - { "Asia/Tashkent" , 0x052370 }, - { "Asia/Tbilisi" , 0x0525DC }, - { "Asia/Tehran" , 0x0529F3 }, - { "Asia/Tel_Aviv" , 0x053415 }, - { "Asia/Thimbu" , 0x053D75 }, - { "Asia/Thimphu" , 0x053E4C }, - { "Asia/Tokyo" , 0x053F23 }, - { "Asia/Tomsk" , 0x054064 }, - { "Asia/Ujung_Pandang" , 0x054543 }, - { "Asia/Ulaanbaatar" , 0x05464D }, - { "Asia/Ulan_Bator" , 0x0549E9 }, - { "Asia/Urumqi" , 0x054D70 }, - { "Asia/Ust-Nera" , 0x054E2E }, - { "Asia/Vientiane" , 0x055332 }, - { "Asia/Vladivostok" , 0x055405 }, - { "Asia/Yakutsk" , 0x0558DC }, - { "Asia/Yangon" , 0x055DB2 }, - { "Asia/Yekaterinburg" , 0x055ECA }, - { "Asia/Yerevan" , 0x0563BF }, - { "Atlantic/Azores" , 0x05684A }, - { "Atlantic/Bermuda" , 0x057614 }, - { "Atlantic/Canary" , 0x057F7C }, - { "Atlantic/Cape_Verde" , 0x0586FF }, - { "Atlantic/Faeroe" , 0x058819 }, - { "Atlantic/Faroe" , 0x058F3C }, - { "Atlantic/Jan_Mayen" , 0x05965F }, - { "Atlantic/Madeira" , 0x059F1F }, - { "Atlantic/Reykjavik" , 0x05ACE9 }, - { "Atlantic/South_Georgia" , 0x05B17F }, - { "Atlantic/St_Helena" , 0x05B22F }, - { "Atlantic/Stanley" , 0x05B2CF }, - { "Australia/ACT" , 0x05B799 }, - { "Australia/Adelaide" , 0x05C033 }, - { "Australia/Brisbane" , 0x05C8EE }, - { "Australia/Broken_Hill" , 0x05CAB4 }, - { "Australia/Canberra" , 0x05D391 }, - { "Australia/Currie" , 0x05DC2B }, - { "Australia/Darwin" , 0x05E56D }, - { "Australia/Eucla" , 0x05E6D0 }, - { "Australia/Hobart" , 0x05E8CB }, - { "Australia/LHI" , 0x05F215 }, - { "Australia/Lindeman" , 0x05F965 }, - { "Australia/Lord_Howe" , 0x05FB6B }, - { "Australia/Melbourne" , 0x0602CB }, - { "Australia/North" , 0x060B6D }, - { "Australia/NSW" , 0x060CBE }, - { "Australia/Perth" , 0x061558 }, - { "Australia/Queensland" , 0x061740 }, - { "Australia/South" , 0x0618EF }, - { "Australia/Sydney" , 0x06219B }, - { "Australia/Tasmania" , 0x062A51 }, - { "Australia/Victoria" , 0x063393 }, - { "Australia/West" , 0x063C2D }, - { "Australia/Yancowinna" , 0x063DF7 }, - { "Brazil/Acre" , 0x0646B8 }, - { "Brazil/DeNoronha" , 0x064938 }, - { "Brazil/East" , 0x064C10 }, - { "Brazil/West" , 0x0651C0 }, - { "Canada/Atlantic" , 0x065428 }, - { "Canada/Central" , 0x066194 }, - { "Canada/Eastern" , 0x066CD4 }, - { "Canada/Mountain" , 0x067A86 }, - { "Canada/Newfoundland" , 0x0683AE }, - { "Canada/Pacific" , 0x069201 }, - { "Canada/Saskatchewan" , 0x069D59 }, - { "Canada/Yukon" , 0x06A139 }, - { "CET" , 0x06A793 }, - { "Chile/Continental" , 0x06AFCD }, - { "Chile/EasterIsland" , 0x06B9BA }, - { "CST6CDT" , 0x06C27F }, - { "Cuba" , 0x06CB91 }, - { "EET" , 0x06D50D }, - { "Egypt" , 0x06DC8D }, - { "Eire" , 0x06E43C }, - { "EST" , 0x06F1EC }, - { "EST5EDT" , 0x06F26A }, - { "Etc/GMT" , 0x06FB7C }, - { "Etc/GMT+0" , 0x06FBFA }, - { "Etc/GMT+1" , 0x06FC78 }, - { "Etc/GMT+10" , 0x06FCF8 }, - { "Etc/GMT+11" , 0x06FD79 }, - { "Etc/GMT+12" , 0x06FDFA }, - { "Etc/GMT+2" , 0x06FE7B }, - { "Etc/GMT+3" , 0x06FEFB }, - { "Etc/GMT+4" , 0x06FF7B }, - { "Etc/GMT+5" , 0x06FFFB }, - { "Etc/GMT+6" , 0x07007B }, - { "Etc/GMT+7" , 0x0700FB }, - { "Etc/GMT+8" , 0x07017B }, - { "Etc/GMT+9" , 0x0701FB }, - { "Etc/GMT-0" , 0x07027B }, - { "Etc/GMT-1" , 0x0702F9 }, - { "Etc/GMT-10" , 0x07037A }, - { "Etc/GMT-11" , 0x0703FC }, - { "Etc/GMT-12" , 0x07047E }, - { "Etc/GMT-13" , 0x070500 }, - { "Etc/GMT-14" , 0x070582 }, - { "Etc/GMT-2" , 0x070604 }, - { "Etc/GMT-3" , 0x070685 }, - { "Etc/GMT-4" , 0x070706 }, - { "Etc/GMT-5" , 0x070787 }, - { "Etc/GMT-6" , 0x070808 }, - { "Etc/GMT-7" , 0x070889 }, - { "Etc/GMT-8" , 0x07090A }, - { "Etc/GMT-9" , 0x07098B }, - { "Etc/GMT0" , 0x070A0C }, - { "Etc/Greenwich" , 0x070A8A }, - { "Etc/UCT" , 0x070B08 }, - { "Etc/Universal" , 0x070B86 }, - { "Etc/UTC" , 0x070C04 }, - { "Etc/Zulu" , 0x070C82 }, - { "Europe/Amsterdam" , 0x070D00 }, - { "Europe/Andorra" , 0x07186A }, - { "Europe/Astrakhan" , 0x071F44 }, - { "Europe/Athens" , 0x0723EF }, - { "Europe/Belfast" , 0x072CD1 }, - { "Europe/Belgrade" , 0x073B1D }, - { "Europe/Berlin" , 0x0742A9 }, - { "Europe/Bratislava" , 0x074BC3 }, - { "Europe/Brussels" , 0x0754CC }, - { "Europe/Bucharest" , 0x07604D }, - { "Europe/Budapest" , 0x0768E1 }, - { "Europe/Busingen" , 0x07722D }, - { "Europe/Chisinau" , 0x0779B6 }, - { "Europe/Copenhagen" , 0x078318 }, - { "Europe/Dublin" , 0x078B7D }, - { "Europe/Gibraltar" , 0x07992D }, - { "Europe/Guernsey" , 0x07A525 }, - { "Europe/Helsinki" , 0x07B371 }, - { "Europe/Isle_of_Man" , 0x07BAE9 }, - { "Europe/Istanbul" , 0x07C935 }, - { "Europe/Jersey" , 0x07D0DC }, - { "Europe/Kaliningrad" , 0x07DF28 }, - { "Europe/Kiev" , 0x07E51D }, - { "Europe/Kirov" , 0x07ED65 }, - { "Europe/Lisbon" , 0x07F200 }, - { "Europe/Ljubljana" , 0x07FFC8 }, - { "Europe/London" , 0x080754 }, - { "Europe/Luxembourg" , 0x0815A0 }, - { "Europe/Madrid" , 0x08212E }, - { "Europe/Malta" , 0x082B80 }, - { "Europe/Mariehamn" , 0x0835C8 }, - { "Europe/Minsk" , 0x083D40 }, - { "Europe/Monaco" , 0x084275 }, - { "Europe/Moscow" , 0x084E01 }, - { "Europe/Nicosia" , 0x085420 }, - { "Europe/Oslo" , 0x085BFE }, - { "Europe/Paris" , 0x0864BE }, - { "Europe/Podgorica" , 0x08705C }, - { "Europe/Prague" , 0x0877E8 }, - { "Europe/Riga" , 0x0880F1 }, - { "Europe/Rome" , 0x088993 }, - { "Europe/Samara" , 0x0893F0 }, - { "Europe/San_Marino" , 0x0898D4 }, - { "Europe/Sarajevo" , 0x08A331 }, - { "Europe/Saratov" , 0x08AABD }, - { "Europe/Simferopol" , 0x08AF78 }, - { "Europe/Skopje" , 0x08B537 }, - { "Europe/Sofia" , 0x08BCC3 }, - { "Europe/Stockholm" , 0x08C4EC }, - { "Europe/Tallinn" , 0x08CC6D }, - { "Europe/Tirane" , 0x08D4DD }, - { "Europe/Tiraspol" , 0x08DD0D }, - { "Europe/Ulyanovsk" , 0x08E66F }, - { "Europe/Uzhgorod" , 0x08EB80 }, - { "Europe/Vaduz" , 0x08F39C }, - { "Europe/Vatican" , 0x08FB1D }, - { "Europe/Vienna" , 0x09057A }, - { "Europe/Vilnius" , 0x090E1E }, - { "Europe/Volgograd" , 0x09169C }, - { "Europe/Warsaw" , 0x091B47 }, - { "Europe/Zagreb" , 0x0925B1 }, - { "Europe/Zaporozhye" , 0x092D3D }, - { "Europe/Zurich" , 0x09359E }, - { "Factory" , 0x093D1F }, - { "GB" , 0x093D9F }, - { "GB-Eire" , 0x094BEB }, - { "GMT" , 0x095A37 }, - { "GMT+0" , 0x095AB5 }, - { "GMT-0" , 0x095B33 }, - { "GMT0" , 0x095BB1 }, - { "Greenwich" , 0x095C2F }, - { "Hongkong" , 0x095CAD }, - { "HST" , 0x09616C }, - { "Iceland" , 0x0961EB }, - { "Indian/Antananarivo" , 0x096681 }, - { "Indian/Chagos" , 0x096796 }, - { "Indian/Christmas" , 0x096869 }, - { "Indian/Cocos" , 0x09691A }, - { "Indian/Comoro" , 0x0969D4 }, - { "Indian/Kerguelen" , 0x096AE9 }, - { "Indian/Mahe" , 0x096B9A }, - { "Indian/Maldives" , 0x096C4B }, - { "Indian/Mauritius" , 0x096D1E }, - { "Indian/Mayotte" , 0x096E1B }, - { "Indian/Reunion" , 0x096F30 }, - { "Iran" , 0x096FE1 }, - { "Israel" , 0x097A03 }, - { "Jamaica" , 0x098363 }, - { "Japan" , 0x098551 }, - { "Kwajalein" , 0x098692 }, - { "Libya" , 0x0987DA }, - { "MET" , 0x098A57 }, - { "Mexico/BajaNorte" , 0x099291 }, - { "Mexico/BajaSur" , 0x099BC3 }, - { "Mexico/General" , 0x09A1C5 }, - { "MST" , 0x09A801 }, - { "MST7MDT" , 0x09A87F }, - { "Navajo" , 0x09B191 }, - { "NZ" , 0x09BB29 }, - { "NZ-CHAT" , 0x09C4BA }, - { "Pacific/Apia" , 0x09CCDA }, - { "Pacific/Auckland" , 0x09CF4A }, - { "Pacific/Bougainville" , 0x09D8F3 }, - { "Pacific/Chatham" , 0x09DA17 }, - { "Pacific/Chuuk" , 0x09E246 }, - { "Pacific/Easter" , 0x09E36E }, - { "Pacific/Efate" , 0x09EC40 }, - { "Pacific/Enderbury" , 0x09EE66 }, - { "Pacific/Fakaofo" , 0x09EF5C }, - { "Pacific/Fiji" , 0x09F030 }, - { "Pacific/Funafuti" , 0x09F455 }, - { "Pacific/Galapagos" , 0x09F507 }, - { "Pacific/Gambier" , 0x09F612 }, - { "Pacific/Guadalcanal" , 0x09F6D1 }, - { "Pacific/Guam" , 0x09F783 }, - { "Pacific/Honolulu" , 0x09F97D }, - { "Pacific/Johnston" , 0x09FAD8 }, - { "Pacific/Kanton" , 0x09FC2D }, - { "Pacific/Kiritimati" , 0x09FD32 }, - { "Pacific/Kosrae" , 0x09FE38 }, - { "Pacific/Kwajalein" , 0x09FFA9 }, - { "Pacific/Majuro" , 0x0A00FA }, - { "Pacific/Marquesas" , 0x0A0259 }, - { "Pacific/Midway" , 0x0A0323 }, - { "Pacific/Nauru" , 0x0A03EC }, - { "Pacific/Niue" , 0x0A04F4 }, - { "Pacific/Norfolk" , 0x0A05CB }, - { "Pacific/Noumea" , 0x0A0947 }, - { "Pacific/Pago_Pago" , 0x0A0A83 }, - { "Pacific/Palau" , 0x0A0B3E }, - { "Pacific/Pitcairn" , 0x0A0BFE }, - { "Pacific/Pohnpei" , 0x0A0CD4 }, - { "Pacific/Ponape" , 0x0A0E1D }, - { "Pacific/Port_Moresby" , 0x0A0F58 }, - { "Pacific/Rarotonga" , 0x0A103B }, - { "Pacific/Saipan" , 0x0A12A2 }, - { "Pacific/Samoa" , 0x0A149C }, - { "Pacific/Tahiti" , 0x0A1557 }, - { "Pacific/Tarawa" , 0x0A1617 }, - { "Pacific/Tongatapu" , 0x0A16D8 }, - { "Pacific/Truk" , 0x0A1858 }, - { "Pacific/Wake" , 0x0A1971 }, - { "Pacific/Wallis" , 0x0A1A2E }, - { "Pacific/Yap" , 0x0A1AE0 }, - { "Poland" , 0x0A1BF9 }, - { "Portugal" , 0x0A2663 }, - { "PRC" , 0x0A3418 }, - { "PST8PDT" , 0x0A3655 }, - { "ROC" , 0x0A3F67 }, - { "ROK" , 0x0A426C }, - { "Singapore" , 0x0A44E1 }, - { "Turkey" , 0x0A466C }, - { "UCT" , 0x0A4E13 }, - { "Universal" , 0x0A4E91 }, - { "US/Alaska" , 0x0A4F0F }, - { "US/Aleutian" , 0x0A585E }, - { "US/Arizona" , 0x0A619E }, - { "US/Central" , 0x0A62F2 }, - { "US/East-Indiana" , 0x0A70F6 }, - { "US/Eastern" , 0x0A7784 }, - { "US/Hawaii" , 0x0A8560 }, - { "US/Indiana-Starke" , 0x0A86B5 }, - { "US/Michigan" , 0x0A903D }, - { "US/Mountain" , 0x0A98FF }, - { "US/Pacific" , 0x0AA297 }, - { "US/Samoa" , 0x0AADB7 }, - { "UTC" , 0x0AAE72 }, - { "W-SU" , 0x0AAEF0 }, - { "WET" , 0x0AB4FB }, - { "Zulu" , 0x0ABC78 }, + { "Asia/Harbin" , 0x048ADB }, + { "Asia/Hebron" , 0x048D18 }, + { "Asia/Ho_Chi_Minh" , 0x0496BF }, + { "Asia/Hong_Kong" , 0x04982A }, + { "Asia/Hovd" , 0x049CE9 }, + { "Asia/Irkutsk" , 0x04A09B }, + { "Asia/Istanbul" , 0x04A59C }, + { "Asia/Jakarta" , 0x04AD43 }, + { "Asia/Jayapura" , 0x04AEBF }, + { "Asia/Jerusalem" , 0x04AFDE }, + { "Asia/Kabul" , 0x04B93E }, + { "Asia/Kamchatka" , 0x04BA1A }, + { "Asia/Karachi" , 0x04BEC6 }, + { "Asia/Kashgar" , 0x04C04D }, + { "Asia/Kathmandu" , 0x04C0FE }, + { "Asia/Katmandu" , 0x04C1DE }, + { "Asia/Khandyga" , 0x04C2BE }, + { "Asia/Kolkata" , 0x04C7DF }, + { "Asia/Krasnoyarsk" , 0x04C908 }, + { "Asia/Kuala_Lumpur" , 0x04CDE4 }, + { "Asia/Kuching" , 0x04CF83 }, + { "Asia/Kuwait" , 0x04D180 }, + { "Asia/Macao" , 0x04D231 }, + { "Asia/Macau" , 0x04D708 }, + { "Asia/Magadan" , 0x04DBDF }, + { "Asia/Makassar" , 0x04E0C1 }, + { "Asia/Manila" , 0x04E214 }, + { "Asia/Muscat" , 0x04E368 }, + { "Asia/Nicosia" , 0x04E419 }, + { "Asia/Novokuznetsk" , 0x04EC0A }, + { "Asia/Novosibirsk" , 0x04F0B4 }, + { "Asia/Omsk" , 0x04F599 }, + { "Asia/Oral" , 0x04FA69 }, + { "Asia/Phnom_Penh" , 0x04FE71 }, + { "Asia/Pontianak" , 0x04FF44 }, + { "Asia/Pyongyang" , 0x0500C7 }, + { "Asia/Qatar" , 0x0501C0 }, + { "Asia/Qostanay" , 0x050293 }, + { "Asia/Qyzylorda" , 0x0506AC }, + { "Asia/Rangoon" , 0x050AD6 }, + { "Asia/Riyadh" , 0x050BEE }, + { "Asia/Saigon" , 0x050C9F }, + { "Asia/Sakhalin" , 0x050E0A }, + { "Asia/Samarkand" , 0x0512E0 }, + { "Asia/Seoul" , 0x05153E }, + { "Asia/Shanghai" , 0x0517B3 }, + { "Asia/Singapore" , 0x0519FC }, + { "Asia/Srednekolymsk" , 0x051B87 }, + { "Asia/Taipei" , 0x05206D }, + { "Asia/Tashkent" , 0x052372 }, + { "Asia/Tbilisi" , 0x0525DE }, + { "Asia/Tehran" , 0x0529F5 }, + { "Asia/Tel_Aviv" , 0x053417 }, + { "Asia/Thimbu" , 0x053D77 }, + { "Asia/Thimphu" , 0x053E4E }, + { "Asia/Tokyo" , 0x053F25 }, + { "Asia/Tomsk" , 0x054066 }, + { "Asia/Ujung_Pandang" , 0x054545 }, + { "Asia/Ulaanbaatar" , 0x05464F }, + { "Asia/Ulan_Bator" , 0x0549EB }, + { "Asia/Urumqi" , 0x054D72 }, + { "Asia/Ust-Nera" , 0x054E30 }, + { "Asia/Vientiane" , 0x055334 }, + { "Asia/Vladivostok" , 0x055407 }, + { "Asia/Yakutsk" , 0x0558DE }, + { "Asia/Yangon" , 0x055DB4 }, + { "Asia/Yekaterinburg" , 0x055ECC }, + { "Asia/Yerevan" , 0x0563C1 }, + { "Atlantic/Azores" , 0x05684C }, + { "Atlantic/Bermuda" , 0x057616 }, + { "Atlantic/Canary" , 0x057F7E }, + { "Atlantic/Cape_Verde" , 0x058701 }, + { "Atlantic/Faeroe" , 0x05881B }, + { "Atlantic/Faroe" , 0x058F3E }, + { "Atlantic/Jan_Mayen" , 0x059661 }, + { "Atlantic/Madeira" , 0x059F21 }, + { "Atlantic/Reykjavik" , 0x05ACEB }, + { "Atlantic/South_Georgia" , 0x05B181 }, + { "Atlantic/St_Helena" , 0x05B231 }, + { "Atlantic/Stanley" , 0x05B2D1 }, + { "Australia/ACT" , 0x05B79B }, + { "Australia/Adelaide" , 0x05C035 }, + { "Australia/Brisbane" , 0x05C8F0 }, + { "Australia/Broken_Hill" , 0x05CAB6 }, + { "Australia/Canberra" , 0x05D393 }, + { "Australia/Currie" , 0x05DC2D }, + { "Australia/Darwin" , 0x05E56F }, + { "Australia/Eucla" , 0x05E6D2 }, + { "Australia/Hobart" , 0x05E8CD }, + { "Australia/LHI" , 0x05F217 }, + { "Australia/Lindeman" , 0x05F967 }, + { "Australia/Lord_Howe" , 0x05FB6D }, + { "Australia/Melbourne" , 0x0602CD }, + { "Australia/North" , 0x060B6F }, + { "Australia/NSW" , 0x060CC0 }, + { "Australia/Perth" , 0x06155A }, + { "Australia/Queensland" , 0x061742 }, + { "Australia/South" , 0x0618F1 }, + { "Australia/Sydney" , 0x06219D }, + { "Australia/Tasmania" , 0x062A53 }, + { "Australia/Victoria" , 0x063395 }, + { "Australia/West" , 0x063C2F }, + { "Australia/Yancowinna" , 0x063DF9 }, + { "Brazil/Acre" , 0x0646BA }, + { "Brazil/DeNoronha" , 0x06493A }, + { "Brazil/East" , 0x064C12 }, + { "Brazil/West" , 0x0651C2 }, + { "Canada/Atlantic" , 0x06542A }, + { "Canada/Central" , 0x066196 }, + { "Canada/Eastern" , 0x066CD6 }, + { "Canada/Mountain" , 0x067A88 }, + { "Canada/Newfoundland" , 0x0683B0 }, + { "Canada/Pacific" , 0x069203 }, + { "Canada/Saskatchewan" , 0x069D5B }, + { "Canada/Yukon" , 0x06A13B }, + { "CET" , 0x06A795 }, + { "Chile/Continental" , 0x06AFCF }, + { "Chile/EasterIsland" , 0x06B9BC }, + { "CST6CDT" , 0x06C281 }, + { "Cuba" , 0x06CB93 }, + { "EET" , 0x06D50F }, + { "Egypt" , 0x06DC8F }, + { "Eire" , 0x06E43E }, + { "EST" , 0x06F1EE }, + { "EST5EDT" , 0x06F26C }, + { "Etc/GMT" , 0x06FB7E }, + { "Etc/GMT+0" , 0x06FBFC }, + { "Etc/GMT+1" , 0x06FC7A }, + { "Etc/GMT+10" , 0x06FCFA }, + { "Etc/GMT+11" , 0x06FD7B }, + { "Etc/GMT+12" , 0x06FDFC }, + { "Etc/GMT+2" , 0x06FE7D }, + { "Etc/GMT+3" , 0x06FEFD }, + { "Etc/GMT+4" , 0x06FF7D }, + { "Etc/GMT+5" , 0x06FFFD }, + { "Etc/GMT+6" , 0x07007D }, + { "Etc/GMT+7" , 0x0700FD }, + { "Etc/GMT+8" , 0x07017D }, + { "Etc/GMT+9" , 0x0701FD }, + { "Etc/GMT-0" , 0x07027D }, + { "Etc/GMT-1" , 0x0702FB }, + { "Etc/GMT-10" , 0x07037C }, + { "Etc/GMT-11" , 0x0703FE }, + { "Etc/GMT-12" , 0x070480 }, + { "Etc/GMT-13" , 0x070502 }, + { "Etc/GMT-14" , 0x070584 }, + { "Etc/GMT-2" , 0x070606 }, + { "Etc/GMT-3" , 0x070687 }, + { "Etc/GMT-4" , 0x070708 }, + { "Etc/GMT-5" , 0x070789 }, + { "Etc/GMT-6" , 0x07080A }, + { "Etc/GMT-7" , 0x07088B }, + { "Etc/GMT-8" , 0x07090C }, + { "Etc/GMT-9" , 0x07098D }, + { "Etc/GMT0" , 0x070A0E }, + { "Etc/Greenwich" , 0x070A8C }, + { "Etc/UCT" , 0x070B0A }, + { "Etc/Universal" , 0x070B88 }, + { "Etc/UTC" , 0x070C06 }, + { "Etc/Zulu" , 0x070C84 }, + { "Europe/Amsterdam" , 0x070D02 }, + { "Europe/Andorra" , 0x07186C }, + { "Europe/Astrakhan" , 0x071F46 }, + { "Europe/Athens" , 0x0723F1 }, + { "Europe/Belfast" , 0x072CD3 }, + { "Europe/Belgrade" , 0x073B1F }, + { "Europe/Berlin" , 0x0742AB }, + { "Europe/Bratislava" , 0x074BC5 }, + { "Europe/Brussels" , 0x0754CE }, + { "Europe/Bucharest" , 0x07604F }, + { "Europe/Budapest" , 0x0768E3 }, + { "Europe/Busingen" , 0x07722F }, + { "Europe/Chisinau" , 0x0779B8 }, + { "Europe/Copenhagen" , 0x07831A }, + { "Europe/Dublin" , 0x078B7F }, + { "Europe/Gibraltar" , 0x07992F }, + { "Europe/Guernsey" , 0x07A527 }, + { "Europe/Helsinki" , 0x07B373 }, + { "Europe/Isle_of_Man" , 0x07BAEB }, + { "Europe/Istanbul" , 0x07C937 }, + { "Europe/Jersey" , 0x07D0DE }, + { "Europe/Kaliningrad" , 0x07DF2A }, + { "Europe/Kiev" , 0x07E51F }, + { "Europe/Kirov" , 0x07ED87 }, + { "Europe/Lisbon" , 0x07F222 }, + { "Europe/Ljubljana" , 0x07FFEA }, + { "Europe/London" , 0x080776 }, + { "Europe/Luxembourg" , 0x0815C2 }, + { "Europe/Madrid" , 0x082150 }, + { "Europe/Malta" , 0x082BA2 }, + { "Europe/Mariehamn" , 0x0835EA }, + { "Europe/Minsk" , 0x083D62 }, + { "Europe/Monaco" , 0x084297 }, + { "Europe/Moscow" , 0x084E23 }, + { "Europe/Nicosia" , 0x085442 }, + { "Europe/Oslo" , 0x085C20 }, + { "Europe/Paris" , 0x0864E0 }, + { "Europe/Podgorica" , 0x08707E }, + { "Europe/Prague" , 0x08780A }, + { "Europe/Riga" , 0x088113 }, + { "Europe/Rome" , 0x0889B5 }, + { "Europe/Samara" , 0x089412 }, + { "Europe/San_Marino" , 0x0898F6 }, + { "Europe/Sarajevo" , 0x08A353 }, + { "Europe/Saratov" , 0x08AADF }, + { "Europe/Simferopol" , 0x08AF9A }, + { "Europe/Skopje" , 0x08B569 }, + { "Europe/Sofia" , 0x08BCF5 }, + { "Europe/Stockholm" , 0x08C51E }, + { "Europe/Tallinn" , 0x08CC9F }, + { "Europe/Tirane" , 0x08D50F }, + { "Europe/Tiraspol" , 0x08DD3F }, + { "Europe/Ulyanovsk" , 0x08E6A1 }, + { "Europe/Uzhgorod" , 0x08EBB2 }, + { "Europe/Vaduz" , 0x08F3DE }, + { "Europe/Vatican" , 0x08FB5F }, + { "Europe/Vienna" , 0x0905BC }, + { "Europe/Vilnius" , 0x090E60 }, + { "Europe/Volgograd" , 0x0916DE }, + { "Europe/Warsaw" , 0x091B89 }, + { "Europe/Zagreb" , 0x0925F3 }, + { "Europe/Zaporozhye" , 0x092D7F }, + { "Europe/Zurich" , 0x093600 }, + { "Factory" , 0x093D81 }, + { "GB" , 0x093E01 }, + { "GB-Eire" , 0x094C4D }, + { "GMT" , 0x095A99 }, + { "GMT+0" , 0x095B17 }, + { "GMT-0" , 0x095B95 }, + { "GMT0" , 0x095C13 }, + { "Greenwich" , 0x095C91 }, + { "Hongkong" , 0x095D0F }, + { "HST" , 0x0961CE }, + { "Iceland" , 0x09624D }, + { "Indian/Antananarivo" , 0x0966E3 }, + { "Indian/Chagos" , 0x0967F8 }, + { "Indian/Christmas" , 0x0968CB }, + { "Indian/Cocos" , 0x09697C }, + { "Indian/Comoro" , 0x096A36 }, + { "Indian/Kerguelen" , 0x096B4B }, + { "Indian/Mahe" , 0x096BFC }, + { "Indian/Maldives" , 0x096CAD }, + { "Indian/Mauritius" , 0x096D80 }, + { "Indian/Mayotte" , 0x096E7D }, + { "Indian/Reunion" , 0x096F92 }, + { "Iran" , 0x097043 }, + { "Israel" , 0x097A65 }, + { "Jamaica" , 0x0983C5 }, + { "Japan" , 0x0985B3 }, + { "Kwajalein" , 0x0986F4 }, + { "Libya" , 0x09883C }, + { "MET" , 0x098AB9 }, + { "Mexico/BajaNorte" , 0x0992F3 }, + { "Mexico/BajaSur" , 0x099C25 }, + { "Mexico/General" , 0x09A227 }, + { "MST" , 0x09A863 }, + { "MST7MDT" , 0x09A8E1 }, + { "Navajo" , 0x09B1F3 }, + { "NZ" , 0x09BB8B }, + { "NZ-CHAT" , 0x09C51C }, + { "Pacific/Apia" , 0x09CD3C }, + { "Pacific/Auckland" , 0x09CFAC }, + { "Pacific/Bougainville" , 0x09D955 }, + { "Pacific/Chatham" , 0x09DA79 }, + { "Pacific/Chuuk" , 0x09E2A8 }, + { "Pacific/Easter" , 0x09E3D0 }, + { "Pacific/Efate" , 0x09ECA2 }, + { "Pacific/Enderbury" , 0x09EEC8 }, + { "Pacific/Fakaofo" , 0x09EFBE }, + { "Pacific/Fiji" , 0x09F092 }, + { "Pacific/Funafuti" , 0x09F4B7 }, + { "Pacific/Galapagos" , 0x09F569 }, + { "Pacific/Gambier" , 0x09F674 }, + { "Pacific/Guadalcanal" , 0x09F733 }, + { "Pacific/Guam" , 0x09F7E5 }, + { "Pacific/Honolulu" , 0x09F9DF }, + { "Pacific/Johnston" , 0x09FB3A }, + { "Pacific/Kanton" , 0x09FC8F }, + { "Pacific/Kiritimati" , 0x09FD94 }, + { "Pacific/Kosrae" , 0x09FE9A }, + { "Pacific/Kwajalein" , 0x0A000B }, + { "Pacific/Majuro" , 0x0A015C }, + { "Pacific/Marquesas" , 0x0A02BB }, + { "Pacific/Midway" , 0x0A0385 }, + { "Pacific/Nauru" , 0x0A044E }, + { "Pacific/Niue" , 0x0A0556 }, + { "Pacific/Norfolk" , 0x0A062D }, + { "Pacific/Noumea" , 0x0A09A9 }, + { "Pacific/Pago_Pago" , 0x0A0AE5 }, + { "Pacific/Palau" , 0x0A0BA0 }, + { "Pacific/Pitcairn" , 0x0A0C60 }, + { "Pacific/Pohnpei" , 0x0A0D36 }, + { "Pacific/Ponape" , 0x0A0E7F }, + { "Pacific/Port_Moresby" , 0x0A0FBA }, + { "Pacific/Rarotonga" , 0x0A109D }, + { "Pacific/Saipan" , 0x0A1304 }, + { "Pacific/Samoa" , 0x0A14FE }, + { "Pacific/Tahiti" , 0x0A15B9 }, + { "Pacific/Tarawa" , 0x0A1679 }, + { "Pacific/Tongatapu" , 0x0A173A }, + { "Pacific/Truk" , 0x0A18BA }, + { "Pacific/Wake" , 0x0A19D3 }, + { "Pacific/Wallis" , 0x0A1A90 }, + { "Pacific/Yap" , 0x0A1B42 }, + { "Poland" , 0x0A1C5B }, + { "Portugal" , 0x0A26C5 }, + { "PRC" , 0x0A347A }, + { "PST8PDT" , 0x0A36B7 }, + { "ROC" , 0x0A3FC9 }, + { "ROK" , 0x0A42CE }, + { "Singapore" , 0x0A4543 }, + { "Turkey" , 0x0A46CE }, + { "UCT" , 0x0A4E75 }, + { "Universal" , 0x0A4EF3 }, + { "US/Alaska" , 0x0A4F71 }, + { "US/Aleutian" , 0x0A58C0 }, + { "US/Arizona" , 0x0A6200 }, + { "US/Central" , 0x0A6354 }, + { "US/East-Indiana" , 0x0A7158 }, + { "US/Eastern" , 0x0A77E6 }, + { "US/Hawaii" , 0x0A85C2 }, + { "US/Indiana-Starke" , 0x0A8717 }, + { "US/Michigan" , 0x0A909F }, + { "US/Mountain" , 0x0A9961 }, + { "US/Pacific" , 0x0AA2F9 }, + { "US/Samoa" , 0x0AAE19 }, + { "UTC" , 0x0AAED4 }, + { "W-SU" , 0x0AAF52 }, + { "WET" , 0x0AB55D }, + { "Zulu" , 0x0ABCDA }, }; -const unsigned char timelib_timezone_db_data_builtin[703734] = { +const unsigned char timelib_timezone_db_data_builtin[703832] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -37134,8 +37136,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD5, 0x33, 0x55, 0xC0, 0xD5, 0x76, 0x92, 0x40, 0xFD, 0xD1, 0x3C, 0x40, @@ -37170,7 +37172,7 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, +0x05, 0x06, 0x05, 0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, @@ -37179,9 +37181,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, -0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, -0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xD7, 0xC0, 0xFF, 0xFF, 0xFF, @@ -37244,7 +37246,7 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, +0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, @@ -38062,8 +38064,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, @@ -38111,8 +38113,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -38120,9 +38122,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, +0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, +0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, @@ -38209,8 +38211,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -43205,15 +43207,15 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, 0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, -0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, -0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, -0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, -0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, -0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, -0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, -0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, -0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, -0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3F, 0x8C, 0xE0, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1F, 0x6E, 0xE0, +0x65, 0x3A, 0xE1, 0x60, 0x66, 0x08, 0x8B, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE8, 0x6D, 0x60, +0x68, 0xFA, 0xA5, 0x60, 0x69, 0xC8, 0x4F, 0x60, 0x6A, 0xDA, 0x87, 0x60, 0x6B, 0xA8, 0x31, 0x60, +0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x88, 0x13, 0x60, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x67, 0xF5, 0x60, +0x70, 0x83, 0x67, 0xE0, 0x71, 0x51, 0x11, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x30, 0xF3, 0xE0, +0x74, 0x43, 0x2B, 0xE0, 0x75, 0x10, 0xD5, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xF0, 0xB7, 0xE0, +0x78, 0x0C, 0x2A, 0x60, 0x78, 0xD0, 0x99, 0xE0, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB0, 0x7B, 0xE0, +0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x99, 0x98, 0x60, 0x7D, 0xAB, 0xD0, 0x60, 0x7E, 0x79, 0x7A, 0x60, +0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43291,22 +43293,22 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, -0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, -0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, -0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, -0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, -0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, -0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, -0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, -0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, -0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, -0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, -0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, +0x3F, 0x8C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, +0x1F, 0x6E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, +0x08, 0x8B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, +0xE8, 0x6D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFA, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, +0xC8, 0x4F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDA, 0x87, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, +0xA8, 0x31, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, +0x88, 0x13, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x67, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, +0x51, 0x11, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, +0x30, 0xF3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x43, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x75, +0x10, 0xD5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, +0xF0, 0xB7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, +0xD0, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, +0xB0, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x99, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAB, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x79, 0x7A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43323,9 +43325,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, -0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, -0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, +0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, +0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, +0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43398,15 +43400,15 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x49, 0x6C, 0x50, 0x55, 0x15, 0xD2, 0xE0, 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, -0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, -0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, 0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, -0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, 0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, -0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, 0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, -0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, 0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, -0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, 0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, -0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, 0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, -0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, 0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, -0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, +0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3F, 0x8C, 0xE0, +0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1F, 0x6E, 0xE0, 0x65, 0x3A, 0xE1, 0x60, 0x66, 0x08, 0x8B, 0x60, +0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE8, 0x6D, 0x60, 0x68, 0xFA, 0xA5, 0x60, 0x69, 0xC8, 0x4F, 0x60, +0x6A, 0xDA, 0x87, 0x60, 0x6B, 0xA8, 0x31, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x88, 0x13, 0x60, +0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x67, 0xF5, 0x60, 0x70, 0x83, 0x67, 0xE0, 0x71, 0x51, 0x11, 0xE0, +0x72, 0x63, 0x49, 0xE0, 0x73, 0x30, 0xF3, 0xE0, 0x74, 0x43, 0x2B, 0xE0, 0x75, 0x10, 0xD5, 0xE0, +0x76, 0x2C, 0x48, 0x60, 0x76, 0xF0, 0xB7, 0xE0, 0x78, 0x0C, 0x2A, 0x60, 0x78, 0xD0, 0x99, 0xE0, +0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB0, 0x7B, 0xE0, 0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x99, 0x98, 0x60, +0x7D, 0xAB, 0xD0, 0x60, 0x7E, 0x79, 0x7A, 0x60, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43485,23 +43487,23 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, -0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, -0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, -0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, -0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, -0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, -0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, -0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, -0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, -0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0x8C, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x6E, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0x8B, 0x60, 0x00, 0x00, 0x00, +0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x6D, 0x60, 0x00, 0x00, 0x00, +0x00, 0x68, 0xFA, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x4F, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6A, 0xDA, 0x87, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x31, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x13, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x67, 0xF5, 0x60, 0x00, 0x00, 0x00, +0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x11, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x30, 0xF3, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x74, 0x43, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x10, 0xD5, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xB7, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0x99, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0x7B, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0x98, 0x60, 0x00, 0x00, 0x00, +0x00, 0x7D, 0xAB, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0x7A, 0x60, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43518,9 +43520,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, -0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, -0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, -0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, +0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, +0x35, 0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, +0x73, 0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -52415,8 +52417,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, @@ -52464,8 +52466,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -52473,9 +52475,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, +0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, +0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, @@ -52562,8 +52564,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -57536,8 +57538,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Kiev */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA7, 0x64, 0xB5, 0xA4, 0x19, 0x60, 0xCA, 0xCD, 0x2E, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCE, 0xCD, 0xA8, 0x70, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, @@ -57545,9 +57547,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x0B, 0xFB, 0xF0, 0x26, 0x8D, 0x20, 0xE0, 0x28, 0xE5, 0x17, 0x80, -0x29, 0xD4, 0xEC, 0x60, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, -0x2D, 0x94, 0xB0, 0x60, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, +0x29, 0xD5, 0x08, 0x80, 0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, +0x2D, 0x94, 0xCC, 0x80, 0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, 0x30, 0x64, 0x9F, 0x80, +0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, @@ -57569,24 +57571,25 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0A, 0x02, 0x0A, 0x02, 0x0A, -0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, -0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, -0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, +0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, +0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x22, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCD, 0x2E, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -57601,11 +57604,11 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x20, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, +0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, @@ -57649,20 +57652,21 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, -0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, 0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, @@ -60829,16 +60833,16 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Simferopol */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA4, 0x20, 0xB5, 0xA4, 0x19, 0x60, 0xCB, 0x04, 0x8D, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xCF, 0x9F, 0x38, 0xE0, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, 0x19, 0xDB, 0x43, 0x40, 0x1A, 0xCC, 0x93, 0xD0, 0x1B, 0xBC, 0xA0, 0xF0, 0x1C, 0xAC, 0x91, 0xF0, 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, -0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x29, 0xD4, 0xEC, 0x60, -0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, +0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x29, 0xD5, 0x08, 0x80, +0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, 0x2D, 0xC2, 0xC6, 0xD0, 0x2E, 0x84, 0x85, 0x40, 0x2F, 0x74, 0x84, 0x50, 0x30, 0x64, 0x67, 0x40, 0x31, 0x5D, 0xA0, 0xD0, 0x32, 0x72, 0xA6, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, @@ -60851,73 +60855,74 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x5E, 0x80, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0D, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, +0x08, 0x09, 0x08, 0x02, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0C, +0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, +0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, +0x0D, 0x0E, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, -0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, -0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC4, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, -0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x04, 0x8D, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x9F, 0x38, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, -0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, -0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, -0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, -0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, -0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, -0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, -0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, -0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, -0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, -0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, -0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, -0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, -0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, -0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, -0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, -0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, -0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, -0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x02, 0x0A, 0x02, 0x0A, -0x02, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x08, 0x00, 0x00, 0x1F, 0xF8, -0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, -0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, -0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, +0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC4, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA4, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x04, 0x8D, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x9F, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, +0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, +0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, +0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, +0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, +0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, +0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, +0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, +0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, +0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, +0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, +0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, +0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, +0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, +0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, +0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, +0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, +0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x02, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, +0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, +0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, +0x0C, 0x0D, 0x0E, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, +0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, +0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, +0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x4B, 0x2D, 0x33, 0x0A, 0x00, 0xCD, 0xEA, 0xD7, 0x01, 0x46, 0xB0, 0xD0, 0x00, 0x00, 0x00, 0x06, 0x43, 0x72, 0x69, 0x6D, 0x65, 0x61, @@ -61811,17 +61816,17 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Uzhgorod */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, 0xC8, 0x09, 0x71, 0x90, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xD0, 0xA1, 0x9E, 0xE0, 0xD1, 0xE5, 0xFD, 0xF0, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, 0x19, 0xDB, 0x43, 0x40, 0x1A, 0xCC, 0x93, 0xD0, 0x1B, 0xBC, 0xA0, 0xF0, 0x1C, 0xAC, 0x91, 0xF0, 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, -0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x27, 0xF5, 0x42, 0xA0, 0x29, 0xD4, 0xEC, 0x60, -0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, -0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, +0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x27, 0xF5, 0x42, 0xA0, 0x29, 0xD5, 0x08, 0x80, +0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, +0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, 0x30, 0x64, 0x9F, 0x80, 0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, @@ -61844,98 +61849,99 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, +0x09, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x4C, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, +0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, +0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA1, 0x9E, 0xE0, 0xFF, 0xFF, +0xFF, 0xFF, 0xD1, 0xE5, 0xFD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, +0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, +0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, +0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, +0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, +0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, +0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, +0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, +0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, +0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, +0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, +0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, +0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, +0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, +0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, +0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, +0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, +0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, +0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, +0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, +0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, +0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, +0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, +0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, +0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, +0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, +0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x01, 0x08, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x00, 0x00, +0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, -0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0xA1, 0x9E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xE5, 0xFD, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, -0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, -0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, -0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, -0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, -0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, -0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, -0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, -0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, -0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, -0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, -0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, -0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, -0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, -0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, -0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, -0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, -0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, -0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, -0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, -0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, -0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x4C, 0x4D, -0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, -0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, -0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, 0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, @@ -62882,8 +62888,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Zaporozhye */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA3, 0x30, 0xB5, 0xA4, 0x19, 0x60, 0xCA, 0xAA, 0xE7, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCE, 0xBD, 0xD6, 0x70, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, @@ -62891,9 +62897,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x0B, 0xFB, 0xF0, 0x27, 0x05, 0x27, 0x70, 0x27, 0xF5, 0x18, 0x70, -0x28, 0xE4, 0xED, 0x50, 0x29, 0xD4, 0xEC, 0x60, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, -0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, -0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, +0x28, 0xE4, 0xED, 0x50, 0x29, 0xD5, 0x08, 0x80, 0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, +0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, 0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, +0x30, 0x64, 0x9F, 0x80, 0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, @@ -62916,24 +62922,25 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x00, 0x00, +0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, -0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x1C, 0x20, +0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, +0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, -0x00, 0x0D, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, +0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, +0x00, 0x0F, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAA, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, @@ -62948,11 +62955,11 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, @@ -62996,20 +63003,21 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x09, 0x08, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x1F, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, -0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, +0x01, 0x1F, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, +0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, @@ -69555,4 +69563,4 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { }; #endif -const timelib_tzdb timezonedb_builtin = { "2021.5", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2022.1", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 86e9a91c11c3b..e51dcbe760504 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3631,6 +3631,15 @@ PHP_FUNCTION(timezone_transitions_get) add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i].abbr_idx]); \ add_next_index_zval(return_value, &element); +#define add_from_tto(to,ts) \ + array_init(&element); \ + add_assoc_long(&element, "ts", ts); \ + add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, ts, 0)); \ + add_assoc_long(&element, "offset", (to)->offset); \ + add_assoc_bool(&element, "isdst", (to)->is_dst); \ + add_assoc_string(&element, "abbr", (to)->abbr); \ + add_next_index_zval(return_value, &element); + #define add_last() add(tzobj->tzi.tz->bit64.timecnt - 1, timestamp_begin) array_init(return_value); @@ -3660,7 +3669,13 @@ PHP_FUNCTION(timezone_transitions_get) if (!found) { if (tzobj->tzi.tz->bit64.timecnt > 0) { - add_last(); + if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) { + timelib_time_offset *tto = timelib_get_time_zone_info(timestamp_begin, tzobj->tzi.tz); + add_from_tto(tto, timestamp_begin); + timelib_time_offset_dtor(tto); + } else { + add_last(); + } } else { add_nominal(); } @@ -3673,31 +3688,34 @@ PHP_FUNCTION(timezone_transitions_get) return; } } - if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) { - int i, j; - timelib_sll start_y, end_y, dummy_m, dummy_d; - timelib_sll last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1]; + } + if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) { + int i, j; + timelib_sll start_y, end_y, dummy_m, dummy_d; + timelib_sll last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1]; - /* Find out year for last transition */ - timelib_unixtime2date(last_transition_ts, &start_y, &dummy_m, &dummy_d); + /* Find out year for last transition */ + timelib_unixtime2date(last_transition_ts, &start_y, &dummy_m, &dummy_d); - /* Find out year for final boundary timestamp */ - timelib_unixtime2date(timestamp_end, &end_y, &dummy_m, &dummy_d); + /* Find out year for final boundary timestamp */ + timelib_unixtime2date(timestamp_end, &end_y, &dummy_m, &dummy_d); - for (i = start_y; i <= end_y; i++) { - timelib_posix_transitions transitions = { 0 }; + for (i = start_y; i <= end_y; i++) { + timelib_posix_transitions transitions = { 0 }; - timelib_get_transitions_for_year(tzobj->tzi.tz, i, &transitions); + timelib_get_transitions_for_year(tzobj->tzi.tz, i, &transitions); - for (j = 0; j < transitions.count; j++) { - if (transitions.times[j] <= last_transition_ts) { - continue; - } - if (transitions.times[j] > timestamp_end) { - return; - } - add_by_index(transitions.types[j], transitions.times[j]); + for (j = 0; j < transitions.count; j++) { + if (transitions.times[j] <= last_transition_ts) { + continue; + } + if (transitions.times[j] < timestamp_begin) { + continue; + } + if (transitions.times[j] > timestamp_end) { + return; } + add_by_index(transitions.types[j], transitions.times[j]); } } } diff --git a/ext/date/tests/DateTimeZone_getTransitions_bug1.phpt b/ext/date/tests/DateTimeZone_getTransitions_bug1.phpt new file mode 100644 index 0000000000000..7ac2c065219f1 --- /dev/null +++ b/ext/date/tests/DateTimeZone_getTransitions_bug1.phpt @@ -0,0 +1,58 @@ +--TEST-- +GH-7752: DateTimeZone::getTransitions() does not return enough information +--FILE-- +getTransitions($from, $to) as $t) { + printf("%12d %s %6d %s %s\n", $t['ts'], $t['time'], $t['offset'], $t['isdst'] ? "DST" : " x ", $t['abbr']); + } + echo "\n"; +} + + +showTransitions('Europe/London', 1648342200); +showTransitions('America/Los_Angeles', 1648557596); // GH Issue 7752 +showTransitions('America/Chicago', 1293861600); // PHP Bug 81660 +showTransitions('Europe/Paris', 1645095600); // GH Issue 8108 +?> +--EXPECT-- +Europe/London from @1648342200-@1727398200: + + 1648342200 2022-03-27T00:50:00+0000 0 x GMT + 1648342800 2022-03-27T01:00:00+0000 3600 DST BST + 1667091600 2022-10-30T01:00:00+0000 0 x GMT + 1679792400 2023-03-26T01:00:00+0000 3600 DST BST + 1698541200 2023-10-29T01:00:00+0000 0 x GMT + 1711846800 2024-03-31T01:00:00+0000 3600 DST BST + +America/Los_Angeles from @1648557596-@1727613596: + + 1648557596 2022-03-29T12:39:56+0000 -25200 DST PDT + 1667725200 2022-11-06T09:00:00+0000 -28800 x PST + 1678615200 2023-03-12T10:00:00+0000 -25200 DST PDT + 1699174800 2023-11-05T09:00:00+0000 -28800 x PST + 1710064800 2024-03-10T10:00:00+0000 -25200 DST PDT + +America/Chicago from @1293861600-@1372917600: + + 1293861600 2011-01-01T06:00:00+0000 -21600 x CST + 1300003200 2011-03-13T08:00:00+0000 -18000 DST CDT + 1320562800 2011-11-06T07:00:00+0000 -21600 x CST + 1331452800 2012-03-11T08:00:00+0000 -18000 DST CDT + 1352012400 2012-11-04T07:00:00+0000 -21600 x CST + 1362902400 2013-03-10T08:00:00+0000 -18000 DST CDT + +Europe/Paris from @1645095600-@1724151600: + + 1645095600 2022-02-17T11:00:00+0000 3600 x CET + 1648342800 2022-03-27T01:00:00+0000 7200 DST CEST + 1667091600 2022-10-30T01:00:00+0000 3600 x CET + 1679792400 2023-03-26T01:00:00+0000 7200 DST CEST + 1698541200 2023-10-29T01:00:00+0000 3600 x CET + 1711846800 2024-03-31T01:00:00+0000 7200 DST CEST diff --git a/ext/dba/dba.c b/ext/dba/dba.c index b01d11e165f61..842f85d73dcdb 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -21,7 +21,7 @@ #include "php.h" -#if HAVE_DBA +#ifdef HAVE_DBA #include "php_ini.h" #include @@ -160,72 +160,72 @@ static zend_string* php_dba_make_key(HashTable *key) /* {{{ globals */ static dba_handler handler[] = { -#if DBA_GDBM +#ifdef DBA_GDBM DBA_HND(gdbm, DBA_LOCK_EXT) /* Locking done in library if set */ #endif -#if DBA_DBM +#ifdef DBA_DBM DBA_HND(dbm, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_NDBM +#ifdef DBA_NDBM DBA_HND(ndbm, DBA_LOCK_ALL) /* Could be done in library: filemode = 0644 + S_ENFMT */ #endif -#if DBA_CDB +#ifdef DBA_CDB DBA_HND(cdb, DBA_STREAM_OPEN|DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_CDB_BUILTIN +#ifdef DBA_CDB_BUILTIN DBA_NAMED_HND(cdb_make, cdb, DBA_STREAM_OPEN|DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB1 +#ifdef DBA_DB1 DBA_HND(db1, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB2 +#ifdef DBA_DB2 DBA_HND(db2, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB3 +#ifdef DBA_DB3 DBA_HND(db3, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB4 +#ifdef DBA_DB4 DBA_HND(db4, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_INIFILE +#ifdef DBA_INIFILE DBA_HND(inifile, DBA_STREAM_OPEN|DBA_LOCK_ALL|DBA_CAST_AS_FD) /* No lock in lib */ #endif -#if DBA_FLATFILE +#ifdef DBA_FLATFILE DBA_HND(flatfile, DBA_STREAM_OPEN|DBA_LOCK_ALL|DBA_NO_APPEND) /* No lock in lib */ #endif -#if DBA_QDBM +#ifdef DBA_QDBM DBA_HND(qdbm, DBA_LOCK_EXT) #endif -#if DBA_TCADB +#ifdef DBA_TCADB DBA_HND(tcadb, DBA_LOCK_ALL) #endif -#if DBA_LMDB +#ifdef DBA_LMDB DBA_HND(lmdb, DBA_LOCK_EXT) #endif { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #define DBA_DEFAULT "flatfile" -#elif DBA_DB4 +#elif defined(DBA_DB4) #define DBA_DEFAULT "db4" -#elif DBA_DB3 +#elif defined(DBA_DB3) #define DBA_DEFAULT "db3" -#elif DBA_DB2 +#elif defined(DBA_DB2) #define DBA_DEFAULT "db2" -#elif DBA_DB1 +#elif defined(DBA_DB1) #define DBA_DEFAULT "db1" -#elif DBA_GDBM +#elif defined(DBA_GDBM) #define DBA_DEFAULT "gdbm" -#elif DBA_NBBM +#elif defined(DBA_NBBM) #define DBA_DEFAULT "ndbm" -#elif DBA_DBM +#elif defined(DBA_DBM) #define DBA_DEFAULT "dbm" -#elif DBA_QDBM +#elif defined(DBA_QDBM) #define DBA_DEFAULT "qdbm" -#elif DBA_TCADB +#elif defined(DBA_TCADB) #define DBA_DEFAULT "tcadb" -#elif DBA_LMDB +#elif defined(DBA_LMDB) #define DBA_DEFAULT "lmdb" #else #define DBA_DEFAULT "" diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index 6b5013961f760..5af9121b565a6 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -21,7 +21,7 @@ #include "php.h" -#if DBA_CDB +#ifdef DBA_CDB #include "php_cdb.h" #include diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 6f0f402b8d350..3a95cea460c14 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB1 +#ifdef DBA_DB1 #include "php_db1.h" #ifdef DB1_INCLUDE_FILE diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 373464f80ec9b..8f6d47a9239c9 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB2 +#ifdef DBA_DB2 #include "php_db2.h" #include diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 8d25c7463ac84..d9e948a623f50 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB3 +#ifdef DBA_DB3 #include "php_db3.h" #include diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 3e9aaa13d4300..3de66a4274432 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -21,7 +21,7 @@ #include "php.h" -#if DBA_DB4 +#ifdef DBA_DB4 #include "php_db4.h" #include diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 316398e6ac736..afa645cb2fe70 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -20,13 +20,13 @@ #include "php.h" -#if DBA_DBM +#ifdef DBA_DBM #include "php_dbm.h" #ifdef DBM_INCLUDE_FILE #include DBM_INCLUDE_FILE #endif -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_gdbm.h" #endif diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index b631fe9352baa..9d5b31128c076 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #include "php_flatfile.h" #include "libflatfile/flatfile.h" diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index 1a47d1d708aa4..ec968f3f203e7 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_gdbm.h" #ifdef GDBM_INCLUDE_FILE diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index dd0bc30f3d349..fe0adbccbfe9c 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_INIFILE +#ifdef DBA_INIFILE #include "php_inifile.h" #include "libinifile/inifile.h" diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index b7c8151204d5c..e8fb99b569827 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_LMDB +#ifdef DBA_LMDB #include "php_lmdb.h" #ifdef LMDB_INCLUDE_FILE diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index a97d3595a0cda..d872add48e6ab 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_NDBM +#ifdef DBA_NDBM #include "php_ndbm.h" #include diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 129b40915fab3..d06af20659909 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_QDBM +#ifdef DBA_QDBM #include "php_qdbm.h" #ifdef QDBM_INCLUDE_FILE diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index 4d0d65bf91529..23c9e2d1d363d 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_TCADB +#ifdef DBA_TCADB #include "php_tcadb.h" #ifdef TCADB_INCLUDE_FILE diff --git a/ext/dba/php_cdb.h b/ext/dba/php_cdb.h index a046f0796b378..9e6ebff9c6ba2 100644 --- a/ext/dba/php_cdb.h +++ b/ext/dba/php_cdb.h @@ -1,7 +1,7 @@ #ifndef PHP_CDB_H #define PHP_CDB_H -#if DBA_CDB +#ifdef DBA_CDB #include "php_dba.h" diff --git a/ext/dba/php_db1.h b/ext/dba/php_db1.h index c0bb5f08b4b6c..f8a97e6b83adf 100644 --- a/ext/dba/php_db1.h +++ b/ext/dba/php_db1.h @@ -1,7 +1,7 @@ #ifndef PHP_DB1_H #define PHP_DB1_H -#if DBA_DB1 +#ifdef DBA_DB1 #include "php_dba.h" diff --git a/ext/dba/php_db2.h b/ext/dba/php_db2.h index 2a95223a85442..b54dcdeec02bd 100644 --- a/ext/dba/php_db2.h +++ b/ext/dba/php_db2.h @@ -1,7 +1,7 @@ #ifndef PHP_DB2_H #define PHP_DB2_H -#if DBA_DB2 +#ifdef DBA_DB2 #include "php_dba.h" diff --git a/ext/dba/php_db3.h b/ext/dba/php_db3.h index 58bb0b62a08f7..f27380bbb1dc2 100644 --- a/ext/dba/php_db3.h +++ b/ext/dba/php_db3.h @@ -1,7 +1,7 @@ #ifndef PHP_DB3_H #define PHP_DB3_H -#if DBA_DB3 +#ifdef DBA_DB3 #include "php_dba.h" diff --git a/ext/dba/php_db4.h b/ext/dba/php_db4.h index fa814c3f5ec4b..1eb8067e820fb 100644 --- a/ext/dba/php_db4.h +++ b/ext/dba/php_db4.h @@ -1,7 +1,7 @@ #ifndef PHP_DB4_H #define PHP_DB4_H -#if DBA_DB4 +#ifdef DBA_DB4 #include "php_dba.h" diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index a2ad7fad60466..28ca887222f9c 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -20,7 +20,7 @@ #include "php_version.h" #define PHP_DBA_VERSION PHP_VERSION -#if HAVE_DBA +#ifdef HAVE_DBA typedef enum { /* do not allow 0 here */ diff --git a/ext/dba/php_dbm.h b/ext/dba/php_dbm.h index 4c963d18ed91f..d53c09fcb2bfd 100644 --- a/ext/dba/php_dbm.h +++ b/ext/dba/php_dbm.h @@ -1,7 +1,7 @@ #ifndef PHP_DBM_H #define PHP_DBM_H -#if DBA_DBM +#ifdef DBA_DBM #include "php_dba.h" diff --git a/ext/dba/php_flatfile.h b/ext/dba/php_flatfile.h index afa9f6d5d3920..71c46a95eaaf5 100644 --- a/ext/dba/php_flatfile.h +++ b/ext/dba/php_flatfile.h @@ -1,7 +1,7 @@ #ifndef PHP_FLATFILE_H #define PHP_FLATFILE_H -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #include "php_dba.h" diff --git a/ext/dba/php_gdbm.h b/ext/dba/php_gdbm.h index 3068404cfe265..0657c424a1ada 100644 --- a/ext/dba/php_gdbm.h +++ b/ext/dba/php_gdbm.h @@ -1,7 +1,7 @@ #ifndef PHP_GDBM_H #define PHP_GDBM_H -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_dba.h" diff --git a/ext/dba/php_inifile.h b/ext/dba/php_inifile.h index 69444df3c6d48..eef58acfa6723 100644 --- a/ext/dba/php_inifile.h +++ b/ext/dba/php_inifile.h @@ -1,7 +1,7 @@ #ifndef PHP_INIFILE_H #define PHP_INIFILE_H -#if DBA_INIFILE +#ifdef DBA_INIFILE #include "php_dba.h" diff --git a/ext/dba/php_lmdb.h b/ext/dba/php_lmdb.h index 1b4928f49bffa..421f6a0094958 100644 --- a/ext/dba/php_lmdb.h +++ b/ext/dba/php_lmdb.h @@ -1,7 +1,7 @@ #ifndef PHP_LMDB_H #define PHP_LMDB_H -#if DBA_LMDB +#ifdef DBA_LMDB #include "php_dba.h" diff --git a/ext/dba/php_ndbm.h b/ext/dba/php_ndbm.h index b1ebf15af32d7..68c04c680cfe1 100644 --- a/ext/dba/php_ndbm.h +++ b/ext/dba/php_ndbm.h @@ -1,7 +1,7 @@ #ifndef PHP_NDBM_H #define PHP_NDBM_H -#if DBA_NDBM +#ifdef DBA_NDBM #include "php_dba.h" diff --git a/ext/dba/php_qdbm.h b/ext/dba/php_qdbm.h index c88efcff4cfa1..bec4e8c50b3b8 100644 --- a/ext/dba/php_qdbm.h +++ b/ext/dba/php_qdbm.h @@ -1,7 +1,7 @@ #ifndef PHP_QDBM_H #define PHP_QDBM_H -#if DBA_QDBM +#ifdef DBA_QDBM #include "php_dba.h" diff --git a/ext/dba/php_tcadb.h b/ext/dba/php_tcadb.h index 8b145f3ea5c37..6bfecf7d6d96f 100644 --- a/ext/dba/php_tcadb.h +++ b/ext/dba/php_tcadb.h @@ -17,7 +17,7 @@ #ifndef PHP_TCADB_H #define PHP_TCADB_H -#if DBA_TCADB +#ifdef DBA_TCADB #include "php_dba.h" diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 91bf929a9d00e..182f2b3cd0448 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -504,7 +504,7 @@ void php_filter_validate_regexp(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ } } -static int _php_filter_validate_domain(char * domain, int len, zend_long flags) /* {{{ */ +static int _php_filter_validate_domain(char * domain, size_t len, zend_long flags) /* {{{ */ { char *e, *s, *t; size_t l; @@ -517,7 +517,7 @@ static int _php_filter_validate_domain(char * domain, int len, zend_long flags) t = e - 1; /* Ignore trailing dot */ - if (*t == '.') { + if (l > 0 && *t == '.') { e = t; l--; } diff --git a/ext/hash/hash.c b/ext/hash/hash.c index 62b82263dc7e3..14c960872014d 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -234,6 +234,9 @@ PHP_HASH_API int php_hash_serialize_spec(const php_hashcontext_object *hash, zva size_t pos = 0, max_alignment = 1; unsigned char *buf = (unsigned char *) hash->context; zval tmp; + if (buf == NULL) { + return FAILURE; + } array_init(zv); while (*spec != '\0' && *spec != '.') { char spec_ch = *spec; diff --git a/ext/hash/tests/bug81714.phpt b/ext/hash/tests/bug81714.phpt new file mode 100644 index 0000000000000..a151bda6884e1 --- /dev/null +++ b/ext/hash/tests/bug81714.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #81714 (segfault when serializing finalized HashContext) +--FILE-- +getMessage()); +} +?> +--EXPECTF-- +string(52) "HashContext for algorithm "md5" cannot be serialized" diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp index 2027fb45c5c44..4513b9405f99c 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.cpp +++ b/ext/intl/breakiterator/breakiterator_iterators.cpp @@ -127,6 +127,7 @@ typedef struct zoi_break_iter_parts { zoi_with_current zoi_cur; parts_iter_key_type key_type; BreakIterator_object *bio; /* so we don't have to fetch it all the time */ + zend_ulong index_right; } zoi_break_iter_parts; static void _breakiterator_parts_destroy_it(zend_object_iterator *iter) @@ -136,8 +137,16 @@ static void _breakiterator_parts_destroy_it(zend_object_iterator *iter) static void _breakiterator_parts_get_current_key(zend_object_iterator *iter, zval *key) { - /* the actual work is done in move_forward and rewind */ - ZVAL_LONG(key, iter->index); + // The engine resets the iterator index to -1 after rewinding. When using + // PARTS_ITERATOR_KEY_RIGHT we store it in zoi_break_iter_parts.index_right + // so it doesn't get lost. + zoi_break_iter_parts *zoi_bit = (zoi_break_iter_parts*)iter; + + if (zoi_bit->key_type == PARTS_ITERATOR_KEY_RIGHT && iter->index == 0) { + ZVAL_LONG(key, zoi_bit->index_right); + } else { + ZVAL_LONG(key, iter->index); + } } static void _breakiterator_parts_move_forward(zend_object_iterator *iter) @@ -163,6 +172,7 @@ static void _breakiterator_parts_move_forward(zend_object_iterator *iter) iter->index = cur; } else if (zoi_bit->key_type == PARTS_ITERATOR_KEY_RIGHT) { iter->index = next; + zoi_bit->index_right = next; } /* else zoi_bit->key_type == PARTS_ITERATOR_KEY_SEQUENTIAL * No need to do anything, the engine increments ->index */ @@ -229,6 +239,7 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv, assert(((zoi_break_iter_parts*)ii->iterator)->bio->biter != NULL); ((zoi_break_iter_parts*)ii->iterator)->key_type = key_type; + ((zoi_break_iter_parts*)ii->iterator)->index_right = 0; } U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator) diff --git a/ext/intl/tests/gh7734.phpt b/ext/intl/tests/gh7734.phpt new file mode 100644 index 0000000000000..a8ba1aa8df07d --- /dev/null +++ b/ext/intl/tests/gh7734.phpt @@ -0,0 +1,42 @@ +--TEST-- +GH-7734 (IntlPartsIterator key is wrong for KEY_LEFT/KEY_RIGHT) +--EXTENSIONS-- +intl +--FILE-- +setText('ABC'); + +foreach ($iter->getPartsIterator(\IntlPartsIterator::KEY_SEQUENTIAL) as $key => $value) { + var_dump($key, $value); +} + +foreach ($iter->getPartsIterator(\IntlPartsIterator::KEY_LEFT) as $key => $value) { + var_dump($key, $value); +} + +foreach ($iter->getPartsIterator(\IntlPartsIterator::KEY_RIGHT) as $key => $value) { + var_dump($key, $value); +} + +?> +--EXPECT-- +int(0) +string(1) "A" +int(1) +string(1) "B" +int(2) +string(1) "C" +int(0) +string(1) "A" +int(1) +string(1) "B" +int(2) +string(1) "C" +int(1) +string(1) "A" +int(2) +string(1) "B" +int(3) +string(1) "C" diff --git a/ext/json/json.c b/ext/json/json.c index b21ed4d14b20e..c66a48c49ea88 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -83,6 +83,7 @@ static PHP_MINIT_FUNCTION(json) PHP_JSON_REGISTER_CONSTANT("JSON_ERROR_UNSUPPORTED_TYPE", PHP_JSON_ERROR_UNSUPPORTED_TYPE); PHP_JSON_REGISTER_CONSTANT("JSON_ERROR_INVALID_PROPERTY_NAME", PHP_JSON_ERROR_INVALID_PROPERTY_NAME); PHP_JSON_REGISTER_CONSTANT("JSON_ERROR_UTF16", PHP_JSON_ERROR_UTF16); + PHP_JSON_REGISTER_CONSTANT("JSON_ERROR_NON_BACKED_ENUM", PHP_JSON_ERROR_NON_BACKED_ENUM); return SUCCESS; } diff --git a/ext/mysqli/mysqli.stub.php b/ext/mysqli/mysqli.stub.php index 5add2523c54b9..46d101125aa43 100644 --- a/ext/mysqli/mysqli.stub.php +++ b/ext/mysqli/mysqli.stub.php @@ -20,58 +20,112 @@ final class mysqli_driver class mysqli { - /** @link mysqli.affected-rows */ + /** + * @readonly + * @link mysqli.affected-rows + */ public int|string $affected_rows; - /** @link mysqli.get-client-info */ + /** + * @readonly + * @link mysqli.get-client-info + */ public string $client_info; - /** @link mysqli.get-client-version */ + /** + * @readonly + * @link mysqli.get-client-version + */ public int $client_version; - /** @link mysqli.connect-errno */ + /** + * @readonly + * @link mysqli.connect-errno + */ public int $connect_errno; - /** @link mysqli.connect-error */ + /** + * @readonly + * @link mysqli.connect-error + */ public ?string $connect_error; - /** @link mysqli.errno */ + /** + * @readonly + * @link mysqli.errno + */ public int $errno; - /** @link mysqli.error */ + /** + * @readonly + * @link mysqli.error + */ public string $error; - /** @link mysqli.error-list */ + /** + * @readonly + * @link mysqli.error-list + */ public array $error_list; - /** @link mysqli.field-count */ + /** + * @readonly + * @link mysqli.field-count + */ public int $field_count; - /** @link mysqli.get-host-info */ + /** + * @readonly + * @link mysqli.get-host-info + */ public string $host_info; - /** @link mysqli.info */ + /** + * @readonly + * @link mysqli.info + */ public ?string $info; - /** @link mysqli.insert-id */ + /** + * @readonly + * @link mysqli.insert-id + */ public int|string $insert_id; - /** @link mysqli.get-server-info */ + /** + * @readonly + * @link mysqli.get-server-info + */ public string $server_info; - /** @link mysqli.get-server-version */ + /** + * @readonly + * @link mysqli.get-server-version + */ public int $server_version; - /** @link mysqli.sqlstate */ + /** + * @readonly + * @link mysqli.sqlstate + */ public string $sqlstate; - /** @link mysqli.get-proto-info */ + /** + * @readonly + * @link mysqli.get-proto-info + */ public int $protocol_version; - /** @link mysqli.thread-id */ + /** + * @readonly + * @link mysqli.thread-id + */ public int $thread_id; - /** @link mysqli.warning-count */ + /** + * @readonly + * @link mysqli.warning-count + */ public int $warning_count; public function __construct( @@ -373,16 +427,28 @@ public function refresh(int $flags): bool {} class mysqli_result implements IteratorAggregate { - /** @link mysqli-result.current-field */ + /** + * @readonly + * @link mysqli-result.current-field + */ public int $current_field; - /** @link mysqli-result.field-count */ + /** + * @readonly + * @link mysqli-result.field-count + */ public int $field_count; - /** @link mysqli-result.lengths */ + /** + * @readonly + * @link mysqli-result.lengths + */ public ?array $lengths; - /** @link mysqli-result.num-rows */ + /** + * @readonly + * @link mysqli-result.num-rows + */ public int|string $num_rows; public int $type; @@ -480,31 +546,58 @@ public function getIterator(): Iterator {} class mysqli_stmt { - /** @link mysqli-stmt.affected-rows */ + /** + * @readonly + * @link mysqli-stmt.affected-rows + */ public int|string $affected_rows; - /** @link mysqli-stmt.insert-id */ + /** + * @readonly + * @link mysqli-stmt.insert-id + */ public int|string $insert_id; - /** @link mysqli-stmt.num-rows */ + /** + * @readonly + * @link mysqli-stmt.num-rows + */ public int|string $num_rows; - /** @link mysqli-stmt.param-count */ + /** + * @readonly + * @link mysqli-stmt.param-count + */ public int $param_count; - /** @link mysqli-stmt.field-count */ + /** + * @readonly + * @link mysqli-stmt.field-count + */ public int $field_count; - /** @link mysqli-stmt.errno */ + /** + * @readonly + * @link mysqli-stmt.errno + */ public int $errno; - /** @link mysqli-stmt.error */ + /** + * @readonly + * @link mysqli-stmt.error + */ public string $error; - /** @link mysqli-stmt.error-list */ + /** + * @readonly + * @link mysqli-stmt.error-list + */ public array $error_list; - /** @link mysqli-stmt.sqlstate */ + /** + * @readonly + * @link mysqli-stmt.sqlstate + */ public string $sqlstate; public int $id; diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h index b01179089a507..7dd1c6b0ce886 100644 --- a/ext/mysqli/mysqli_arginfo.h +++ b/ext/mysqli/mysqli_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 7901d2cbbf9663f2c0cc140870baed0fe04c2bd1 */ + * Stub hash: 9ef8917aa1b4fe7420fe12c5629ef00f36df3256 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mysqli_affected_rows, 0, 1, MAY_BE_LONG|MAY_BE_STRING) ZEND_ARG_OBJ_INFO(0, mysql, mysqli, 0) diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index f0be14edfd890..cff362d7c68fd 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -127,8 +127,6 @@ typedef struct { #ifdef PHP_WIN32 #define PHP_MYSQLI_API __declspec(dllexport) -#define MYSQLI_LLU_SPEC "%I64u" -#define MYSQLI_LL_SPEC "%I64d" #ifndef L64 #define L64(x) x##i64 #endif @@ -139,16 +137,17 @@ typedef __int64 my_longlong; # else # define PHP_MYSQLI_API # endif -/* we need this for PRIu64 and PRId64 */ -#include -#define MYSQLI_LLU_SPEC "%" PRIu64 -#define MYSQLI_LL_SPEC "%" PRId64 #ifndef L64 #define L64(x) x##LL #endif typedef int64_t my_longlong; #endif +/* we need this for PRIu64 and PRId64 */ +#include +#define MYSQLI_LLU_SPEC "%" PRIu64 +#define MYSQLI_LL_SPEC "%" PRId64 + #ifdef ZTS #include "TSRM.h" #endif diff --git a/ext/mysqli/tests/gh8267.phpt b/ext/mysqli/tests/gh8267.phpt new file mode 100644 index 0000000000000..805bd695a6f92 --- /dev/null +++ b/ext/mysqli/tests/gh8267.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug GH-8267 (MySQLi uses unsupported format specifier on Windows) +--EXTENSIONS-- +mysqli +--SKIPIF-- + +--FILE-- +query("DROP TABLE IF EXISTS foo"); +$mysqli->query("CREATE TABLE foo (id BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY (id))"); +$mysqli->query("INSERT INTO foo VALUES (9223372036854775807)"); +var_dump($mysqli->insert_id); +$mysqli->query("INSERT INTO foo VALUES (0)"); +var_dump($mysqli->insert_id); +?> +--EXPECT-- +string(19) "9223372036854775807" +string(19) "9223372036854775808" diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index a7bff8051f731..15ccec4522beb 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -369,7 +369,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s) /* {{{ mysqlnd_stmt::prepare */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query, const size_t query_len) +MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, const size_t query_len) { MYSQLND_STMT_DATA * stmt = s? s->data : NULL; MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL; @@ -391,12 +391,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query /* Create a new prepared statement and destroy the previous one. */ - s->m->dtor(s, TRUE); - s = conn->m->stmt_init(conn); - if (!s) { + MYSQLND_STMT * s_to_prepare = conn->m->stmt_init(conn); + if (!s_to_prepare) { goto fail; } - stmt = s->data; + MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare->data; + + /* swap */ + size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + char * tmp_swap = mnd_emalloc(real_size); + memcpy(tmp_swap, s, real_size); + memcpy(s, s_to_prepare, real_size); + memcpy(s_to_prepare, tmp_swap, real_size); + mnd_efree(tmp_swap); + { + MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare; + stmt_to_prepare = stmt; + stmt = tmp_swap_data; + } + s_to_prepare->m->dtor(s_to_prepare, TRUE); } { diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index ac79c57f2b2a9..f75a3a89187c7 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1096,9 +1096,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } if ((tmp_val != NULL) && (tmp != NULL) && - (ZSTR_LEN(tmp->hash_key) == ZSTR_LEN(hashed_details.s)) && - (memcmp(ZSTR_VAL(tmp->hash_key), ZSTR_VAL(hashed_details.s), - ZSTR_LEN(tmp->hash_key)) == 0)) { + zend_string_equals(tmp->hash_key, hashed_details.s)) { connection = tmp; GC_ADDREF(connection->id); } @@ -2120,8 +2118,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * } zend_register_persistent_resource_ex(session_pool->spool_hash_key, session_pool, le_psessionpool); } else if (spool_out_le->type == le_psessionpool && - ZSTR_LEN(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == ZSTR_LEN(spool_hashed_details.s) && - memcmp(ZSTR_VAL(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key), ZSTR_VAL(spool_hashed_details.s), ZSTR_LEN(spool_hashed_details.s)) == 0) { + zend_string_equals(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key, spool_hashed_details.s)) { /* retrieve the cached session pool */ session_pool = (php_oci_spool *)(spool_out_le->ptr); } diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index a533a074a2603..af040eba9ca93 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -109,12 +109,12 @@ zend_accel_shared_globals *accel_shared_globals = NULL; #ifdef ZEND_WIN32 char accel_uname_id[32]; #endif -bool accel_startup_ok = 0; +bool accel_startup_ok = false; static char *zps_failure_reason = NULL; char *zps_api_failure_reason = NULL; -bool file_cache_only = 0; /* process uses file cache only */ +bool file_cache_only = false; /* process uses file cache only */ #if ENABLE_FILE_CACHE_FALLBACK -bool fallback_process = 0; /* process uses file cache fallback */ +bool fallback_process = false; /* process uses file cache fallback */ #endif static zend_op_array *(*accelerator_orig_compile_file)(zend_file_handle *file_handle, int type); @@ -185,7 +185,7 @@ static time_t zend_accel_get_time(void) # define zend_accel_get_time() time(NULL) #endif -static inline int is_stream_path(const char *filename) +static inline bool is_stream_path(const char *filename) { const char *p; @@ -198,7 +198,7 @@ static inline int is_stream_path(const char *filename) return ((p != filename) && (p[0] == ':') && (p[1] == '/') && (p[2] == '/')); } -static inline int is_cacheable_stream_path(const char *filename) +static inline bool is_cacheable_stream_path(const char *filename) { return memcmp(filename, "file://", sizeof("file://") - 1) == 0 || memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; @@ -225,7 +225,7 @@ static ZEND_FUNCTION(accel_chdir) } } ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; } static inline zend_string* accel_getcwd(void) @@ -240,7 +240,7 @@ static inline zend_string* accel_getcwd(void) } ZCG(cwd) = zend_string_init(cwd, strlen(cwd), 0); ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; return ZCG(cwd); } } @@ -264,7 +264,7 @@ static ZEND_INI_MH(accel_include_path_on_modify) if (ret == SUCCESS) { ZCG(include_path) = new_value; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; } return ret; } @@ -285,13 +285,13 @@ static inline void accel_restart_enter(void) zend_accel_error(ACCEL_LOG_DEBUG, "RestartC(+1): %s (%d)", strerror(errno), errno); } #endif - ZCSG(restart_in_progress) = 1; + ZCSG(restart_in_progress) = true; } static inline void accel_restart_leave(void) { #ifdef ZEND_WIN32 - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; DECREMENT(restart_in); #else struct flock restart_finished; @@ -301,7 +301,7 @@ static inline void accel_restart_leave(void) restart_finished.l_start = 2; restart_finished.l_len = 1; - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; if (fcntl(lock_file, F_SETLK, &restart_finished) == -1) { zend_accel_error(ACCEL_LOG_DEBUG, "RestartC(-1): %s (%d)", strerror(errno), errno); } @@ -324,7 +324,7 @@ static inline int accel_restart_is_active(void) return FAILURE; } if (restart_check.l_type == F_UNLCK) { - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; return 0; } else { return 1; @@ -366,7 +366,7 @@ static inline void accel_deactivate_sub(void) if (ZCG(counted)) { SHM_UNPROTECT(); DECREMENT(mem_usage); - ZCG(counted) = 0; + ZCG(counted) = false; SHM_PROTECT(); } #else @@ -484,7 +484,7 @@ static zend_always_inline zend_string *accel_find_interned_string(zend_string *s if (!ZCG(accelerator_enabled) || accel_activate_add() == FAILURE) { return NULL; } - ZCG(counted) = 1; + ZCG(counted) = true; } h = zend_string_hash_val(str); @@ -590,10 +590,8 @@ static zend_always_inline zend_string *accel_find_interned_string_ex(zend_ulong if (EXPECTED(pos != STRTAB_INVALID_POS)) { do { s = STRTAB_POS_TO_STR(&ZCSG(interned_strings), pos); - if (EXPECTED(ZSTR_H(s) == h) && EXPECTED(ZSTR_LEN(s) == size)) { - if (!memcmp(ZSTR_VAL(s), str, size)) { - return s; - } + if (EXPECTED(ZSTR_H(s) == h) && zend_string_equals_cstr(s, str, size)) { + return s; } pos = STRTAB_COLLISION(s); } while (pos != STRTAB_INVALID_POS); @@ -802,9 +800,9 @@ static void accel_use_shm_interned_strings(void) if (ZCSG(interned_strings).saved_top == NULL) { accel_copy_permanent_strings(accel_new_interned_string); } else { - ZCG(counted) = 1; + ZCG(counted) = true; accel_copy_permanent_strings(accel_replace_string_by_shm_permanent); - ZCG(counted) = 0; + ZCG(counted) = false; } accel_interned_strings_save_state(); @@ -816,14 +814,14 @@ static void accel_use_shm_interned_strings(void) #ifndef ZEND_WIN32 static inline void kill_all_lockers(struct flock *mem_usage_check) { - int success, tries; + int tries; /* so that other process won't try to force while we are busy cleaning up */ ZCSG(force_restart_time) = 0; while (mem_usage_check->l_pid > 0) { /* Try SIGTERM first, switch to SIGKILL if not successful. */ int signal = SIGTERM; errno = 0; - success = 0; + bool success = false; tries = 10; while (tries--) { @@ -831,7 +829,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check) if (kill(mem_usage_check->l_pid, signal)) { if (errno == ESRCH) { /* Process died before the signal was sent */ - success = 1; + success = true; zend_accel_error(ACCEL_LOG_WARNING, "Process %d died before SIGKILL was sent", mem_usage_check->l_pid); } else if (errno != 0) { zend_accel_error(ACCEL_LOG_WARNING, "Failed to send SIGKILL to locker %d: %s", mem_usage_check->l_pid, strerror(errno)); @@ -843,7 +841,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check) if (kill(mem_usage_check->l_pid, 0)) { if (errno == ESRCH) { /* successfully killed locker, process no longer exists */ - success = 1; + success = true; zend_accel_error(ACCEL_LOG_WARNING, "Killed locker %d", mem_usage_check->l_pid); } else if (errno != 0) { zend_accel_error(ACCEL_LOG_WARNING, "Failed to check locker %d: %s", mem_usage_check->l_pid, strerror(errno)); @@ -1211,7 +1209,7 @@ zend_string *accel_make_persistent_key(zend_string *str) cwd = ZSTR_VAL(cwd_str); cwd_len = ZSTR_LEN(cwd_str); if (ZCG(cwd_check)) { - ZCG(cwd_check) = 0; + ZCG(cwd_check) = false; if (ZCG(accelerator_enabled)) { zend_string *str = accel_find_interned_string(cwd_str); @@ -1255,7 +1253,7 @@ zend_string *accel_make_persistent_key(zend_string *str) include_path_len = ZSTR_LEN(ZCG(include_path)); if (ZCG(include_path_check)) { - ZCG(include_path_check) = 0; + ZCG(include_path_check) = false; if (ZCG(accelerator_enabled)) { zend_string *str = accel_find_interned_string(ZCG(include_path)); @@ -1342,6 +1340,40 @@ zend_string *accel_make_persistent_key(zend_string *str) return str; } +/** + * Discard a #zend_persistent_script currently stored in shared + * memory. + * + * Caller must lock shared memory via zend_shared_alloc_lock(). + */ +static void zend_accel_discard_script(zend_persistent_script *persistent_script) +{ + if (persistent_script->corrupted) { + /* already discarded */ + return; + } + + persistent_script->corrupted = true; + persistent_script->timestamp = 0; + ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; + if (ZSMMG(memory_exhausted)) { + zend_accel_restart_reason reason = + zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; + zend_accel_schedule_restart_if_necessary(reason); + } +} + +/** + * Wrapper for zend_accel_discard_script() which locks shared memory + * via zend_shared_alloc_lock(). + */ +static void zend_accel_lock_discard_script(zend_persistent_script *persistent_script) +{ + zend_shared_alloc_lock(); + zend_accel_discard_script(persistent_script); + zend_shared_alloc_unlock(); +} + int zend_accel_invalidate(zend_string *filename, bool force) { zend_string *realpath; @@ -1372,18 +1404,7 @@ int zend_accel_invalidate(zend_string *filename, bool force) do_validate_timestamps(persistent_script, &file_handle) == FAILURE) { HANDLE_BLOCK_INTERRUPTIONS(); SHM_UNPROTECT(); - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); SHM_PROTECT(); HANDLE_UNBLOCK_INTERRUPTIONS(); } @@ -1427,7 +1448,7 @@ static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket) if (!zend_accel_hash_find(&ZCSG(hash), key)) { if (zend_accel_hash_is_full(&ZCSG(hash))) { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); } else { zend_string *new_key = accel_new_interned_key(key); @@ -1463,7 +1484,7 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script /* Align to 64-byte boundary */ ZCG(mem) = zend_arena_alloc(&CG(arena), memory_used + 64); ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 63L) & ~63L); -#elif ZEND_MM_ALIGNMENT < 8 +#elif ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = zend_arena_alloc(&CG(arena), memory_used + 8); ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 7L) & ~7L); @@ -1493,12 +1514,12 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script new_persistent_script->dynamic_members.checksum = zend_accel_script_checksum(new_persistent_script); - zend_file_cache_script_store(new_persistent_script, 0); + zend_file_cache_script_store(new_persistent_script, /* is_shm */ false); return new_persistent_script; } -static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script *new_persistent_script, int *from_shared_memory) +static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script *new_persistent_script, bool *from_shared_memory) { uint32_t orig_compiler_options; @@ -1508,11 +1529,11 @@ static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script zend_accel_finalize_delayed_early_binding_list(new_persistent_script); CG(compiler_options) = orig_compiler_options; - *from_shared_memory = 1; + *from_shared_memory = true; return store_script_in_file_cache(new_persistent_script); } -static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, zend_string *key, int *from_shared_memory) +static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, zend_string *key, bool *from_shared_memory) { zend_accel_hash_entry *bucket; uint32_t memory_used; @@ -1546,7 +1567,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr #if 1 /* prefer the script already stored in SHM */ free_persistent_script(new_persistent_script, 1); - *from_shared_memory = 1; + *from_shared_memory = true; return existing_persistent_script; #else return new_persistent_script; @@ -1556,12 +1577,12 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr if (zend_accel_hash_is_full(&ZCSG(hash))) { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); zend_shared_alloc_unlock(); if (ZCG(accel_directives).file_cache) { new_persistent_script = store_script_in_file_cache(new_persistent_script); - *from_shared_memory = 1; + *from_shared_memory = true; } return new_persistent_script; } @@ -1579,7 +1600,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_shared_alloc_unlock(); if (ZCG(accel_directives).file_cache) { new_persistent_script = store_script_in_file_cache(new_persistent_script); - *from_shared_memory = 1; + *from_shared_memory = true; } return new_persistent_script; } @@ -1614,7 +1635,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_accel_error(ACCEL_LOG_INFO, "Cached script '%s'", ZSTR_VAL(new_persistent_script->script.filename)); if (key && /* key may contain non-persistent PHAR aliases (see issues #115 and #149) */ - memcmp(ZSTR_VAL(key), "phar://", sizeof("phar://") - 1) != 0 && + !zend_string_starts_with_literal(key, "phar://") && !zend_string_equals(new_persistent_script->script.filename, key)) { /* link key to the same persistent script in hash table */ zend_string *new_key = accel_new_interned_key(key); @@ -1624,7 +1645,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", ZSTR_VAL(key)); } else { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); } } else { @@ -1639,11 +1660,11 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr if (ZCG(accel_directives).file_cache) { SHM_PROTECT(); - zend_file_cache_script_store(new_persistent_script, 1); + zend_file_cache_script_store(new_persistent_script, /* is_shm */ true); SHM_UNPROTECT(); } - *from_shared_memory = 1; + *from_shared_memory = true; return new_persistent_script; } @@ -1694,7 +1715,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl zend_op_array *orig_active_op_array; zval orig_user_error_handler; zend_op_array *op_array; - int do_bailout = 0; + bool do_bailout = false; accel_time_t timestamp = 0; uint32_t orig_compiler_options = 0; @@ -1782,7 +1803,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl CG(compiler_options) = orig_compiler_options; } zend_catch { op_array = NULL; - do_bailout = 1; + do_bailout = true; CG(compiler_options) = orig_compiler_options; } zend_end_try(); @@ -1845,7 +1866,7 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) { zend_persistent_script *persistent_script; zend_op_array *op_array = NULL; - int from_memory; /* if the script we've got is stored in SHM */ + bool from_memory; /* if the script we've got is stored in SHM */ if (is_stream_path(ZSTR_VAL(file_handle->filename)) && !is_cacheable_stream_path(ZSTR_VAL(file_handle->filename))) { @@ -1906,7 +1927,7 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) persistent_script = opcache_compile_file(file_handle, type, &op_array); if (persistent_script) { - from_memory = 0; + from_memory = false; persistent_script = cache_script_in_file_cache(persistent_script, &from_memory); return zend_accel_load_script(persistent_script, from_memory); } @@ -1914,10 +1935,9 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) return op_array; } -int check_persistent_script_access(zend_persistent_script *persistent_script) +static int check_persistent_script_access(zend_persistent_script *persistent_script) { char *phar_path, *ptr; - int ret; if ((ZSTR_LEN(persistent_script->script.filename)script.filename), "phar://", sizeof("phar://")-1)) { @@ -1930,7 +1950,7 @@ int check_persistent_script_access(zend_persistent_script *persistent_script) { *(ptr+sizeof(".phar/")-2) = 0; /* strip path inside .phar file */ } - ret = access(phar_path, R_OK) != 0; + bool ret = access(phar_path, R_OK) != 0; efree(phar_path); return ret; } @@ -1941,7 +1961,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) { zend_persistent_script *persistent_script = NULL; zend_string *key = NULL; - int from_shared_memory; /* if the script we've got is stored in SHM */ + bool from_shared_memory; /* if the script we've got is stored in SHM */ if (!file_handle->filename || !ZCG(accelerator_enabled)) { /* The Accelerator is disabled, act as if without the Accelerator */ @@ -2055,7 +2075,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) } return accelerator_orig_compile_file(file_handle, type); } - ZCG(counted) = 1; + ZCG(counted) = true; } /* Revalidate accessibility of cached file */ @@ -2079,18 +2099,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* If script is found then validate_timestamps if option is enabled */ if (persistent_script && ZCG(accel_directives).validate_timestamps) { if (validate_timestamp_and_record(persistent_script, file_handle) == FAILURE) { - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); persistent_script = NULL; } } @@ -2104,18 +2113,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* The checksum is wrong */ zend_accel_error(ACCEL_LOG_INFO, "Checksum failed for '%s': expected=0x%08x, found=0x%08x", ZSTR_VAL(persistent_script->script.filename), persistent_script->dynamic_members.checksum, checksum); - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); persistent_script = NULL; } } @@ -2152,7 +2150,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* Try and cache the script and assume that it is returned from_shared_memory. * If it isn't compile_and_cache_file() changes the flag to 0 */ - from_shared_memory = 0; + from_shared_memory = false; if (persistent_script) { persistent_script = cache_script_in_shared_memory(persistent_script, key, &from_shared_memory); } @@ -2217,7 +2215,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) HANDLE_UNBLOCK_INTERRUPTIONS(); replay_warnings(persistent_script->num_warnings, persistent_script->warnings); - from_shared_memory = 1; + from_shared_memory = true; } /* Fetch jit auto globals used in the script before execution */ @@ -2236,15 +2234,15 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_LINKED)); while (entry) { - bool found = 1; - bool needs_autoload = 0; + bool found = true; + bool needs_autoload = false; if (entry->parent != parent) { - found = 0; + found = false; } else { for (i = 0; i < ce->num_traits + ce->num_interfaces; i++) { if (entry->traits_and_interfaces[i] != traits_and_interfaces[i]) { - found = 0; + found = false; break; } } @@ -2254,9 +2252,9 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c if (ce != entry->dependencies[i].ce) { if (!ce) { - needs_autoload = 1; + needs_autoload = true; } else { - found = 0; + found = false; break; } } @@ -2367,7 +2365,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_shared_alloc_clear_xlat_table(); -#if ZEND_MM_ALIGNMENT < 8 +#if ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = zend_shared_alloc(size + 8); #else @@ -2383,7 +2381,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_map_ptr_extend(ZCSG(map_ptr_last)); -#if ZEND_MM_ALIGNMENT < 8 +#if ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 7L) & ~7L); #endif @@ -2572,12 +2570,12 @@ static zend_string* persistent_zend_resolve_path(zend_string *filename) static void zend_reset_cache_vars(void) { - ZSMMG(memory_exhausted) = 0; + ZSMMG(memory_exhausted) = false; ZCSG(hits) = 0; ZCSG(misses) = 0; ZCSG(blacklist_misses) = 0; ZSMMG(wasted_shared_memory) = 0; - ZCSG(restart_pending) = 0; + ZCSG(restart_pending) = false; ZCSG(force_restart_time) = 0; ZCSG(map_ptr_last) = CG(map_ptr_last); } @@ -2602,7 +2600,7 @@ static void accel_reset_pcre_cache(void) zend_result accel_activate(INIT_FUNC_ARGS) { if (!ZCG(enabled) || !accel_startup_ok) { - ZCG(accelerator_enabled) = 0; + ZCG(accelerator_enabled) = false; return SUCCESS; } @@ -2612,14 +2610,14 @@ zend_result accel_activate(INIT_FUNC_ARGS) ZCG(cache_opline) = NULL; ZCG(cache_persistent_script) = NULL; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; ZCG(cwd) = NULL; ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; if (file_cache_only) { - ZCG(accelerator_enabled) = 0; + ZCG(accelerator_enabled) = false; return SUCCESS; } @@ -2656,15 +2654,15 @@ zend_result accel_activate(INIT_FUNC_ARGS) zend_accel_error(ACCEL_LOG_WARNING, "Stuck count for pid %d", getpid()); #endif accel_unlock_all(); - ZCG(counted) = 0; + ZCG(counted) = false; } if (ZCSG(restart_pending)) { zend_shared_alloc_lock(); - if (ZCSG(restart_pending) != 0) { /* check again, to ensure that the cache wasn't already cleaned by another process */ + if (ZCSG(restart_pending)) { /* check again, to ensure that the cache wasn't already cleaned by another process */ if (accel_is_inactive() == SUCCESS) { zend_accel_error(ACCEL_LOG_DEBUG, "Restarting!"); - ZCSG(restart_pending) = 0; + ZCSG(restart_pending) = false; switch ZCSG(restart_reason) { case ACCEL_RESTART_OOM: ZCSG(oom_restarts)++; @@ -2720,10 +2718,10 @@ zend_result accel_activate(INIT_FUNC_ARGS) realpath_cache_clean(); accel_reset_pcre_cache(); - ZCG(pcre_reseted) = 0; + ZCG(pcre_reseted) = false; } else if (!ZCG(accelerator_enabled) && !ZCG(pcre_reseted)) { accel_reset_pcre_cache(); - ZCG(pcre_reseted) = 1; + ZCG(pcre_reseted) = true; } @@ -2758,7 +2756,7 @@ zend_result accel_post_deactivate(void) zend_shared_alloc_safe_unlock(); /* be sure we didn't leave cache locked */ accel_unlock_all(); - ZCG(counted) = 0; + ZCG(counted) = false; return SUCCESS; } @@ -2788,7 +2786,7 @@ static int accelerator_remove_cb(zend_extension *element1, zend_extension *eleme static void zps_startup_failure(char *reason, char *api_reason, int (*cb)(zend_extension *, zend_extension *)) { - accel_startup_ok = 0; + accel_startup_ok = false; zps_failure_reason = reason; zps_api_failure_reason = api_reason?api_reason:reason; zend_llist_del_element(&zend_extensions, NULL, (int (*)(void *, void *))cb); @@ -2896,10 +2894,10 @@ static int zend_accel_init_shm(void) ZCSG(hash_restarts) = 0; ZCSG(manual_restarts) = 0; - ZCSG(accelerator_enabled) = 1; + ZCSG(accelerator_enabled) = true; ZCSG(start_time) = zend_accel_get_time(); ZCSG(last_restart_time) = 0; - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; for (i = 0; i < -HT_MIN_MASK; i++) { ZCSG(uninitialized_bucket)[i] = HT_INVALID_IDX; @@ -3103,7 +3101,7 @@ static int accel_startup(zend_extension *extension) #endif if (start_accel_module() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME ": module registration failed!"); return FAILURE; } @@ -3127,7 +3125,7 @@ static int accel_startup(zend_extension *extension) /* no supported SAPI found - disable acceleration and stop initialization */ if (accel_find_sapi() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; if (!ZCG(accel_directives).enable_cli && strcmp(sapi_module.name, "cli") == 0) { zps_startup_failure("Opcode Caching is disabled for CLI", NULL, accelerator_remove_cb); @@ -3172,7 +3170,7 @@ static zend_result accel_post_startup(void) size_t shm_size = ZCG(accel_directives).memory_consumption; #ifdef HAVE_JIT size_t jit_size = 0; - bool reattached = 0; + bool reattached = false; if (JIT_G(enabled) && JIT_G(buffer_size) && zend_jit_check_support() == SUCCESS) { @@ -3194,17 +3192,17 @@ static zend_result accel_post_startup(void) #endif case ALLOC_SUCCESS: if (zend_accel_init_shm() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; return FAILURE; } break; case ALLOC_FAILURE: - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory."); return SUCCESS; case SUCCESSFULLY_REATTACHED: #ifdef HAVE_JIT - reattached = 1; + reattached = true; #endif zend_shared_alloc_lock(); accel_shared_globals = (zend_accel_shared_globals *) ZSMMG(app_shared_globals); @@ -3215,15 +3213,15 @@ static zend_result accel_post_startup(void) zend_shared_alloc_unlock(); break; case FAILED_REATTACHED: - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - cannot reattach to exiting shared memory."); return SUCCESS; break; #if ENABLE_FILE_CACHE_FALLBACK case ALLOC_FALLBACK: zend_shared_alloc_lock(); - file_cache_only = 1; - fallback_process = 1; + file_cache_only = true; + fallback_process = true; zend_shared_alloc_unlock(); goto file_cache_fallback; break; @@ -3241,8 +3239,8 @@ static zend_result accel_post_startup(void) if (JIT_G(buffer_size) == 0 || !ZSMMG(reserved) || zend_jit_startup(ZSMMG(reserved), jit_size, reattached) != SUCCESS) { - JIT_G(enabled) = 0; - JIT_G(on) = 0; + JIT_G(enabled) = false; + JIT_G(on) = false; } } #endif @@ -3251,13 +3249,13 @@ static zend_result accel_post_startup(void) SHM_PROTECT(); } else if (!ZCG(accel_directives).file_cache) { - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache"); return SUCCESS; } else { #ifdef HAVE_JIT - JIT_G(enabled) = 0; - JIT_G(on) = 0; + JIT_G(enabled) = false; + JIT_G(on) = false; #endif accel_shared_globals = calloc(1, sizeof(zend_accel_shared_globals)); } @@ -3295,7 +3293,7 @@ static zend_result accel_post_startup(void) ini_entry->on_modify = accel_include_path_on_modify; } - accel_startup_ok = 1; + accel_startup_ok = true; /* Override file_exists(), is_file() and is_readable() */ zend_accel_override_file_functions(); @@ -3338,7 +3336,7 @@ static void accel_post_shutdown(void) void accel_shutdown(void) { zend_ini_entry *ini_entry; - bool _file_cache_only = 0; + bool _file_cache_only = false; #ifdef HAVE_JIT zend_jit_shutdown(); @@ -3397,10 +3395,10 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason) HANDLE_BLOCK_INTERRUPTIONS(); SHM_UNPROTECT(); - ZCSG(restart_pending) = 1; + ZCSG(restart_pending) = true; ZCSG(restart_reason) = reason; ZCSG(cache_status_before_restart) = ZCSG(accelerator_enabled); - ZCSG(accelerator_enabled) = 0; + ZCSG(accelerator_enabled) = false; if (ZCG(accel_directives).force_restart_timeout) { ZCSG(force_restart_time) = zend_accel_get_time() + ZCG(accel_directives).force_restart_timeout; @@ -3411,12 +3409,14 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason) HANDLE_UNBLOCK_INTERRUPTIONS(); } -/* this is needed because on WIN32 lock is not decreased unless ZCG(counted) is set */ +static void accel_deactivate_now() +{ + /* this is needed because on WIN32 lock is not decreased unless ZCG(counted) is set */ #ifdef ZEND_WIN32 -#define accel_deactivate_now() ZCG(counted) = 1; accel_deactivate_sub() -#else -#define accel_deactivate_now() accel_deactivate_sub() + ZCG(counted) = true; #endif + accel_deactivate_sub(); +} /* ensures it is OK to read SHM if it's not OK (restart in progress) returns FAILURE @@ -3440,7 +3440,7 @@ int accelerator_shm_read_lock(void) accel_deactivate_now(); /* drop usage lock */ return FAILURE; } - ZCG(counted) = 1; + ZCG(counted) = true; } return SUCCESS; } @@ -3449,7 +3449,7 @@ int accelerator_shm_read_lock(void) void accelerator_shm_read_unlock(void) { if (!ZCG(counted)) { - /* counted is 0 - meaning we had to readlock manually, release readlock now */ + /* counted is false - meaning we had to readlock manually, release readlock now */ accel_deactivate_now(); } } @@ -3528,7 +3528,7 @@ static void preload_move_user_functions(HashTable *src, HashTable *dst) Bucket *p; dtor_func_t orig_dtor = src->pDestructor; zend_string *filename = NULL; - int copy = 0; + bool copy = false; src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); @@ -3546,7 +3546,7 @@ static void preload_move_user_functions(HashTable *src, HashTable *dst) } } } else { - copy = 0; + copy = false; } } if (copy) { @@ -3567,7 +3567,7 @@ static void preload_move_user_classes(HashTable *src, HashTable *dst) Bucket *p; dtor_func_t orig_dtor = src->pDestructor; zend_string *filename = NULL; - int copy = 0; + bool copy = false; src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); @@ -3584,7 +3584,7 @@ static void preload_move_user_classes(HashTable *src, HashTable *dst) } } } else { - copy = 0; + copy = false; } } if (copy) { @@ -3728,21 +3728,21 @@ static zend_result preload_update_constant(zval *val, zend_class_entry *scope) static bool preload_try_resolve_constants(zend_class_entry *ce) { - bool ok, changed, was_changed = 0; + bool ok, changed, was_changed = false; zend_class_constant *c; zval *val; EG(exception) = (void*)(uintptr_t)-1; /* prevent error reporting */ do { - ok = 1; - changed = 0; + ok = true; + changed = false; ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { val = &c->value; if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (EXPECTED(preload_update_constant(val, c->ce) == SUCCESS)) { - was_changed = changed = 1; + was_changed = changed = true; } else { - ok = 0; + ok = false; } } } ZEND_HASH_FOREACH_END(); @@ -3751,14 +3751,14 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } if (ce->default_properties_count) { uint32_t i; - bool resolved = 1; + bool resolved = true; for (i = 0; i < ce->default_properties_count; i++) { val = &ce->default_properties_table[i]; if (Z_TYPE_P(val) == IS_CONSTANT_AST) { zend_property_info *prop = ce->properties_info_table[i]; if (UNEXPECTED(preload_update_constant(val, prop->ce) != SUCCESS)) { - resolved = ok = 0; + resolved = ok = false; } } } @@ -3768,13 +3768,13 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } if (ce->default_static_members_count) { uint32_t count = ce->parent ? ce->default_static_members_count - ce->parent->default_static_members_count : ce->default_static_members_count; - bool resolved = 1; + bool resolved = true; val = ce->default_static_members_table + ce->default_static_members_count - 1; while (count) { if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (UNEXPECTED(preload_update_constant(val, ce) != SUCCESS)) { - resolved = ok = 0; + resolved = ok = false; } } val--; @@ -3786,7 +3786,7 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } } while (changed && !ok); EG(exception) = NULL; - CG(in_compilation) = 0; + CG(in_compilation) = false; if (ok) { ce->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED; @@ -3875,7 +3875,7 @@ static void preload_link(void) /* Resolve class dependencies */ do { - changed = 0; + changed = false; ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM(EG(class_table), key, zv, EG(persistent_classes_count)) { ce = Z_PTR_P(zv); @@ -3919,7 +3919,7 @@ static void preload_link(void) zend_begin_record_errors(); /* Set filename & lineno information for inheritance errors */ - CG(in_compilation) = 1; + CG(in_compilation) = true; CG(compiled_filename) = ce->info.user.filename; CG(zend_lineno) = ce->info.user.line_start; zend_try { @@ -3958,7 +3958,7 @@ static void preload_link(void) zend_hash_update_ptr(&errors, key, EG(errors)[EG(num_errors)-1]); EG(num_errors)--; } zend_end_try(); - CG(in_compilation) = 0; + CG(in_compilation) = false; CG(compiled_filename) = NULL; zend_free_recorded_errors(); zend_string_release(lcname); @@ -3966,7 +3966,7 @@ static void preload_link(void) } while (changed); do { - changed = 0; + changed = false; ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) { ce = Z_PTR_P(zv); @@ -3975,11 +3975,11 @@ static void preload_link(void) } if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) { if (!(ce->ce_flags & ZEND_ACC_TRAIT)) { /* don't update traits */ - CG(in_compilation) = 1; /* prevent autoloading */ + CG(in_compilation) = true; /* prevent autoloading */ if (preload_try_resolve_constants(ce)) { - changed = 1; + changed = true; } - CG(in_compilation) = 0; + CG(in_compilation) = false; } } } ZEND_HASH_FOREACH_END(); @@ -4060,15 +4060,15 @@ static void preload_remove_empty_includes(void) /* mark all as empty */ ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { - script->empty = 1; + script->empty = true; } ZEND_HASH_FOREACH_END(); /* find non empty scripts */ do { - changed = 0; + changed = false; ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { if (script->empty) { - int empty = 1; + bool empty = true; zend_op *opline = script->script.main_op_array.opcodes; zend_op *end = opline + script->script.main_op_array.last; @@ -4085,24 +4085,24 @@ static void preload_remove_empty_includes(void) zend_persistent_script *incl = zend_hash_find_ptr(preload_scripts, resolved_path); zend_string_release(resolved_path); if (!incl || !incl->empty) { - empty = 0; + empty = false; break; } } else { - empty = 0; + empty = false; break; } } else if (opline->opcode != ZEND_NOP && opline->opcode != ZEND_RETURN && opline->opcode != ZEND_HANDLE_EXCEPTION) { - empty = 0; + empty = false; break; } opline++; } if (!empty) { - script->empty = 0; - changed = 1; + script->empty = false; + changed = true; } } } ZEND_HASH_FOREACH_END(); @@ -4326,8 +4326,8 @@ static int accel_preload(const char *config, bool in_child) size_t orig_map_ptr_last; uint32_t orig_compiler_options; - ZCG(enabled) = 0; - ZCG(accelerator_enabled) = 0; + ZCG(enabled) = false; + ZCG(accelerator_enabled) = false; orig_open_basedir = PG(open_basedir); PG(open_basedir) = NULL; preload_orig_compile_file = accelerator_orig_compile_file; @@ -4350,7 +4350,7 @@ static int accel_preload(const char *config, bool in_child) CG(compiler_options) |= ZEND_COMPILE_DELAYED_BINDING; CG(compiler_options) |= ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION; CG(compiler_options) |= ZEND_COMPILE_IGNORE_OTHER_FILES; - CG(skip_shebang) = 1; + CG(skip_shebang) = true; zend_try { zend_op_array *op_array; @@ -4371,7 +4371,7 @@ static int accel_preload(const char *config, bool in_child) if (EG(exception)) { ret = zend_exception_error(EG(exception), E_ERROR); if (ret == FAILURE) { - CG(unclean_shutdown) = 1; + CG(unclean_shutdown) = true; } } } @@ -4382,7 +4382,7 @@ static int accel_preload(const char *config, bool in_child) zend_exception_error(EG(exception), E_ERROR); } - CG(unclean_shutdown) = 1; + CG(unclean_shutdown) = true; ret = FAILURE; } } zend_catch { @@ -4391,7 +4391,7 @@ static int accel_preload(const char *config, bool in_child) PG(open_basedir) = orig_open_basedir; accelerator_orig_compile_file = preload_orig_compile_file; - ZCG(enabled) = 1; + ZCG(enabled) = true; zend_destroy_file_handle(&file_handle); @@ -4575,7 +4575,7 @@ static int accel_finish_startup(void) zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Preloading is not supported on Windows"); return FAILURE; #else - int in_child = 0; + bool in_child = false; int ret = SUCCESS; int rc; int orig_error_reporting; @@ -4644,7 +4644,7 @@ static int accel_finish_startup(void) zend_accel_error(ACCEL_LOG_WARNING, "Preloading failed to setuid(%d)", pw->pw_uid); exit(1); } - in_child = 1; + in_child = true; } else { /* parent */ int status; @@ -4685,7 +4685,7 @@ static int accel_finish_startup(void) zend_interned_strings_switch_storage(1); #ifdef ZEND_SIGNALS - SIGG(reset) = 0; + SIGG(reset) = false; #endif orig_error_reporting = EG(error_reporting); @@ -4699,8 +4699,8 @@ static int accel_finish_startup(void) bool orig_report_memleaks; /* don't send headers */ - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; + SG(headers_sent) = true; + SG(request_info).no_headers = true; php_output_set_status(0); ZCG(auto_globals_mask) = 0; @@ -4708,11 +4708,11 @@ static int accel_finish_startup(void) ZCG(cache_opline) = NULL; ZCG(cache_persistent_script) = NULL; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; ZCG(cwd) = NULL; ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; if (accel_preload(ZCG(accel_directives).preload, in_child) != SUCCESS) { ret = FAILURE; @@ -4720,11 +4720,11 @@ static int accel_finish_startup(void) preload_flush(NULL); orig_report_memleaks = PG(report_memleaks); - PG(report_memleaks) = 0; + PG(report_memleaks) = false; #ifdef ZEND_SIGNALS /* We may not have registered signal handlers due to SIGG(reset)=0, so * also disable the check that they are registered. */ - SIGG(check) = 0; + SIGG(check) = false; #endif php_request_shutdown(NULL); /* calls zend_shared_alloc_unlock(); */ PG(report_memleaks) = orig_report_memleaks; diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index bd692495a5282..bc7236fbdb3fa 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -204,7 +204,7 @@ typedef struct _zend_accel_directives { } zend_accel_directives; typedef struct _zend_accel_globals { - int counted; /* the process uses shared memory */ + bool counted; /* the process uses shared memory */ bool enabled; bool locked; /* thread obtained exclusive lock */ bool accelerator_enabled; /* accelerator enabled for current request */ @@ -215,9 +215,9 @@ typedef struct _zend_accel_globals { char include_path_key[32]; /* key of current "include_path" */ char cwd_key[32]; /* key of current working directory */ int include_path_key_len; - int include_path_check; + bool include_path_check; int cwd_key_len; - int cwd_check; + bool cwd_check; int auto_globals_mask; time_t request_time; time_t last_restart_time; /* used to synchronize SHM and in-process caches */ diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index e574a703c3089..3100153f3fb99 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -13317,6 +13317,7 @@ static int zend_jit_assign_obj(dasm_State **Dst, zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); zend_jit_addr prop_addr; bool needs_slow_path = 0; + bool needs_val_dtor = 0; if (RETURN_VALUE_USED(opline)) { res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); @@ -13373,6 +13374,7 @@ static int zend_jit_assign_obj(dasm_State **Dst, } if (((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) && (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + needs_val_dtor = 1; | b >7 } else { | b >9 @@ -13549,6 +13551,13 @@ static int zend_jit_assign_obj(dasm_State **Dst, val_info |= MAY_BE_RC1|MAY_BE_RCN; } + |7: + | // FREE_OP_DATA(); + | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline, ZREG_TMP1, ZREG_TMP2 + | b >9 + |.code + } else if (needs_val_dtor) { + |.cold_code |7: | // FREE_OP_DATA(); | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline, ZREG_TMP1, ZREG_TMP2 diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index fd2ee551a0c59..9ec73892d5475 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -2373,6 +2373,9 @@ static void ZEND_FASTCALL zend_jit_invalid_property_incdec(zval *container, cons zend_throw_error(NULL, "Attempt to increment/decrement property \"%s\" on %s", property_name, zend_zval_type_name(container)); + if (opline->op1_type == IS_VAR) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + } } static void ZEND_FASTCALL zend_jit_invalid_property_assign(zval *container, const char *property_name) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 20934a8928327..ad19722dead4f 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -2073,7 +2073,9 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin case ZEND_ROPE_INIT: case ZEND_ROPE_ADD: case ZEND_ROPE_END: - ADD_OP2_TRACE_GUARD(); + if (op2_type == IS_STRING) { + ADD_OP2_TRACE_GUARD(); + } break; default: break; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index e307f86f40f44..d8fdc49db63d4 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -14133,6 +14133,7 @@ static int zend_jit_assign_obj(dasm_State **Dst, zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); zend_jit_addr prop_addr; bool needs_slow_path = 0; + bool needs_val_dtor = 0; if (RETURN_VALUE_USED(opline)) { res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); @@ -14189,6 +14190,7 @@ static int zend_jit_assign_obj(dasm_State **Dst, } if (((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR)) && (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) { + needs_val_dtor = 1; | jmp >7 } else { | jmp >9 @@ -14414,6 +14416,13 @@ static int zend_jit_assign_obj(dasm_State **Dst, val_info |= MAY_BE_RC1|MAY_BE_RCN; } + |7: + | // FREE_OP_DATA(); + | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline + | jmp >9 + |.code + } else if (needs_val_dtor) { + |.cold_code |7: | // FREE_OP_DATA(); | FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline diff --git a/ext/opcache/tests/jit/assign_dim_015.phpt b/ext/opcache/tests/jit/assign_dim_015.phpt new file mode 100644 index 0000000000000..fd37d84764d0a --- /dev/null +++ b/ext/opcache/tests/jit/assign_dim_015.phpt @@ -0,0 +1,19 @@ +--TEST-- +JIT ASSIGN_DIM: 015 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +DONE +--EXPECT-- +Error: Undefined variable $y +DONE diff --git a/ext/opcache/tests/jit/assign_obj_003.phpt b/ext/opcache/tests/jit/assign_obj_003.phpt new file mode 100644 index 0000000000000..61159d62189dc --- /dev/null +++ b/ext/opcache/tests/jit/assign_obj_003.phpt @@ -0,0 +1,37 @@ +--TEST-- +JIT ASSIGN_OBJ: Assign undefined vatiable to property +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- +previous = $firstNode; + $firstNode->next = $firstNode; + $circularDoublyLinkedList = null; + for ($i = 0; $i < 2; $i++) { + $currentNode = $circularDoublyLinkedList; + $nextNode = $circularDoublyLinkedList->next; + $newNode->next = $undef1->next; // <- ??? + $newNode = new Node(); + $currentNode->undef2 = new Node(); + $circularDoublyLinkedList = $nextNode; + } +} + +try { + @xxx(); +} catch (Throwable $e) { + echo "Exception: " . $e->getMessage() . "\n"; +} +?> +--EXPECT-- +Exception: Attempt to assign property "next" on null diff --git a/ext/opcache/tests/jit/fetch_dim_r_013.phpt b/ext/opcache/tests/jit/fetch_dim_r_013.phpt new file mode 100644 index 0000000000000..ff2402694de2b --- /dev/null +++ b/ext/opcache/tests/jit/fetch_dim_r_013.phpt @@ -0,0 +1,20 @@ +--TEST-- +JIT FETCH_DIM_R: 013 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + $tokens[$y][] = $y; + } +} +@foo(); +?> +DONE +--EXPECT-- +DONE diff --git a/ext/opcache/tests/jit/inc_obj_005.phpt b/ext/opcache/tests/jit/inc_obj_005.phpt new file mode 100644 index 0000000000000..fe559218871c3 --- /dev/null +++ b/ext/opcache/tests/jit/inc_obj_005.phpt @@ -0,0 +1,19 @@ +--TEST-- +PRE_INC_OBJ: 005 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- +y++; +?> +--EXPECTF-- +Warning: Undefined variable $y in %sinc_obj_005.php on line 2 + +Fatal error: Uncaught Error: Attempt to increment/decrement property "y" on string in %sinc_obj_005.php:2 +Stack trace: +#0 {main} + thrown in %sinc_obj_005.php on line 2 diff --git a/ext/opcache/tests/jit/rope_002.phpt b/ext/opcache/tests/jit/rope_002.phpt new file mode 100644 index 0000000000000..7aa7e54801fde --- /dev/null +++ b/ext/opcache/tests/jit/rope_002.phpt @@ -0,0 +1,21 @@ +--TEST-- +JIT ROPE: 002 type guards are only checked for strings +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +DONE +--EXPECT-- +DONE diff --git a/ext/opcache/tests/opt/inference_001.phpt b/ext/opcache/tests/opt/inference_001.phpt index 2c7389573462f..1005d28408f9e 100644 --- a/ext/opcache/tests/opt/inference_001.phpt +++ b/ext/opcache/tests/opt/inference_001.phpt @@ -7,157 +7,34 @@ opcache.optimization_level=-1 --FILE-- $e; - $i += $a; - $j++; - $e; - $a == $Z + $a .= $i+= $a; - $j++; - $e; - $a == $Z + $j++; - $e; - $a == $Z + $a = $a + $b = $i += $a; + for ($i = 0; $i < 2; $i++) { + $obj->x; $obj = new stdClass; - $obj->prop1 = set_error_handler(function () { - $$GLOBALS['a'] = null; - }); - $obj->$a .= $i += $a; - $obj = new stdClass; - $obj->prop1 = $j++; - $e; - $a == $Z + $a = $a + $j++; - $e; - $a == $Z + $a = $a + $b = $aa = $a; } } test(); + +class Test { + public int $x = 1; +} + +function test2() { + for ($i = 0; $i < 2; $i++) { + $obj->x; + $obj = new Test; + } +} +test2(); ?> DONE --EXPECTF-- -Warning: Undefined variable $a in %sinference_001.php on line 6 - -Warning: Undefined variable $obj in %sinference_001.php on line 7 - -Warning: Undefined variable $e in %sinference_001.php on line 7 - -Warning: Attempt to read property "" on null in %sinference_001.php on line 7 - -Warning: Undefined variable $Z in %sinference_001.php on line 11 - -Warning: Undefined variable $Z in %sinference_001.php on line 14 - -Warning: Undefined variable $Z in %sinference_001.php on line 16 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 +Warning: Undefined variable $obj in %s on line %d -Warning: Array to string conversion in %sinference_001.php on line 19 +Warning: Attempt to read property "x" on null in %s on line %d -Warning: Array to string conversion in %sinference_001.php on line 19 +Warning: Undefined property: stdClass::$x in %s on line %d -Warning: Array to string conversion in %sinference_001.php on line 19 +Warning: Undefined variable $obj in %s on line %d -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Warning: Array to string conversion in %sinference_001.php on line 19 - -Fatal error: Uncaught TypeError: Unsupported operand types: null + string in %sinference_001.php:11 -Stack trace: -#0 %sinference_001.php(30): test() -#1 {main} - thrown in %sinference_001.php on line 11 +Warning: Attempt to read property "x" on null in %s on line %d +DONE diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index bbfe3771afac6..e3300d1ebb381 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -253,15 +253,18 @@ static void *zend_file_cache_serialize_interned(zend_string *str, len = ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(ZSTR_LEN(str))); ret = (void*)(info->str_size | Z_UL(1)); zend_shared_alloc_register_xlat_entry(str, ret); - if (info->str_size + len > ZSTR_LEN((zend_string*)ZCG(mem))) { + + zend_string *s = (zend_string*)ZCG(mem); + if (info->str_size + len > ZSTR_LEN(s)) { size_t new_len = info->str_size + len; - ZCG(mem) = (void*)zend_string_realloc( - (zend_string*)ZCG(mem), + s = zend_string_realloc( + s, ((_ZSTR_HEADER_SIZE + 1 + new_len + 4095) & ~0xfff) - (_ZSTR_HEADER_SIZE + 1), 0); + ZCG(mem) = (void*)s; } - zend_string *new_str = (zend_string *) (ZSTR_VAL((zend_string*)ZCG(mem)) + info->str_size); + zend_string *new_str = (zend_string *) (ZSTR_VAL(s) + info->str_size); memcpy(new_str, str, len); GC_ADD_FLAGS(new_str, IS_STR_INTERNED); GC_DEL_FLAGS(new_str, IS_STR_PERMANENT|IS_STR_CLASS_NAME_MAP_PTR); @@ -269,7 +272,7 @@ static void *zend_file_cache_serialize_interned(zend_string *str, return ret; } -static void *zend_file_cache_unserialize_interned(zend_string *str, int in_shm) +static void *zend_file_cache_unserialize_interned(zend_string *str, bool in_shm) { str = (zend_string*)((char*)ZCG(mem) + ((size_t)(str) & ~Z_UL(1))); if (!in_shm) { @@ -1006,14 +1009,34 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path) return filename; } -int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) +/** + * Helper function for zend_file_cache_script_store(). + * + * @return true on success, false on error + */ +static bool zend_file_cache_script_write(int fd, const zend_persistent_script *script, const zend_file_cache_metainfo *info, const void *buf, const zend_string *s) +{ +#ifdef HAVE_SYS_UIO_H + const struct iovec vec[] = { + { .iov_base = (void *)info, .iov_len = sizeof(*info) }, + { .iov_base = (void *)buf, .iov_len = script->size }, + { .iov_base = (void *)ZSTR_VAL(s), .iov_len = info->str_size }, + }; + + return writev(fd, vec, sizeof(vec) / sizeof(vec[0])) == (ssize_t)(sizeof(*info) + script->size + info->str_size); +#else + return ZEND_LONG_MAX >= (zend_long)(sizeof(*info) + script->size + info->str_size) && + write(fd, info, sizeof(*info)) == sizeof(*info) && + write(fd, buf, script->size) == script->size && + write(fd, ZSTR_VAL(s), info->str_size) == info->str_size; +#endif +} + +int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm) { int fd; char *filename; zend_file_cache_metainfo info; -#ifdef HAVE_SYS_UIO_H - struct iovec vec[3]; -#endif void *mem, *buf; #ifdef HAVE_JIT @@ -1058,16 +1081,18 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) zend_shared_alloc_init_xlat_table(); if (!in_shm) { - script->corrupted = 1; /* used to check if script restored to SHM or process memory */ + script->corrupted = true; /* used to check if script restored to SHM or process memory */ } zend_file_cache_serialize(script, &info, buf); if (!in_shm) { - script->corrupted = 0; + script->corrupted = false; } zend_shared_alloc_destroy_xlat_table(); + zend_string *const s = (zend_string*)ZCG(mem); + info.checksum = zend_adler32(ADLER32_INIT, buf, script->size); - info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size); + info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL(s), info.str_size); #if __has_feature(memory_sanitizer) /* The buffer may contain uninitialized regions. However, the uninitialized parts will not be @@ -1077,40 +1102,17 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) __msan_unpoison(buf, script->size); #endif -#ifdef HAVE_SYS_UIO_H - vec[0].iov_base = (void *)&info; - vec[0].iov_len = sizeof(info); - vec[1].iov_base = buf; - vec[1].iov_len = script->size; - vec[2].iov_base = ZSTR_VAL((zend_string*)ZCG(mem)); - vec[2].iov_len = info.str_size; - - if (writev(fd, vec, 3) != (ssize_t)(sizeof(info) + script->size + info.str_size)) { - zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename); - zend_string_release_ex((zend_string*)ZCG(mem), 0); - close(fd); - efree(mem); - zend_file_cache_unlink(filename); - efree(filename); - return FAILURE; - } -#else - if (ZEND_LONG_MAX < (zend_long)(sizeof(info) + script->size + info.str_size) || - write(fd, &info, sizeof(info)) != sizeof(info) || - write(fd, buf, script->size) != script->size || - write(fd, ((zend_string*)ZCG(mem))->val, info.str_size) != info.str_size - ) { + if (!zend_file_cache_script_write(fd, script, &info, buf, s)) { zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename); - zend_string_release_ex((zend_string*)ZCG(mem), 0); + zend_string_release_ex(s, 0); close(fd); efree(mem); zend_file_cache_unlink(filename); efree(filename); return FAILURE; } -#endif - zend_string_release_ex((zend_string*)ZCG(mem), 0); + zend_string_release_ex(s, 0); efree(mem); if (zend_file_cache_flock(fd, LOCK_UN) != 0) { zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename); @@ -1744,9 +1746,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl zend_file_cache_metainfo info; zend_accel_hash_entry *bucket; void *mem, *checkpoint, *buf; - int cache_it = 1; + bool cache_it = true; unsigned int actual_checksum; - int ok; + bool ok; if (!full_path) { return NULL; @@ -1878,18 +1880,18 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl } else { use_process_mem: buf = mem; - cache_it = 0; + cache_it = false; } ZCG(mem) = ((char*)mem + info.mem_size); script = (zend_persistent_script*)((char*)buf + info.script_offset); script->corrupted = !cache_it; /* used to check if script restored to SHM or process memory */ - ok = 1; + ok = true; zend_try { zend_file_cache_unserialize(script, buf); } zend_catch { - ok = 0; + ok = false; } zend_end_try(); if (!ok) { if (cache_it) { @@ -1902,7 +1904,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl } } - script->corrupted = 0; + script->corrupted = false; if (cache_it) { ZCSG(map_ptr_last) = CG(map_ptr_last); diff --git a/ext/opcache/zend_file_cache.h b/ext/opcache/zend_file_cache.h index a6e87197b4caa..8f067f5f37abb 100644 --- a/ext/opcache/zend_file_cache.h +++ b/ext/opcache/zend_file_cache.h @@ -19,7 +19,7 @@ #ifndef ZEND_FILE_CACHE_H #define ZEND_FILE_CACHE_H -int zend_file_cache_script_store(zend_persistent_script *script, int in_shm); +int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm); zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle); void zend_file_cache_invalidate(zend_string *full_path); diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index e21fa4cb9af2b..82dd4ccf434aa 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -1331,12 +1331,12 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */ script = zend_shared_memdup_free(script, sizeof(zend_persistent_script)); - script->corrupted = 0; + script->corrupted = false; ZCG(current_persistent_script) = script; if (!for_shm) { /* script is not going to be saved in SHM */ - script->corrupted = 1; + script->corrupted = true; } zend_accel_store_interned_string(script->script.filename); @@ -1392,7 +1392,7 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script } #endif - script->corrupted = 0; + script->corrupted = false; ZCG(current_persistent_script) = NULL; return script; diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 06d746218d2ec..b79158e7294af 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -610,12 +610,12 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s new_persistent_script->mem = NULL; new_persistent_script->size = 0; - new_persistent_script->corrupted = 0; + new_persistent_script->corrupted = false; ZCG(current_persistent_script) = new_persistent_script; if (!for_shm) { /* script is not going to be saved in SHM */ - new_persistent_script->corrupted = 1; + new_persistent_script->corrupted = true; } ADD_SIZE(sizeof(zend_persistent_script)); @@ -645,7 +645,7 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s zend_persist_early_bindings_calc( new_persistent_script->num_early_bindings, new_persistent_script->early_bindings); - new_persistent_script->corrupted = 0; + new_persistent_script->corrupted = false; ZCG(current_persistent_script) = NULL; diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 82c1af88aa16c..4d23ee9e73193 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2021,7 +2021,7 @@ PHP_FUNCTION(pg_fetch_object) PHP_FUNCTION(pg_fetch_all) { zval *result; - long result_type = PGSQL_ASSOC; + zend_long result_type = PGSQL_ASSOC; PGresult *pgsql_result; pgsql_result_handle *pg_result; @@ -4584,6 +4584,7 @@ PHP_PGSQL_API zend_result php_pgsql_convert(PGconn *pg_link, const zend_string * ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), field, val) { skip_field = 0; + ZVAL_DEREF(val); ZVAL_NULL(&new_val); /* TODO: Check when meta data can be broken and see if can use assertions instead */ @@ -5879,7 +5880,7 @@ PHP_FUNCTION(pg_select) pgsql_link_handle *link; zend_string *table; zend_ulong option = PGSQL_DML_EXEC; - long result_type = PGSQL_ASSOC; + zend_long result_type = PGSQL_ASSOC; PGconn *pg_link; zend_string *sql = NULL; diff --git a/ext/pgsql/tests/gh8253.phpt b/ext/pgsql/tests/gh8253.phpt new file mode 100644 index 0000000000000..b8732fd0d8d52 --- /dev/null +++ b/ext/pgsql/tests/gh8253.phpt @@ -0,0 +1,31 @@ +--TEST-- +pg_insert() fails for references +--EXTENSIONS-- +pgsql +--SKIPIF-- + +--FILE-- + "testing"]; +fee($a["bar"]); + +$db = pg_connect($conn_str); +pg_query($db, "DROP TABLE IF EXISTS gh8253"); +pg_query($db, "CREATE TABLE gh8253 (bar text);"); +pg_insert($db, "gh8253", $a); +$res = pg_query($db, "SELECT * FROM gh8253"); +var_dump(pg_fetch_all($res)); +?> +--EXPECT-- +array(1) { + [0]=> + array(1) { + ["bar"]=> + string(7) "testing" + } +} diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 9bba67c6fc963..b45b662398c79 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -912,8 +912,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from ZEND_HASH_MAP_FOREACH_BUCKET(&phar->virtual_dirs, b) { str_key = b->key; - if (ZSTR_LEN(str_key) >= from_len && - memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && + if (zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource_from->path)+1, from_len) && (ZSTR_LEN(str_key) == from_len || IS_SLASH(ZSTR_VAL(str_key)[from_len]))) { new_str_key = zend_string_alloc(ZSTR_LEN(str_key) + to_len - from_len, 0); @@ -930,8 +929,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from ZEND_HASH_MAP_FOREACH_BUCKET(&phar->mounted_dirs, b) { str_key = b->key; - if (ZSTR_LEN(str_key) >= from_len && - memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && + if (zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource_from->path)+1, from_len) && (ZSTR_LEN(str_key) == from_len || IS_SLASH(ZSTR_VAL(str_key)[from_len]))) { new_str_key = zend_string_alloc(ZSTR_LEN(str_key) + to_len - from_len, 0); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 84ef8bdfbb450..4f30cc2fca700 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1356,6 +1356,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be type_reference *reference; reflection_type_kind type_kind = get_type_kind(type); bool is_mixed = ZEND_TYPE_PURE_MASK(type) == MAY_BE_ANY; + bool is_only_null = (ZEND_TYPE_PURE_MASK(type) == MAY_BE_NULL && !ZEND_TYPE_IS_COMPLEX(type)); switch (type_kind) { case INTERSECTION_TYPE: @@ -1373,7 +1374,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be intern = Z_REFLECTION_P(object); reference = (type_reference*) emalloc(sizeof(type_reference)); reference->type = type; - reference->legacy_behavior = legacy_behavior && type_kind == NAMED_TYPE && !is_mixed; + reference->legacy_behavior = legacy_behavior && type_kind == NAMED_TYPE && !is_mixed && !is_only_null; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; diff --git a/ext/reflection/tests/ReflectionType_possible_types.phpt b/ext/reflection/tests/ReflectionType_possible_types.phpt index ccb87254663d3..dd6d39300b590 100644 --- a/ext/reflection/tests/ReflectionType_possible_types.phpt +++ b/ext/reflection/tests/ReflectionType_possible_types.phpt @@ -12,6 +12,8 @@ $functions = [ function(): array {}, function(): callable {}, function(): iterable {}, + function(): null {}, + function(): false {}, function(): StdClass {} ]; @@ -30,4 +32,6 @@ string(4) "bool" string(5) "array" string(8) "callable" string(8) "iterable" +string(4) "null" +string(5) "false" string(8) "StdClass" diff --git a/ext/reflection/tests/union_types.phpt b/ext/reflection/tests/union_types.phpt index 8dbbbdab854a3..a3ac53b54ab29 100644 --- a/ext/reflection/tests/union_types.phpt +++ b/ext/reflection/tests/union_types.phpt @@ -13,8 +13,17 @@ function dumpType(ReflectionUnionType $rt) { } } +function dumpBCType(ReflectionNamedType $rt) { + echo "Type $rt:\n"; + echo " Name: " . $rt->getName() . "\n"; + echo " String: " . (string) $rt . "\n"; + echo " Allows Null: " . ($rt->allowsNull() ? "true" : "false") . "\n"; +} + function test1(): X|Y|int|float|false|null { } function test2(): X|iterable|bool { } +function test3(): null|false { } +function test4(): ?false { } class Test { public X|Y|int $prop; @@ -22,6 +31,8 @@ class Test { dumpType((new ReflectionFunction('test1'))->getReturnType()); dumpType((new ReflectionFunction('test2'))->getReturnType()); +dumpBCType((new ReflectionFunction('test3'))->getReturnType()); +dumpBCType((new ReflectionFunction('test4'))->getReturnType()); $rc = new ReflectionClass(Test::class); $rp = $rc->getProperty('prop'); @@ -75,6 +86,14 @@ Allows null: false Name: bool String: bool Allows Null: false +Type ?false: + Name: false + String: ?false + Allows Null: true +Type ?false: + Name: false + String: ?false + Allows Null: true Type X|Y|int: Allows null: false Name: X diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h index 4a9f89abba6ef..0615d6a3e9a0d 100644 --- a/ext/snmp/php_snmp.h +++ b/ext/snmp/php_snmp.h @@ -24,7 +24,7 @@ #define PHP_SNMP_VERSION PHP_VERSION -#if HAVE_SNMP +#ifdef HAVE_SNMP #ifndef DLEXPORT #define DLEXPORT diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 035b0f846f7bd..a14bf2aed34c6 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -33,7 +33,7 @@ #include "ext/spl/spl_exceptions.h" #include "snmp_arginfo.h" -#if HAVE_SNMP +#ifdef HAVE_SNMP #include #include @@ -865,7 +865,7 @@ static bool netsnmp_session_init(php_snmp_session **session_p, int version, zend res = psal; while (n-- > 0) { pptr = session->peername; -#if HAVE_GETADDRINFO && HAVE_IPV6 && HAVE_INET_NTOP +#if defined(HAVE_GETADDRINFO) && defined(HAVE_IPV6) && defined(HAVE_INET_NTOP) if (force_ipv6 && (*res)->sa_family != AF_INET6) { res++; continue; diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c index 53d7f116652de..edd807cbe9864 100644 --- a/ext/sodium/libsodium.c +++ b/ext/sodium/libsodium.c @@ -1578,6 +1578,49 @@ PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor) RETURN_NEW_STR(ciphertext); } + +PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic) +{ + zend_string *ciphertext; + unsigned char *key; + unsigned char *msg; + unsigned char *nonce; + zend_long ic; + + size_t ciphertext_len; + size_t key_len; + size_t msg_len; + size_t nonce_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssls", + &msg, &msg_len, + &nonce, &nonce_len, + &ic, + &key, &key_len) == FAILURE) { + sodium_remove_param_values_from_backtrace(EG(exception)); + RETURN_THROWS(); + } + if (nonce_len != crypto_stream_xchacha20_NONCEBYTES) { + zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long"); + RETURN_THROWS(); + } + if (key_len != crypto_stream_xchacha20_KEYBYTES) { + zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long"); + RETURN_THROWS(); + } + ciphertext_len = msg_len; + ciphertext = zend_string_checked_alloc((size_t) ciphertext_len, 0); + if (crypto_stream_xchacha20_xor_ic((unsigned char *) ZSTR_VAL(ciphertext), msg, + (unsigned long long) msg_len, nonce, + (uint64_t) ic, key) != 0) { + zend_string_free(ciphertext); + zend_throw_exception(sodium_exception_ce, "internal error", 0); + RETURN_THROWS(); + } + ZSTR_VAL(ciphertext)[ciphertext_len] = 0; + + RETURN_NEW_STR(ciphertext); +} #endif #ifdef crypto_pwhash_SALTBYTES diff --git a/ext/sodium/libsodium.stub.php b/ext/sodium/libsodium.stub.php index af859c58fe963..55d3e0a5161bc 100644 --- a/ext/sodium/libsodium.stub.php +++ b/ext/sodium/libsodium.stub.php @@ -205,6 +205,8 @@ function sodium_crypto_stream_xchacha20(int $length, string $nonce, string $key) function sodium_crypto_stream_xchacha20_keygen(): string {} function sodium_crypto_stream_xchacha20_xor(string $message, string $nonce, string $key): string {} + +function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string {} #endif function sodium_add(string &$string1, string $string2): void {} diff --git a/ext/sodium/libsodium_arginfo.h b/ext/sodium/libsodium_arginfo.h index f0e7aed85e258..a7351c9bef165 100644 --- a/ext/sodium/libsodium_arginfo.h +++ b/ext/sodium/libsodium_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: e172b900040a9d9ac98207c638fdeb3a0c6a13e6 */ + * Stub hash: 7ccd5115d292690c0cfcfeeb2ff5adf7ac7a616a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_aead_aes256gcm_is_available, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() @@ -445,6 +445,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_stream_xchacha20_x ZEND_END_ARG_INFO() #endif +#if defined(crypto_stream_xchacha20_KEYBYTES) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_stream_xchacha20_xor_ic, 0, 4, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, nonce, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, counter, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_add, 0, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(1, string1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string2, IS_STRING, 0) @@ -662,6 +671,9 @@ ZEND_FUNCTION(sodium_crypto_stream_xchacha20_keygen); #if defined(crypto_stream_xchacha20_KEYBYTES) ZEND_FUNCTION(sodium_crypto_stream_xchacha20_xor); #endif +#if defined(crypto_stream_xchacha20_KEYBYTES) +ZEND_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic); +#endif ZEND_FUNCTION(sodium_add); ZEND_FUNCTION(sodium_compare); ZEND_FUNCTION(sodium_increment); @@ -844,6 +856,9 @@ static const zend_function_entry ext_functions[] = { #endif #if defined(crypto_stream_xchacha20_KEYBYTES) ZEND_FE(sodium_crypto_stream_xchacha20_xor, arginfo_sodium_crypto_stream_xchacha20_xor) +#endif +#if defined(crypto_stream_xchacha20_KEYBYTES) + ZEND_FE(sodium_crypto_stream_xchacha20_xor_ic, arginfo_sodium_crypto_stream_xchacha20_xor_ic) #endif ZEND_FE(sodium_add, arginfo_sodium_add) ZEND_FE(sodium_compare, arginfo_sodium_compare) diff --git a/ext/sodium/tests/crypto_stream_xchacha20.phpt b/ext/sodium/tests/crypto_stream_xchacha20.phpt index 275e195a29281..466734853d705 100644 --- a/ext/sodium/tests/crypto_stream_xchacha20.phpt +++ b/ext/sodium/tests/crypto_stream_xchacha20.phpt @@ -34,6 +34,22 @@ $stream6 = sodium_crypto_stream_xchacha20_xor($stream5, $nonce, $key); var_dump($stream6 === $stream); +// New test (with Initial Counter feature): +$n2 = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES); +$left = str_repeat("\x01", 64); +$right = str_repeat("\xfe", 64); + +// All at once: +$stream7_unified = sodium_crypto_stream_xchacha20_xor($left . $right, $n2, $key); + +// Piecewise, with initial counter: +$stream7_left = sodium_crypto_stream_xchacha20_xor_ic($left, $n2, 0, $key); +$stream7_right = sodium_crypto_stream_xchacha20_xor_ic($right, $n2, 1, $key); +$stream7_concat = $stream7_left . $stream7_right; + +var_dump(strlen($stream7_concat)); +var_dump($stream7_unified === $stream7_concat); + try { sodium_crypto_stream_xchacha20(-1, $nonce, $key); } catch (SodiumException $ex) { @@ -71,6 +87,8 @@ bool(true) bool(true) bool(true) bool(true) +int(128) +bool(true) sodium_crypto_stream_xchacha20(): Argument #1 ($length) must be greater than 0 sodium_crypto_stream_xchacha20(): Argument #2 ($nonce) must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long sodium_crypto_stream_xchacha20(): Argument #3 ($key) must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index b6e53c2921b7d..8e89b86048750 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -209,7 +209,7 @@ PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_ return intern->path ? ZSTR_VAL(intern->path) : NULL; } /* }}} */ -static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */ +static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */ { if (intern->file_name) { /* already known */ @@ -248,7 +248,8 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int return SUCCESS; } /* }}} */ -static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ +/* TODO Make void or have callers check return value */ +static bool spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ { if (intern->file_name) { /* invalidate */ @@ -266,7 +267,7 @@ static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ #define IS_SLASH_AT(zs, pos) (IS_SLASH(zs[pos])) -static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */ +static inline bool spl_filesystem_is_dot(const char * d_name) /* {{{ */ { return !strcmp(d_name, ".") || !strcmp(d_name, ".."); } @@ -277,7 +278,7 @@ static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */ * Can emit an E_WARNING as it reports errors from php_stream_opendir() */ static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_string *path) { - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); intern->type = SPL_FS_DIR; intern->u.dir.dirp = php_stream_opendir(ZSTR_VAL(path), REPORT_ERRORS, FG(default_context)); @@ -375,7 +376,6 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object) zend_object *new_object; spl_filesystem_object *intern; spl_filesystem_object *source; - int index, skip_dots; source = spl_filesystem_from_obj(old_object); new_object = spl_filesystem_object_new_ex(old_object->ce); @@ -392,17 +392,19 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object) intern->file_name = zend_string_copy(source->file_name); } break; - case SPL_FS_DIR: + case SPL_FS_DIR: { spl_filesystem_dir_open(intern, source->path); /* read until we hit the position in which we were before */ - skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS); - for(index = 0; index < source->u.dir.index; ++index) { + bool skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS); + int index; + for (index = 0; index < source->u.dir.index; ++index) { do { spl_filesystem_dir_read(intern); } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name)); } intern->u.dir.index = index; break; + } case SPL_FS_FILE: ZEND_UNREACHABLE(); } @@ -503,7 +505,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce)); RETVAL_OBJ(&intern->std); - if (spl_filesystem_object_get_file_name(source) != SUCCESS) { + if (spl_filesystem_object_get_file_name(source) == FAILURE) { return NULL; } @@ -540,7 +542,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce)); RETVAL_OBJ(&intern->std); - if (spl_filesystem_object_get_file_name(source) != SUCCESS) { + if (spl_filesystem_object_get_file_name(source) == FAILURE) { return NULL; } @@ -584,7 +586,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp return NULL; } /* }}} */ -static int spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */ +static bool spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */ { return d_name[0] == '\0' || spl_filesystem_is_dot(d_name); } @@ -709,7 +711,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto { spl_filesystem_object *intern; zend_string *path; - int parsed; + zend_result parsed; zend_long flags = (ctor_flags & ~DIT_CTOR_FLAGS); zend_error_handling error_handling; @@ -740,7 +742,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto /* spl_filesystem_dir_open() may emit an E_WARNING */ zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling); #ifdef HAVE_GLOB - if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && memcmp(ZSTR_VAL(path), "glob://", sizeof("glob://")-1) != 0) { + if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && !zend_string_starts_with_literal(path, "glob://")) { path = zend_strpprintf(0, "glob://%s", ZSTR_VAL(path)); spl_filesystem_dir_open(intern, path); zend_string_release(path); @@ -809,7 +811,7 @@ PHP_METHOD(DirectoryIterator, current) PHP_METHOD(DirectoryIterator, next) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -845,7 +847,7 @@ PHP_METHOD(DirectoryIterator, seek) } while (intern->u.dir.index < pos) { - int valid = 0; + bool valid = 0; zend_call_method_with_0_params(Z_OBJ_P(ZEND_THIS), Z_OBJCE_P(ZEND_THIS), &intern->u.dir.func_valid, "valid", &retval); valid = zend_is_true(&retval); zval_ptr_dtor(&retval); @@ -1048,7 +1050,7 @@ PHP_METHOD(DirectoryIterator, getBasename) CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern); fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen); - RETVAL_STR(fname); + RETURN_STR(fname); } /* }}} */ @@ -1082,7 +1084,7 @@ PHP_METHOD(FilesystemIterator, key) if (SPL_FILE_DIR_KEY(intern, SPL_FILE_DIR_KEY_AS_FILENAME)) { RETURN_STRING(intern->u.dir.entry.d_name); } else { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } RETURN_STR_COPY(intern->file_name); @@ -1100,12 +1102,12 @@ PHP_METHOD(FilesystemIterator, current) } if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } RETURN_STR_COPY(intern->file_name); } else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value); @@ -1129,7 +1131,7 @@ PHP_METHOD(DirectoryIterator, isDot) } /* }}} */ -/* {{{ Cronstructs a new SplFileInfo from a path. */ +/* {{{ Constructs a new SplFileInfo from a path. */ /* When the constructor gets called the object is already created by the engine, so we must only call 'additional' initializations. */ @@ -1159,7 +1161,7 @@ PHP_METHOD(SplFileInfo, func_name) \ if (zend_parse_parameters_none() == FAILURE) { \ RETURN_THROWS(); \ } \ - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { \ + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { \ RETURN_THROWS(); \ } \ zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling);\ @@ -1240,7 +1242,7 @@ PHP_METHOD(SplFileInfo, getLinkTarget) } if (intern->file_name == NULL) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } } @@ -1287,7 +1289,7 @@ PHP_METHOD(SplFileInfo, getRealPath) } if (intern->type == SPL_FS_DIR && !intern->file_name && intern->u.dir.entry.d_name[0]) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } } @@ -1302,12 +1304,12 @@ PHP_METHOD(SplFileInfo, getRealPath) if (filename && VCWD_REALPATH(filename, buff)) { #ifdef ZTS if (VCWD_ACCESS(buff, F_OK)) { - RETVAL_FALSE; + RETURN_FALSE; } else #endif - RETVAL_STRING(buff); + RETURN_STRING(buff); } else { - RETVAL_FALSE; + RETURN_FALSE; } } /* }}} */ @@ -1388,7 +1390,7 @@ PHP_METHOD(SplFileInfo, getPathInfo) PHP_METHOD(SplFileInfo, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_filesystem_object_get_debug_info(Z_OBJ_P(ZEND_THIS))); @@ -1397,11 +1399,14 @@ PHP_METHOD(SplFileInfo, __debugInfo) /* {{{ */ PHP_METHOD(SplFileInfo, _bad_state_ex) { + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } zend_throw_error(NULL, "The parent constructor was not called: the object is in an invalid state"); } /* }}} */ -/* {{{ Cronstructs a new dir iterator from a path. */ +/* {{{ Constructs a new dir iterator from a path. */ PHP_METHOD(FilesystemIterator, __construct) { spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIT_CTOR_FLAGS | SPL_FILE_DIR_SKIPDOTS); @@ -1412,7 +1417,7 @@ PHP_METHOD(FilesystemIterator, __construct) PHP_METHOD(FilesystemIterator, rewind) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1468,7 +1473,7 @@ PHP_METHOD(RecursiveDirectoryIterator, hasChildren) if (spl_filesystem_is_invalid_or_dot(intern->u.dir.entry.d_name)) { RETURN_FALSE; } else { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } php_stat(intern->file_name, FS_LPERMS, return_value); @@ -1499,7 +1504,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) RETURN_THROWS(); } - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } @@ -1720,7 +1725,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter) if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) { if (Z_ISUNDEF(iterator->current)) { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return NULL; } ZVAL_STR_COPY(&iterator->current, object->file_name); @@ -1728,7 +1733,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter) return &iterator->current; } else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { if (Z_ISUNDEF(iterator->current)) { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return NULL; } spl_filesystem_object_create_type(0, object, SPL_FS_INFO, NULL, &iterator->current); @@ -1748,7 +1753,7 @@ static void spl_filesystem_tree_it_current_key(zend_object_iterator *iter, zval if (SPL_FILE_DIR_KEY(object, SPL_FILE_DIR_KEY_AS_FILENAME)) { ZVAL_STRING(key, object->u.dir.entry.d_name); } else { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return; } ZVAL_STR_COPY(key, object->file_name); @@ -1860,7 +1865,7 @@ static int spl_filesystem_object_cast(zend_object *readobj, zval *writeobj, int } /* }}} */ -static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read(spl_filesystem_object *intern, bool silent) /* {{{ */ { char *buf; size_t line_len = 0; @@ -1909,10 +1914,10 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent) / return SUCCESS; } /* }}} */ -static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, int escape, zval *return_value) /* {{{ */ +static zend_result spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, int escape, zval *return_value) /* {{{ */ { do { - int ret = spl_filesystem_file_read(intern, 1); + zend_result ret = spl_filesystem_file_read(intern, 1); if (ret != SUCCESS) { return ret; } @@ -1934,7 +1939,7 @@ static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char deli } /* }}} */ -static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ { zval retval; @@ -1977,7 +1982,7 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje } } /* }}} */ -static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* {{{ */ +static bool spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* {{{ */ { if (intern->u.file.current_line) { return intern->u.file.current_line_len == 0; @@ -2016,9 +2021,9 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* { } /* }}} */ -static int spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ { - int ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent); + zend_result ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent); while (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern)) { spl_filesystem_file_free_line(intern); @@ -2160,12 +2165,11 @@ PHP_METHOD(SplFileObject, valid) if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { RETURN_BOOL(intern->u.file.current_line || !Z_ISUNDEF(intern->u.file.current_zval)); - } else { - if(!intern->u.file.stream) { - RETURN_FALSE; - } - RETVAL_BOOL(!php_stream_eof(intern->u.file.stream)); } + if (!intern->u.file.stream) { + RETURN_FALSE; + } + RETURN_BOOL(!php_stream_eof(intern->u.file.stream)); } /* }}} */ /* {{{ Return next line from file */ @@ -2327,35 +2331,32 @@ PHP_METHOD(SplFileObject, fgetcsv) CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); - switch (ZEND_NUM_ARGS()) { - case 3: - if (esc_len > 1) { - zend_argument_value_error(3, "must be empty or a single character"); + if (delim) { + if (d_len != 1) { + zend_argument_value_error(1, "must be a single character"); RETURN_THROWS(); } - if (esc_len == 0) { - escape = PHP_CSV_NO_ESCAPE; - } else { - escape = (unsigned char) esc[0]; - } - ZEND_FALLTHROUGH; - case 2: + delimiter = delim[0]; + } + if (enclo) { if (e_len != 1) { zend_argument_value_error(2, "must be a single character"); RETURN_THROWS(); } enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 1: - if (d_len != 1) { - zend_argument_value_error(1, "must be a single character"); + } + if (esc) { + if (esc_len > 1) { + zend_argument_value_error(3, "must be empty or a single character"); RETURN_THROWS(); } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 0: - break; + if (esc_len == 0) { + escape = PHP_CSV_NO_ESCAPE; + } else { + escape = (unsigned char) esc[0]; + } } + if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape, return_value) == FAILURE) { RETURN_FALSE; } @@ -2374,49 +2375,41 @@ PHP_METHOD(SplFileObject, fputcsv) zval *fields = NULL; zend_string *eol = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|sssS", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len, &eol) == SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|sssS", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len, &eol) == FAILURE) { + RETURN_THROWS(); + } - switch(ZEND_NUM_ARGS()) - { - case 5: - case 4: - switch (esc_len) { - case 0: - escape = PHP_CSV_NO_ESCAPE; - break; - case 1: - escape = (unsigned char) esc[0]; - break; - default: - zend_argument_value_error(4, "must be empty or a single character"); - RETURN_THROWS(); - } - ZEND_FALLTHROUGH; - case 3: - if (e_len != 1) { - zend_argument_value_error(3, "must be a single character"); - RETURN_THROWS(); - } - enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 2: - if (d_len != 1) { - zend_argument_value_error(2, "must be a single character"); - RETURN_THROWS(); - } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 1: - case 0: - break; + if (delim) { + if (d_len != 1) { + zend_argument_value_error(2, "must be a single character"); + RETURN_THROWS(); } - - ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol); - if (ret < 0) { - RETURN_FALSE; + delimiter = delim[0]; + } + if (enclo) { + if (e_len != 1) { + zend_argument_value_error(3, "must be a single character"); + RETURN_THROWS(); } - RETURN_LONG(ret); + enclosure = enclo[0]; + } + if (esc) { + if (esc_len > 1) { + zend_argument_value_error(4, "must be empty or a single character"); + RETURN_THROWS(); + } + if (esc_len == 0) { + escape = PHP_CSV_NO_ESCAPE; + } else { + escape = (unsigned char) esc[0]; + } + } + + ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol); + if (ret < 0) { + RETURN_FALSE; } + RETURN_LONG(ret); } /* }}} */ @@ -2429,43 +2422,39 @@ PHP_METHOD(SplFileObject, setCsvControl) char *delim = NULL, *enclo = NULL, *esc = NULL; size_t d_len = 0, e_len = 0, esc_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == SUCCESS) { - switch(ZEND_NUM_ARGS()) - { - case 3: - switch (esc_len) { - case 0: - escape = PHP_CSV_NO_ESCAPE; - break; - case 1: - escape = (unsigned char) esc[0]; - break; - default: - zend_argument_value_error(3, "must be empty or a single character"); - RETURN_THROWS(); - } - ZEND_FALLTHROUGH; - case 2: - if (e_len != 1) { - zend_argument_value_error(2, "must be a single character"); - RETURN_THROWS(); - } - enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 1: - if (d_len != 1) { - zend_argument_value_error(1, "must be a single character"); - RETURN_THROWS(); - } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 0: - break; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) { + RETURN_THROWS(); + } + + if (delim) { + if (d_len != 1) { + zend_argument_value_error(1, "must be a single character"); + RETURN_THROWS(); + } + delimiter = delim[0]; + } + if (enclo) { + if (e_len != 1) { + zend_argument_value_error(2, "must be a single character"); + RETURN_THROWS(); + } + enclosure = enclo[0]; + } + if (esc) { + if (esc_len > 1) { + zend_argument_value_error(3, "must be empty or a single character"); + RETURN_THROWS(); + } + if (esc_len == 0) { + escape = PHP_CSV_NO_ESCAPE; + } else { + escape = (unsigned char) esc[0]; } - intern->u.file.delimiter = delimiter; - intern->u.file.enclosure = enclosure; - intern->u.file.escape = escape; } + + intern->u.file.delimiter = delimiter; + intern->u.file.enclosure = enclosure; + intern->u.file.escape = escape; } /* }}} */ @@ -2475,6 +2464,10 @@ PHP_METHOD(SplFileObject, getCsvControl) spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); char delimiter[2], enclosure[2], escape[2]; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + array_init(return_value); delimiter[0] = intern->u.file.delimiter; @@ -2516,6 +2509,10 @@ PHP_METHOD(SplFileObject, fflush) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); RETURN_BOOL(!php_stream_flush(intern->u.file.stream)); @@ -2527,6 +2524,10 @@ PHP_METHOD(SplFileObject, ftell) spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); zend_long ret; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); ret = php_stream_tell(intern->u.file.stream); @@ -2561,6 +2562,10 @@ PHP_METHOD(SplFileObject, fgetc) char buf[2]; int result; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); spl_filesystem_file_free_line(intern); @@ -2568,16 +2573,15 @@ PHP_METHOD(SplFileObject, fgetc) result = php_stream_getc(intern->u.file.stream); if (result == EOF) { - RETVAL_FALSE; - } else { - if (result == '\n') { - intern->u.file.current_line_num++; - } - buf[0] = result; - buf[1] = '\0'; - - RETURN_STRINGL(buf, 1); + RETURN_FALSE; + } + if (result == '\n') { + intern->u.file.current_line_num++; } + buf[0] = result; + buf[1] = '\0'; + + RETURN_STRINGL(buf, 1); } /* }}} */ /* {{{ Output all remaining data from a file pointer */ @@ -2585,6 +2589,10 @@ PHP_METHOD(SplFileObject, fpassthru) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); RETURN_LONG(php_stream_passthru(intern->u.file.stream)); @@ -2734,11 +2742,9 @@ PHP_METHOD(SplFileObject, seek) return; } } - if (line_pos > 0) { - if (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { + if (line_pos > 0 && !SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { intern->u.file.current_line_num++; - spl_filesystem_file_free_line(intern); - } + spl_filesystem_file_free_line(intern); } } /* }}} */ diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index f82a3ffe91e97..0daf486e40b60 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -1191,6 +1191,7 @@ PHP_METHOD(SplDoublyLinkedList, add) /* Get the element we want to insert before */ element = spl_ptr_llist_offset(intern->llist, index, intern->flags & SPL_DLLIST_IT_LIFO); + ZEND_ASSERT(element != NULL); ZVAL_COPY(&elem->data, value); SPL_LLIST_RC(elem) = 1; diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 3b1da6d98c536..217f3aa19c038 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -23,6 +23,7 @@ #include "ext/standard/info.h" #include "zend_exceptions.h" #include "zend_interfaces.h" +#include "ext/pcre/php_pcre.h" #include "php_spl.h" #include "spl_functions.h" @@ -113,6 +114,53 @@ typedef struct _spl_recursive_it_iterator { zend_object_iterator intern; } spl_recursive_it_iterator; +typedef struct _spl_cbfilter_it_intern { + zend_fcall_info fci; + zend_fcall_info_cache fcc; + zend_object *object; +} _spl_cbfilter_it_intern; + +typedef struct _spl_dual_it_object { + struct { + zval zobject; + zend_class_entry *ce; + zend_object *object; + zend_object_iterator *iterator; + } inner; + struct { + zval data; + zval key; + zend_long pos; + } current; + dual_it_type dit_type; + union { + struct { + zend_long offset; + zend_long count; + } limit; + struct { + zend_long flags; /* CIT_* */ + zend_string *zstr; + zval zchildren; + zval zcache; + } caching; + struct { + zval zarrayit; + zend_object_iterator *iterator; + } append; + struct { + zend_long flags; + zend_long preg_flags; + pcre_cache_entry *pce; + zend_string *regex; + regex_mode mode; + int use_flags; + } regex; + _spl_cbfilter_it_intern *cbfilter; + } u; + zend_object std; +} spl_dual_it_object; + static zend_object_handlers spl_handlers_rec_it_it; static zend_object_handlers spl_handlers_dual_it; @@ -123,6 +171,12 @@ static inline spl_recursive_it_object *spl_recursive_it_from_obj(zend_object *ob #define Z_SPLRECURSIVE_IT_P(zv) spl_recursive_it_from_obj(Z_OBJ_P((zv))) +static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ { + return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std)); +} /* }}} */ + +#define Z_SPLDUAL_IT_P(zv) spl_dual_it_from_obj(Z_OBJ_P((zv))) + #define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval) \ do { \ spl_dual_it_object *it = Z_SPLDUAL_IT_P(objzval); \ diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index 1f42201b769cf..61e899de34f2b 100644 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -19,7 +19,6 @@ #include "php.h" #include "php_spl.h" -#include "ext/pcre/php_pcre.h" extern PHPAPI zend_class_entry *spl_ce_AppendIterator; extern PHPAPI zend_class_entry *spl_ce_CachingIterator; @@ -99,59 +98,6 @@ typedef enum { REGIT_MODE_MAX } regex_mode; -typedef struct _spl_cbfilter_it_intern { - zend_fcall_info fci; - zend_fcall_info_cache fcc; - zend_object *object; -} _spl_cbfilter_it_intern; - -typedef struct _spl_dual_it_object { - struct { - zval zobject; - zend_class_entry *ce; - zend_object *object; - zend_object_iterator *iterator; - } inner; - struct { - zval data; - zval key; - zend_long pos; - } current; - dual_it_type dit_type; - union { - struct { - zend_long offset; - zend_long count; - } limit; - struct { - zend_long flags; /* CIT_* */ - zend_string *zstr; - zval zchildren; - zval zcache; - } caching; - struct { - zval zarrayit; - zend_object_iterator *iterator; - } append; - struct { - zend_long flags; - zend_long preg_flags; - pcre_cache_entry *pce; - zend_string *regex; - regex_mode mode; - int use_flags; - } regex; - _spl_cbfilter_it_intern *cbfilter; - } u; - zend_object std; -} spl_dual_it_object; - -static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ { - return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std)); -} /* }}} */ - -#define Z_SPLDUAL_IT_P(zv) spl_dual_it_from_obj(Z_OBJ_P((zv))) - typedef int (*spl_iterator_apply_func_t)(zend_object_iterator *iter, void *puser); PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser); diff --git a/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt b/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt index 60efae632dae2..c660d217acb55 100644 --- a/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt +++ b/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt @@ -15,6 +15,11 @@ try { } catch (ValueError $e) { echo $e->getMessage(), "\n"; } +try { + var_dump($fo->fputcsv(array('water', 'fruit'), ',', '""')); +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} unset($fo); @@ -27,5 +32,6 @@ unlink($file); ?> --EXPECT-- *** Testing fputcsv() : with enclosure & delimiter of two chars and file opened in read mode *** +SplFileObject::fputcsv(): Argument #2 ($separator) must be a single character SplFileObject::fputcsv(): Argument #3 ($enclosure) must be a single character Done diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 09f67b2e3f60b..15a0f83b9af8a 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -67,22 +67,22 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; #include "win32/inet.h" #endif -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H # include #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H # include #endif #include #include -#if HAVE_SYS_MMAN_H +#ifdef HAVE_SYS_MMAN_H # include #endif -#if HAVE_SYS_LOADAVG_H +#ifdef HAVE_SYS_LOADAVG_H # include #endif @@ -91,7 +91,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef INADDR_NONE -#define INADDR_NONE ((zend_ulong) -1) +# define INADDR_NONE ((zend_ulong) -1) #endif #include "zend_globals.h" @@ -149,13 +149,13 @@ zend_module_entry basic_functions_module = { /* {{{ */ }; /* }}} */ -#if defined(HAVE_PUTENV) +#ifdef HAVE_PUTENV static void php_putenv_destructor(zval *zv) /* {{{ */ { putenv_entry *pe = Z_PTR_P(zv); if (pe->previous_value) { -# if defined(PHP_WIN32) +# ifdef PHP_WIN32 /* MSVCRT has a bug in putenv() when setting a variable that * is already set; if the SetEnvironmentVariable() API call * fails, the Crt will double free() a string. @@ -163,11 +163,11 @@ static void php_putenv_destructor(zval *zv) /* {{{ */ SetEnvironmentVariable(ZSTR_VAL(pe->key), "bugbug"); # endif putenv(pe->previous_value); -# if defined(PHP_WIN32) +# ifdef PHP_WIN32 efree(pe->previous_value); # endif } else { -# if HAVE_UNSETENV +# ifdef HAVE_UNSETENV unsetenv(ZSTR_VAL(pe->key)); # elif defined(PHP_WIN32) SetEnvironmentVariable(ZSTR_VAL(pe->key), NULL); @@ -282,14 +282,14 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ { #ifdef ZTS ts_allocate_id(&basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor); -#ifdef PHP_WIN32 +# ifdef PHP_WIN32 ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, (ts_allocate_dtor)php_win32_core_globals_dtor ); -#endif +# endif #else basic_globals_ctor(&basic_globals); -#ifdef PHP_WIN32 +# ifdef PHP_WIN32 php_win32_core_globals_ctor(&the_php_win32_core_globals); -#endif +# endif #endif php_ce_incomplete_class = register_class___PHP_Incomplete_Class(); @@ -347,7 +347,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_CS | CONST_PERSISTENT); -#if ENABLE_TEST_CLASS +#ifdef ENABLE_TEST_CLASS test_class_startup(); #endif @@ -364,23 +364,23 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ BASIC_MINIT_SUBMODULE(password) BASIC_MINIT_SUBMODULE(mt_rand) -#if defined(ZTS) +#ifdef ZTS BASIC_MINIT_SUBMODULE(localeconv) #endif -#if defined(HAVE_NL_LANGINFO) +#ifdef HAVE_NL_LANGINFO BASIC_MINIT_SUBMODULE(nl_langinfo) #endif -#if ZEND_INTRIN_SSE4_2_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_FUNC_PTR BASIC_MINIT_SUBMODULE(string_intrin) #endif -#if ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR BASIC_MINIT_SUBMODULE(crc32_x86_intrin) #endif -#if ZEND_INTRIN_AVX2_FUNC_PTR || ZEND_INTRIN_SSSE3_FUNC_PTR +#if defined(ZEND_INTRIN_AVX2_FUNC_PTR) || defined(ZEND_INTRIN_SSSE3_FUNC_PTR) BASIC_MINIT_SUBMODULE(base64_intrin) #endif @@ -411,8 +411,8 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ php_register_url_stream_wrapper("http", &php_stream_http_wrapper); php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC -# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) BASIC_MINIT_SUBMODULE(dns) # endif #endif @@ -452,7 +452,7 @@ PHP_MSHUTDOWN_FUNCTION(basic) /* {{{ */ BASIC_MSHUTDOWN_SUBMODULE(url_scanner_ex) BASIC_MSHUTDOWN_SUBMODULE(file) BASIC_MSHUTDOWN_SUBMODULE(standard_filters) -#if defined(ZTS) +#ifdef ZTS BASIC_MSHUTDOWN_SUBMODULE(localeconv) #endif BASIC_MSHUTDOWN_SUBMODULE(crypt) @@ -876,7 +876,7 @@ PHP_FUNCTION(putenv) for (env = environ; env != NULL && *env != NULL; env++) { if (!strncmp(*env, ZSTR_VAL(pe.key), ZSTR_LEN(pe.key)) && (*env)[ZSTR_LEN(pe.key)] == '=') { /* found it */ -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 /* must copy previous value because MSVCRT's putenv can free the string without notice */ pe.previous_value = estrdup(*env); #else @@ -886,7 +886,7 @@ PHP_FUNCTION(putenv) } } -#if HAVE_UNSETENV +#ifdef HAVE_UNSETENV if (!p) { /* no '=' means we want to unset it */ unsetenv(pe.putenv_string); } @@ -932,7 +932,7 @@ PHP_FUNCTION(putenv) } #endif tsrm_env_unlock(); -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 free(keyw); free(valw); #endif @@ -940,7 +940,7 @@ PHP_FUNCTION(putenv) } else { free(pe.putenv_string); zend_string_release(pe.key); -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 free(keyw); free(valw); #endif @@ -1245,13 +1245,13 @@ PHP_FUNCTION(usleep) RETURN_THROWS(); } -#if HAVE_USLEEP +#ifdef HAVE_USLEEP usleep((unsigned int)num); #endif } /* }}} */ -#if HAVE_NANOSLEEP +#ifdef HAVE_NANOSLEEP /* {{{ Delay for a number of seconds and nano seconds */ PHP_FUNCTION(time_nanosleep) { @@ -2245,7 +2245,7 @@ PHP_FUNCTION(ignore_user_abort) } /* }}} */ -#if HAVE_GETSERVBYNAME +#ifdef HAVE_GETSERVBYNAME /* {{{ Returns port associated with service. Protocol must be "tcp" or "udp" */ PHP_FUNCTION(getservbyname) { @@ -2270,7 +2270,7 @@ PHP_FUNCTION(getservbyname) serv = getservbyname(ZSTR_VAL(name), proto); -#if defined(_AIX) +#ifdef _AIX /* On AIX, imap is only known as imap2 in /etc/services, while on Linux imap is an alias for imap2. If a request for imap gives no result, we try again with imap2. @@ -2288,7 +2288,7 @@ PHP_FUNCTION(getservbyname) /* }}} */ #endif -#if HAVE_GETSERVBYPORT +#ifdef HAVE_GETSERVBYPORT /* {{{ Returns service name associated with port. Protocol must be "tcp" or "udp" */ PHP_FUNCTION(getservbyport) { @@ -2313,7 +2313,7 @@ PHP_FUNCTION(getservbyport) /* }}} */ #endif -#if HAVE_GETPROTOBYNAME +#ifdef HAVE_GETPROTOBYNAME /* {{{ Returns protocol number associated with name as per /etc/protocols */ PHP_FUNCTION(getprotobyname) { @@ -2336,7 +2336,7 @@ PHP_FUNCTION(getprotobyname) /* }}} */ #endif -#if HAVE_GETPROTOBYNUMBER +#ifdef HAVE_GETPROTOBYNUMBER /* {{{ Returns protocol name associated with protocol number proto */ PHP_FUNCTION(getprotobynumber) { diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 5a6e611e8778a..8239b6d14dba3 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -430,7 +430,7 @@ function sleep(int $seconds): int {} function usleep(int $microseconds): void {} -#if HAVE_NANOSLEEP +#ifdef HAVE_NANOSLEEP /** * @return array|bool * @refcount 1 @@ -509,20 +509,20 @@ function connection_status(): int {} function ignore_user_abort(?bool $enable = null): int {} -#if HAVE_GETSERVBYNAME +#ifdef HAVE_GETSERVBYNAME function getservbyname(string $service, string $protocol): int|false {} #endif -#if HAVE_GETSERVBYPORT +#ifdef HAVE_GETSERVBYPORT /** @refcount 1 */ function getservbyport(int $port, string $protocol): string|false {} #endif -#if HAVE_GETPROTOBYNAME +#ifdef HAVE_GETPROTOBYNAME function getprotobyname(string $protocol): int|false {} #endif -#if HAVE_GETPROTOBYNUMBER +#ifdef HAVE_GETPROTOBYNUMBER /** @refcount 1 */ function getprotobynumber(int $protocol): string|false {} #endif @@ -583,7 +583,7 @@ function crypt(string $string, string $salt): string {} /* datetime.c */ -#if HAVE_STRPTIME +#ifdef HAVE_STRPTIME /** * @return array|false * @deprecated @@ -611,7 +611,7 @@ function gethostbyname(string $hostname): string {} */ function gethostbynamel(string $hostname): array|false {} -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) function dns_check_record(string $hostname, string $type = "MX"): bool {} /** @alias dns_check_record */ @@ -647,7 +647,7 @@ function net_get_interfaces(): array|false {} /* ftok.c */ -#if HAVE_FTOK +#ifdef HAVE_FTOK function ftok(string $filename, string $project_id): int {} #endif @@ -781,7 +781,7 @@ function strspn(string $string, string $characters, int $offset = 0, ?int $lengt function strcspn(string $string, string $characters, int $offset = 0, ?int $length = null): int {} -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO /** @refcount 1 */ function nl_langinfo(int $item): string|false {} #endif @@ -1041,7 +1041,7 @@ function closedir($dir_handle = null): void {} function chdir(string $directory): bool {} -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) function chroot(string $directory): bool {} #endif @@ -1323,7 +1323,7 @@ function chown(string $filename, string|int $user): bool {} function chgrp(string $filename, string|int $group): bool {} -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN function lchown(string $filename, string|int $user): bool {} function lchgrp(string $filename, string|int $group): bool {} @@ -1331,7 +1331,7 @@ function lchgrp(string $filename, string|int $group): bool {} function chmod(string $filename, int $permissions): bool {} -#if HAVE_UTIME +#ifdef HAVE_UTIME function touch(string $filename, ?int $mtime = null, ?int $atime = null): bool {} #endif @@ -1796,7 +1796,7 @@ function stream_socket_enable_crypto($stream, bool $enable, ?int $crypto_method function stream_socket_shutdown($stream, int $mode): bool {} #endif -#if HAVE_SOCKETPAIR +#ifdef HAVE_SOCKETPAIR /** * @return array|false * @refcount 1 @@ -1888,7 +1888,7 @@ function sapi_windows_vt100_support($stream, ?bool $enable = null): bool {} /** @param resource $stream */ function stream_set_chunk_size($stream, int $size): int {} -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) /** @param resource $stream */ function stream_set_timeout($stream, int $seconds, int $microseconds = 0): bool {} @@ -2057,6 +2057,8 @@ function memory_get_usage(bool $real_usage = false): int {} function memory_get_peak_usage(bool $real_usage = false): int {} +function memory_reset_peak_usage(): void {} + /* versioning.c */ /** @compile-time-eval */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 10a6cfd7f2af0..b912e503bbe44 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: ed5328c35c17c591847feba6cb00f5badb2b446c */ + * Stub hash: bbcebdb57572133d5f442f220f1e98a1320ed0f6 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -413,14 +413,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_usleep, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, microseconds, IS_LONG, 0) ZEND_END_ARG_INFO() -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_time_nanosleep, 0, 2, MAY_BE_ARRAY|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, nanoseconds, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_time_sleep_until, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, timestamp, IS_DOUBLE, 0) ZEND_END_ARG_INFO() @@ -519,27 +519,27 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ignore_user_abort, 0, 0, IS_LONG ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyname, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, service, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyport, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobyname, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobynumber, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, protocol, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -599,7 +599,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_crypt, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, salt, IS_STRING, 0) ZEND_END_ARG_INFO() -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strptime, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, timestamp, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) @@ -623,18 +623,18 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gethostbynamel, 0, 1, MAY_BE_ARR ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_check_record, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 0, "\"MX\"") ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) #define arginfo_checkdnsrr arginfo_dns_check_record #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "DNS_ANY") @@ -644,7 +644,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARR ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_INFO(1, hosts) @@ -652,7 +652,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) #define arginfo_getmxrr arginfo_dns_get_mx #endif @@ -661,7 +661,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_net_get_interfaces, 0, 0, MAY_BE ZEND_END_ARG_INFO() #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftok, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, project_id, IS_STRING, 0) @@ -820,7 +820,7 @@ ZEND_END_ARG_INFO() #define arginfo_strcspn arginfo_strspn -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_nl_langinfo, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, item, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -1113,7 +1113,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chdir, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chroot, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -1415,14 +1415,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chgrp, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL) ZEND_END_ARG_INFO() -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchown, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, user, MAY_BE_STRING|MAY_BE_LONG, NULL) ZEND_END_ARG_INFO() #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchgrp, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL) @@ -1434,7 +1434,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chmod, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, permissions, IS_LONG, 0) ZEND_END_ARG_INFO() -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_touch, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mtime, IS_LONG, 1, "null") @@ -1951,7 +1951,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_socket_shutdown, 0, 2, _I ZEND_END_ARG_INFO() #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_SOCKETPAIR) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0) @@ -2021,7 +2021,7 @@ ZEND_END_ARG_INFO() #define arginfo_stream_set_chunk_size arginfo_stream_set_write_buffer -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2029,7 +2029,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BO ZEND_END_ARG_INFO() #endif -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) #define arginfo_socket_set_timeout arginfo_stream_set_timeout #endif @@ -2175,8 +2175,7 @@ ZEND_END_ARG_INFO() #define arginfo_memory_get_peak_usage arginfo_memory_get_usage -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memory_reset_peak_usage, 0, 0, IS_VOID, 0) -ZEND_END_ARG_INFO() +#define arginfo_memory_reset_peak_usage arginfo_flush ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0) @@ -2335,10 +2334,10 @@ ZEND_FUNCTION(getopt); ZEND_FUNCTION(flush); ZEND_FUNCTION(sleep); ZEND_FUNCTION(usleep); -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FUNCTION(time_nanosleep); #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FUNCTION(time_sleep_until); #endif ZEND_FUNCTION(get_current_user); @@ -2364,16 +2363,16 @@ ZEND_FUNCTION(print_r); ZEND_FUNCTION(connection_aborted); ZEND_FUNCTION(connection_status); ZEND_FUNCTION(ignore_user_abort); -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_FUNCTION(getservbyname); #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_FUNCTION(getservbyport); #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_FUNCTION(getprotobyname); #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_FUNCTION(getprotobynumber); #endif ZEND_FUNCTION(register_tick_function); @@ -2391,7 +2390,7 @@ ZEND_FUNCTION(sys_getloadavg); ZEND_FUNCTION(get_browser); ZEND_FUNCTION(crc32); ZEND_FUNCTION(crypt); -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_FUNCTION(strptime); #endif #if defined(HAVE_GETHOSTNAME) @@ -2400,19 +2399,19 @@ ZEND_FUNCTION(gethostname); ZEND_FUNCTION(gethostbyaddr); ZEND_FUNCTION(gethostbyname); ZEND_FUNCTION(gethostbynamel); -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_check_record); #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_get_record); #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_get_mx); #endif #if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) ZEND_FUNCTION(net_get_interfaces); #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_FUNCTION(ftok); #endif ZEND_FUNCTION(hrtime); @@ -2460,7 +2459,7 @@ ZEND_FUNCTION(bin2hex); ZEND_FUNCTION(hex2bin); ZEND_FUNCTION(strspn); ZEND_FUNCTION(strcspn); -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_FUNCTION(nl_langinfo); #endif ZEND_FUNCTION(strcoll); @@ -2530,7 +2529,7 @@ ZEND_FUNCTION(opendir); ZEND_FUNCTION(dir); ZEND_FUNCTION(closedir); ZEND_FUNCTION(chdir); -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_FUNCTION(chroot); #endif ZEND_FUNCTION(getcwd); @@ -2609,14 +2608,14 @@ ZEND_FUNCTION(stat); ZEND_FUNCTION(lstat); ZEND_FUNCTION(chown); ZEND_FUNCTION(chgrp); -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FUNCTION(lchown); #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FUNCTION(lchgrp); #endif ZEND_FUNCTION(chmod); -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_FUNCTION(touch); #endif ZEND_FUNCTION(clearstatcache); @@ -2760,7 +2759,7 @@ ZEND_FUNCTION(stream_socket_enable_crypto); #if defined(HAVE_SHUTDOWN) ZEND_FUNCTION(stream_socket_shutdown); #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_SOCKETPAIR) ZEND_FUNCTION(stream_socket_pair); #endif ZEND_FUNCTION(stream_copy_to_stream); @@ -2780,7 +2779,7 @@ ZEND_FUNCTION(stream_isatty); ZEND_FUNCTION(sapi_windows_vt100_support); #endif ZEND_FUNCTION(stream_set_chunk_size); -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FUNCTION(stream_set_timeout); #endif ZEND_FUNCTION(gettype); @@ -2965,10 +2964,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(flush, arginfo_flush) ZEND_FE(sleep, arginfo_sleep) ZEND_FE(usleep, arginfo_usleep) -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FE(time_nanosleep, arginfo_time_nanosleep) #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FE(time_sleep_until, arginfo_time_sleep_until) #endif ZEND_FE(get_current_user, arginfo_get_current_user) @@ -2996,16 +2995,16 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(connection_aborted, arginfo_connection_aborted) ZEND_FE(connection_status, arginfo_connection_status) ZEND_FE(ignore_user_abort, arginfo_ignore_user_abort) -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_FE(getservbyname, arginfo_getservbyname) #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_FE(getservbyport, arginfo_getservbyport) #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_FE(getprotobyname, arginfo_getprotobyname) #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_FE(getprotobynumber, arginfo_getprotobynumber) #endif ZEND_FE(register_tick_function, arginfo_register_tick_function) @@ -3023,7 +3022,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(get_browser, arginfo_get_browser) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(crc32, arginfo_crc32) ZEND_FE(crypt, arginfo_crypt) -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_DEP_FE(strptime, arginfo_strptime) #endif #if defined(HAVE_GETHOSTNAME) @@ -3032,25 +3031,25 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(gethostbyaddr, arginfo_gethostbyaddr) ZEND_FE(gethostbyname, arginfo_gethostbyname) ZEND_FE(gethostbynamel, arginfo_gethostbynamel) -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_check_record, arginfo_dns_check_record) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FALIAS(checkdnsrr, dns_check_record, arginfo_checkdnsrr) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_get_record, arginfo_dns_get_record) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_get_mx, arginfo_dns_get_mx) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FALIAS(getmxrr, dns_get_mx, arginfo_getmxrr) #endif #if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) ZEND_FE(net_get_interfaces, arginfo_net_get_interfaces) #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_FE(ftok, arginfo_ftok) #endif ZEND_FE(hrtime, arginfo_hrtime) @@ -3098,7 +3097,7 @@ static const zend_function_entry ext_functions[] = { ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hex2bin, arginfo_hex2bin) ZEND_FE(strspn, arginfo_strspn) ZEND_FE(strcspn, arginfo_strcspn) -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_FE(nl_langinfo, arginfo_nl_langinfo) #endif ZEND_FE(strcoll, arginfo_strcoll) @@ -3171,7 +3170,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(dir, arginfo_dir) ZEND_FE(closedir, arginfo_closedir) ZEND_FE(chdir, arginfo_chdir) -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_FE(chroot, arginfo_chroot) #endif ZEND_FE(getcwd, arginfo_getcwd) @@ -3252,14 +3251,14 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(lstat, arginfo_lstat) ZEND_FE(chown, arginfo_chown) ZEND_FE(chgrp, arginfo_chgrp) -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FE(lchown, arginfo_lchown) #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FE(lchgrp, arginfo_lchgrp) #endif ZEND_FE(chmod, arginfo_chmod) -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_FE(touch, arginfo_touch) #endif ZEND_FE(clearstatcache, arginfo_clearstatcache) @@ -3406,7 +3405,7 @@ static const zend_function_entry ext_functions[] = { #if defined(HAVE_SHUTDOWN) ZEND_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown) #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_SOCKETPAIR) ZEND_FE(stream_socket_pair, arginfo_stream_socket_pair) #endif ZEND_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream) @@ -3429,10 +3428,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support) #endif ZEND_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size) -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FE(stream_set_timeout, arginfo_stream_set_timeout) #endif -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout) #endif ZEND_FE(gettype, arginfo_gettype) diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c index 221b864ba58d5..d13eee14fbe9d 100644 --- a/ext/standard/crc32.c +++ b/ext/standard/crc32.c @@ -19,7 +19,7 @@ #include "crc32.h" #include "crc32_x86.h" -#if HAVE_AARCH64_CRC32 +#ifdef HAVE_AARCH64_CRC32 # include # if defined(__linux__) # include @@ -91,7 +91,7 @@ static uint32_t crc32_aarch64(uint32_t crc, const char *p, size_t nr) { PHPAPI uint32_t php_crc32_bulk_update(uint32_t crc, const char *p, size_t nr) { -#if HAVE_AARCH64_CRC32 +#ifdef HAVE_AARCH64_CRC32 if (has_crc32_insn()) { crc = crc32_aarch64(crc, p, nr); return crc; diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 117071bffc235..fa18dd316e889 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -21,14 +21,14 @@ #include "php.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #if PHP_USE_PHP_CRYPT_R # include "php_crypt_r.h" # include "crypt_freesec.h" #else -# if HAVE_CRYPT_H +# ifdef HAVE_CRYPT_H # if defined(CRYPT_R_GNU_SOURCE) && !defined(_GNU_SOURCE) # define _GNU_SOURCE # endif diff --git a/ext/standard/crypt_sha512.c b/ext/standard/crypt_sha512.c index f896dad5a8142..a7696d63f7e84 100644 --- a/ext/standard/crypt_sha512.c +++ b/ext/standard/crypt_sha512.c @@ -296,7 +296,7 @@ sha512_process_bytes(const void *buffer, size_t len, struct sha512_ctx *ctx) { /* Process available complete blocks. */ if (len >= 128) { -#if !_STRING_ARCH_unaligned +#ifndef _STRING_ARCH_unaligned /* To check alignment gcc has an appropriate operator. Other compilers don't. */ # if __GNUC__ >= 2 diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c index d8054336bffc6..5308a0e249487 100644 --- a/ext/standard/datetime.c +++ b/ext/standard/datetime.c @@ -62,7 +62,7 @@ PHPAPI char *php_std_date(time_t t) } /* }}} */ -#if HAVE_STRPTIME +#ifdef HAVE_STRPTIME #ifndef HAVE_STRPTIME_DECL_FAILS char *strptime(const char *s, const char *format, struct tm *tm); #endif diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 7c9012cb6b198..8f2ddf742b679 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -25,7 +25,7 @@ #include "basic_functions.h" #include "dir_arginfo.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif @@ -268,7 +268,7 @@ PHP_FUNCTION(closedir) } /* }}} */ -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) /* {{{ Change root directory */ PHP_FUNCTION(chroot) { @@ -342,9 +342,9 @@ PHP_FUNCTION(getcwd) ZEND_PARSE_PARAMETERS_NONE(); -#if HAVE_GETCWD +#ifdef HAVE_GETCWD ret = VCWD_GETCWD(path, MAXPATHLEN); -#elif HAVE_GETWD +#elif defined(HAVE_GETWD) ret = VCWD_GETWD(path); #endif diff --git a/ext/standard/dl.c b/ext/standard/dl.c index 77d296ced77a9..15755962f410f 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -24,7 +24,7 @@ #include "SAPI.h" -#if defined(HAVE_LIBDL) +#ifdef HAVE_LIBDL #include #include #include @@ -65,7 +65,7 @@ PHPAPI PHP_FUNCTION(dl) } /* }}} */ -#if defined(HAVE_LIBDL) +#ifdef HAVE_LIBDL /* {{{ php_load_shlib */ PHPAPI void *php_load_shlib(const char *path, char **errp) diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 6d22e644a8eff..01d97ce0c4e7b 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -20,7 +20,7 @@ #include "php.h" #include "php_network.h" -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -31,7 +31,7 @@ # include #else #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #include @@ -39,13 +39,13 @@ #undef STATUS #undef T_UNSPEC #endif -#if HAVE_ARPA_NAMESER_H +#ifdef HAVE_ARPA_NAMESER_H #ifdef DARWIN # define BIND_8_COMPAT 1 #endif #include #endif -#if HAVE_RESOLV_H +#ifdef HAVE_RESOLV_H #include #if defined(__HAIKU__) extern void __res_ndestroy(res_state statp); @@ -157,7 +157,7 @@ PHP_FUNCTION(gethostbyaddr) hostname = php_gethostbyaddr(addr); if (hostname == NULL) { -#if HAVE_IPV6 && HAVE_INET_PTON +#if defined(HAVE_IPV6) && defined(HAVE_INET_PTON) php_error_docref(NULL, E_WARNING, "Address is not a valid IPv4 or IPv6 address"); #else php_error_docref(NULL, E_WARNING, "Address is not in a.b.c.d form"); @@ -172,7 +172,7 @@ PHP_FUNCTION(gethostbyaddr) /* {{{ php_gethostbyaddr */ static zend_string *php_gethostbyaddr(char *ip) { -#if HAVE_IPV6 && HAVE_INET_PTON +#if defined(HAVE_IPV6) && defined(HAVE_INET_PTON) struct sockaddr_in sa4; struct sockaddr_in6 sa6; char out[NI_MAXHOST]; @@ -316,7 +316,7 @@ static zend_string *php_gethostbyname(char *name) } /* }}} */ -#if HAVE_FULL_DNS_FUNCS || defined(PHP_WIN32) +#if defined(HAVE_FULL_DNS_FUNCS) || defined(PHP_WIN32) # define PHP_DNS_NUM_TYPES 13 /* Number of DNS Types Supported by PHP currently */ # define PHP_DNS_A 0x00000001 @@ -337,7 +337,7 @@ static zend_string *php_gethostbyname(char *name) #endif /* HAVE_FULL_DNS_FUNCS || defined(PHP_WIN32) */ /* Note: These functions are defined in ext/standard/dns_win32.c for Windows! */ -#if !defined(PHP_WIN32) && HAVE_DNS_SEARCH_FUNC +#if !defined(PHP_WIN32) && defined(HAVE_DNS_SEARCH_FUNC) #ifndef HFIXEDSZ #define HFIXEDSZ 12 /* fixed data in header */ @@ -454,7 +454,7 @@ PHP_FUNCTION(dns_check_record) } /* }}} */ -#if HAVE_FULL_DNS_FUNCS +#ifdef HAVE_FULL_DNS_FUNCS #define CHECKCP(n) do { \ if (cp + n > end) { \ @@ -1162,7 +1162,7 @@ PHP_FUNCTION(dns_get_mx) #endif /* HAVE_FULL_DNS_FUNCS */ #endif /* !defined(PHP_WIN32) && HAVE_DNS_SEARCH_FUNC */ -#if HAVE_FULL_DNS_FUNCS && !defined(PHP_WIN32) +#if defined(HAVE_FULL_DNS_FUNCS) && !defined(PHP_WIN32) PHP_MINIT_FUNCTION(dns) { REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_CS | CONST_PERSISTENT); diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 1831b8eaa54d7..1b1b0ab9e9ce1 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -26,23 +26,23 @@ #include "php_globals.h" #include "SAPI.h" -#if HAVE_SYS_WAIT_H +#ifdef HAVE_SYS_WAIT_H #include #endif #include -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H #include #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H #include #endif -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/file.c b/ext/standard/file.c index 4c31ee0eae661..628b8dc8f0fe1 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -65,7 +65,7 @@ #include "php_string.h" #include "file.h" -#if HAVE_PWD_H +#ifdef HAVE_PWD_H # ifdef PHP_WIN32 # include "win32/pwd.h" # else @@ -246,7 +246,7 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_PF_INET", AF_INET, CONST_CS|CONST_PERSISTENT); #endif -#if HAVE_IPV6 +#ifdef HAVE_IPV6 # ifdef PF_INET6 REGISTER_LONG_CONSTANT("STREAM_PF_INET6", PF_INET6, CONST_CS|CONST_PERSISTENT); # elif defined(AF_INET6) diff --git a/ext/standard/file.h b/ext/standard/file.h index be7e3cf8e6d02..7fe9c4738faa6 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -96,7 +96,7 @@ typedef struct { HashTable *stream_filters; /* per-request copy of stream_filters_hash */ HashTable *wrapper_errors; /* key: wrapper address; value: linked list of char* */ int pclose_wait; -#if defined(HAVE_GETHOSTBYNAME_R) +#ifdef HAVE_GETHOSTBYNAME_R struct hostent tmp_host_info; char *tmp_host_buf; size_t tmp_host_buf_len; diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 2937f6a6da18a..a11ecf09f8f13 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -25,15 +25,15 @@ #include #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H # include #endif -#if HAVE_SYS_PARAM_H +#ifdef HAVE_SYS_PARAM_H # include #endif -#if HAVE_SYS_VFS_H +#ifdef HAVE_SYS_VFS_H # include #endif @@ -60,7 +60,7 @@ # include #endif -#if HAVE_PWD_H +#ifdef HAVE_PWD_H # ifdef PHP_WIN32 # include "win32/pwd.h" # else @@ -72,7 +72,7 @@ # include #endif -#if HAVE_UTIME +#ifdef HAVE_UTIME # ifdef PHP_WIN32 # include # else @@ -373,7 +373,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ RETURN_FALSE; } } else { -#if !defined(WINDOWS) +#ifndef WINDOWS /* On Windows, we expect regular chgrp to fail silently by default */ php_error_docref(NULL, E_WARNING, "Cannot call chgrp() for a non-standard stream"); #endif @@ -381,7 +381,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ } } -#if defined(WINDOWS) +#ifdef WINDOWS /* We have no native chgrp on Windows, nothing left to do if stream doesn't have own implementation */ RETURN_FALSE; #else @@ -400,7 +400,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ } if (do_lchgrp) { -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN ret = VCWD_LCHOWN(filename, -1, gid); #endif } else { @@ -423,7 +423,7 @@ PHP_FUNCTION(chgrp) /* }}} */ /* {{{ Change symlink group */ -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN PHP_FUNCTION(lchgrp) { php_do_chgrp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); @@ -499,7 +499,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ RETURN_FALSE; } } else { -#if !defined(WINDOWS) +#ifndef WINDOWS /* On Windows, we expect regular chown to fail silently by default */ php_error_docref(NULL, E_WARNING, "Cannot call chown() for a non-standard stream"); #endif @@ -507,7 +507,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ } } -#if defined(WINDOWS) +#ifdef WINDOWS /* We have no native chown on Windows, nothing left to do if stream doesn't have own implementation */ RETURN_FALSE; #else @@ -527,7 +527,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ } if (do_lchown) { -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN ret = VCWD_LCHOWN(filename, uid, -1); #endif } else { @@ -551,7 +551,7 @@ PHP_FUNCTION(chown) /* }}} */ /* {{{ Change file owner */ -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN PHP_FUNCTION(lchown) { RETVAL_TRUE; @@ -605,7 +605,7 @@ PHP_FUNCTION(chmod) } /* }}} */ -#if HAVE_UTIME +#ifdef HAVE_UTIME /* {{{ Set modification time of file */ PHP_FUNCTION(touch) { diff --git a/ext/standard/flock_compat.c b/ext/standard/flock_compat.c index 6b4fa3dcedb0a..8622ec1aeca98 100644 --- a/ext/standard/flock_compat.c +++ b/ext/standard/flock_compat.c @@ -26,7 +26,7 @@ PHPAPI int flock(int fd, int operation) #endif /* !defined(HAVE_FLOCK) */ PHPAPI int php_flock(int fd, int operation) -#if HAVE_STRUCT_FLOCK /* {{{ */ +#ifdef HAVE_STRUCT_FLOCK /* {{{ */ { struct flock flck; int ret; @@ -151,7 +151,7 @@ PHPAPI int php_flock(int fd, int operation) #endif #ifndef PHP_WIN32 -#if !(HAVE_INET_ATON) +#ifndef HAVE_INET_ATON /* {{{ inet_aton * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. diff --git a/ext/standard/flock_compat.h b/ext/standard/flock_compat.h index 983b36a8457fd..a55c3af9ca8f7 100644 --- a/ext/standard/flock_compat.h +++ b/ext/standard/flock_compat.h @@ -17,7 +17,7 @@ #ifndef FLOCK_COMPAT_H #define FLOCK_COMPAT_H -#if HAVE_STRUCT_FLOCK +#ifdef HAVE_STRUCT_FLOCK #include #include #include @@ -57,17 +57,16 @@ PHPAPI int flock(int fd, int operation); # define ftruncate(a, b) chsize(a, b) #endif /* defined(PHP_WIN32) */ -#if !HAVE_INET_ATON -#if HAVE_NETINET_IN_H -#include -#endif -#if HAVE_ARPA_INET_H -#include -#endif - -#ifndef PHP_WIN32 +#ifndef HAVE_INET_ATON +# ifdef HAVE_NETINET_IN_H +# include +# endif +# ifdef HAVE_ARPA_INET_H +# include +# endif +# ifndef PHP_WIN32 extern int inet_aton(const char *, struct in_addr *); -#endif +# endif #endif #endif /* FLOCK_COMPAT_H */ diff --git a/ext/standard/ftok.c b/ext/standard/ftok.c index 171e54f499e87..1a046b3de6979 100644 --- a/ext/standard/ftok.c +++ b/ext/standard/ftok.c @@ -26,7 +26,7 @@ #include "win32/ipc.h" #endif -#if HAVE_FTOK +#ifdef HAVE_FTOK /* {{{ Convert a pathname and a project identifier to a System V IPC key */ PHP_FUNCTION(ftok) { diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c index f20f4245bd469..0be729a59fddb 100644 --- a/ext/standard/ftp_fopen_wrapper.c +++ b/ext/standard/ftp_fopen_wrapper.c @@ -40,7 +40,7 @@ #include "php_standard.h" #include -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -49,7 +49,7 @@ #else #include #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #endif diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c index 5d72e021c12c6..7dca135c920aa 100644 --- a/ext/standard/hrtime.c +++ b/ext/standard/hrtime.c @@ -134,7 +134,7 @@ static zend_always_inline php_hrtime_t _timer_current(void) #endif }/*}}}*/ -#if ZEND_ENABLE_ZVAL_LONG64 +#ifdef ZEND_ENABLE_ZVAL_LONG64 #define PHP_RETURN_HRTIME(t) RETURN_LONG((zend_long)t) #else #ifdef _WIN32 diff --git a/ext/standard/html.c b/ext/standard/html.c index 779fe549599bf..d3736daf3bd61 100644 --- a/ext/standard/html.c +++ b/ext/standard/html.c @@ -44,7 +44,7 @@ #include "php_string.h" #include "SAPI.h" #include -#if HAVE_LANGINFO_H +#ifdef HAVE_LANGINFO_H #include #endif diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index b5132d9e005a3..099a5241ab58e 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -43,7 +43,7 @@ #include "php_standard.h" #include -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -52,7 +52,7 @@ #else #include #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #endif diff --git a/ext/standard/image.c b/ext/standard/image.c index a614521ae1091..831cd8a28bc1f 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -17,18 +17,18 @@ #include "php.h" #include -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif #include "fopen_wrappers.h" #include "ext/standard/fsock.h" #include "libavifinfo/avifinfo.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #include "php_image.h" -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) #include "zlib.h" #endif @@ -80,7 +80,7 @@ PHP_MINIT_FUNCTION(imagetypes) REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_CS | CONST_PERSISTENT); -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_CS | CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_CS | CONST_PERSISTENT); @@ -188,7 +188,7 @@ static unsigned long int php_swf_get_bits (unsigned char* buffer, unsigned int p } /* }}} */ -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) /* {{{ php_handle_swc */ static struct gfxinfo *php_handle_swc(php_stream * stream) { @@ -619,7 +619,7 @@ static struct gfxinfo *php_handle_jpc(php_stream * stream) result->width = php_read4(stream); /* Xsiz */ result->height = php_read4(stream); /* Ysiz */ -#if MBO_0 +#ifdef MBO_0 php_read4(stream); /* XOsiz */ php_read4(stream); /* YOsiz */ php_read4(stream); /* XTsiz */ @@ -1486,7 +1486,7 @@ static void php_getimagesize_from_stream(php_stream *stream, char *input, zval * result = php_handle_swf(stream); break; case IMAGE_FILETYPE_SWC: -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) result = php_handle_swc(stream); #else php_error_docref(NULL, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled"); diff --git a/ext/standard/info.c b/ext/standard/info.c index 5ac6ccb00ee96..acd1a1b36cfce 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -893,13 +893,13 @@ PHPAPI ZEND_COLD void php_print_info(int flag) efree(descr); } -#if HAVE_IPV6 +#ifdef HAVE_IPV6 php_info_print_table_row(2, "IPv6 Support", "enabled" ); #else php_info_print_table_row(2, "IPv6 Support", "disabled" ); #endif -#if HAVE_DTRACE +#ifdef HAVE_DTRACE php_info_print_table_row(2, "DTrace Support", (zend_dtrace_enabled ? "enabled" : "available, disabled")); #else php_info_print_table_row(2, "DTrace Support", "disabled" ); diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c index 9030b360ae85e..397844844e345 100644 --- a/ext/standard/lcg.c +++ b/ext/standard/lcg.c @@ -17,7 +17,7 @@ #include "php.h" #include "php_lcg.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/link.c b/ext/standard/link.c index eae0929af0037..2f29b5bcc0288 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -25,14 +25,14 @@ #endif #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #ifndef PHP_WIN32 #include #endif #include -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 003fad3ea18c5..55790e6100fce 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -25,15 +25,15 @@ #include "ext/date/php_date.h" #include "zend_smart_str.h" -#if HAVE_SYSEXITS_H -#include +#ifdef HAVE_SYSEXITS_H +# include #endif -#if HAVE_SYS_SYSEXITS_H -#include +#ifdef HAVE_SYS_SYSEXITS_H +# include #endif #if PHP_SIGCHILD -#include +# include #endif #include "php_syslog.h" @@ -43,7 +43,7 @@ #include "exec.h" #ifdef PHP_WIN32 -#include "win32/sendmail.h" +# include "win32/sendmail.h" #endif #define SKIP_LONG_HEADER_SEP(str, pos) \ diff --git a/ext/standard/net.c b/ext/standard/net.c index f8e934d5393cc..b22f304c8eb33 100644 --- a/ext/standard/net.c +++ b/ext/standard/net.c @@ -17,15 +17,15 @@ #include "php.h" #include "php_network.h" -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H # include #endif -#if HAVE_NET_IF_H +#ifdef HAVE_NET_IF_H # include #endif -#if HAVE_GETIFADDRS +#ifdef HAVE_GETIFADDRS # include #elif defined(__PASE__) /* IBM i implements getifaddrs, but under its own name */ @@ -53,7 +53,7 @@ PHPAPI zend_string* php_inet_ntop(const struct sockaddr *addr) { if (!addr) { return NULL; } /* Prefer inet_ntop() as it's more task-specific and doesn't have to be demangled */ -#if HAVE_INET_NTOP +#ifdef HAVE_INET_NTOP switch (addr->sa_family) { #ifdef AF_INET6 case AF_INET6: { @@ -102,7 +102,7 @@ PHPAPI zend_string* php_inet_ntop(const struct sockaddr *addr) { return NULL; } -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if defined(PHP_WIN32) || defined(HAVE_GETIFADDRS) || defined(__PASE__) static void iface_append_unicast(zval *unicast, zend_long flags, struct sockaddr *addr, struct sockaddr *netmask, struct sockaddr *broadcast, struct sockaddr *ptp) { diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 8736d291fb246..a58925219482e 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -31,7 +31,7 @@ #include "ext/standard/head.h" #include "php_string.h" #include "pack.h" -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else @@ -39,7 +39,7 @@ #endif #endif #include "fsock.h" -#if HAVE_NETINET_IN_H +#ifdef HAVE_NETINET_IN_H #include #endif diff --git a/ext/standard/pageinfo.c b/ext/standard/pageinfo.c index 06867fbda5ab7..8e15d2b06c35e 100644 --- a/ext/standard/pageinfo.c +++ b/ext/standard/pageinfo.c @@ -20,7 +20,7 @@ #include #include -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else @@ -36,7 +36,7 @@ #define getgid() 1 #define getuid() 1 #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #include diff --git a/ext/standard/password.c b/ext/standard/password.c index 98b27ff34bd0c..96b74aa39554f 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -27,7 +27,7 @@ #include "zend_interfaces.h" #include "info.h" #include "php_random.h" -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB #include "argon2.h" #endif @@ -231,7 +231,7 @@ const php_password_algo php_password_algo_bcrypt = { }; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB /* argon2i/argon2id shared implementation */ static int extract_argon2_parameters(const zend_string *hash, @@ -427,7 +427,7 @@ PHP_MINIT_FUNCTION(password) /* {{{ */ } REGISTER_STRING_CONSTANT("PASSWORD_BCRYPT", "2y", CONST_CS | CONST_PERSISTENT); -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB if (FAILURE == php_password_algo_register("argon2i", &php_password_algo_argon2i)) { return FAILURE; } @@ -440,7 +440,7 @@ PHP_MINIT_FUNCTION(password) /* {{{ */ #endif REGISTER_LONG_CONSTANT("PASSWORD_BCRYPT_DEFAULT_COST", PHP_PASSWORD_BCRYPT_COST, CONST_CS | CONST_PERSISTENT); -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_MEMORY_COST", PHP_PASSWORD_ARGON2_MEMORY_COST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_TIME_COST", PHP_PASSWORD_ARGON2_TIME_COST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_THREADS", PHP_PASSWORD_ARGON2_THREADS, CONST_CS | CONST_PERSISTENT); @@ -495,7 +495,7 @@ static const php_password_algo* php_password_algo_find_zval(zend_string *arg_str switch (arg_long) { case 0: return php_password_algo_default(); case 1: return &php_password_algo_bcrypt; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB case 2: return &php_password_algo_argon2i; case 3: return &php_password_algo_argon2id; #else diff --git a/ext/standard/php_dns.h b/ext/standard/php_dns.h index 0d56633530bd2..53fbc76514f53 100644 --- a/ext/standard/php_dns.h +++ b/ext/standard/php_dns.h @@ -29,7 +29,7 @@ #elif defined(HAVE_RES_NSEARCH) #define php_dns_search(res, dname, class, type, answer, anslen) \ res_nsearch(res, dname, class, type, answer, anslen); -#if HAVE_RES_NDESTROY +#ifdef HAVE_RES_NDESTROY #define php_dns_free_handle(res) \ res_ndestroy(res); \ php_dns_free_res(res) @@ -52,12 +52,12 @@ #define HAVE_DNS_SEARCH_FUNC 1 #endif -#if HAVE_DNS_SEARCH_FUNC && HAVE_DN_EXPAND && HAVE_DN_SKIPNAME +#if defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_DN_EXPAND) && defined(HAVE_DN_SKIPNAME) #define HAVE_FULL_DNS_FUNCS 1 #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC -# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) PHP_MINIT_FUNCTION(dns); # endif #endif /* defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC */ diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 4287045511e86..0353c8efae674 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -18,8 +18,8 @@ #include #include -#if HAVE_UNISTD_H -#include +#ifdef HAVE_UNISTD_H +# include #endif #include "php.h" @@ -317,7 +317,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa return NULL; } -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H dtablesize = getdtablesize(); #else dtablesize = INT_MAX; diff --git a/ext/standard/php_password.h b/ext/standard/php_password.h index 600086cc5a2d7..50f330d3d6ce8 100644 --- a/ext/standard/php_password.h +++ b/ext/standard/php_password.h @@ -24,7 +24,7 @@ PHP_MSHUTDOWN_FUNCTION(password); #define PHP_PASSWORD_DEFAULT PHP_PASSWORD_BCRYPT #define PHP_PASSWORD_BCRYPT_COST 10 -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB /** * When updating these values, synchronize ext/sodium/sodium_pwhash.c values. * Note that libargon expresses memlimit in KB, while libsoidum uses bytes. @@ -44,7 +44,7 @@ typedef struct _php_password_algo { } php_password_algo; extern const php_password_algo php_password_algo_bcrypt; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB extern const php_password_algo php_password_algo_argon2i; extern const php_password_algo php_password_algo_argon2id; #endif diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 0f31ff1e42827..d0c40817fa33f 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -18,14 +18,14 @@ #ifndef PHP_STRING_H #define PHP_STRING_H -#if defined(ZTS) +#ifdef ZTS PHP_MINIT_FUNCTION(localeconv); PHP_MSHUTDOWN_FUNCTION(localeconv); #endif -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO PHP_MINIT_FUNCTION(nl_langinfo); #endif -#if ZEND_INTRIN_SSE4_2_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_FUNC_PTR PHP_MINIT_FUNCTION(string_intrin); #endif @@ -59,7 +59,7 @@ PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return PHPAPI size_t php_strspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); -#if defined(_REENTRANT) +#ifdef _REENTRANT # ifdef PHP_WIN32 # include # endif diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index a57e66bd97954..53ec6faa1019e 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -28,11 +28,11 @@ #include "main/php_network.h" #include "zend_smart_str.h" -#if HAVE_SYS_WAIT_H +#ifdef HAVE_SYS_WAIT_H #include #endif -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif @@ -42,8 +42,8 @@ * around the alternate code. */ #ifdef PHP_CAN_SUPPORT_PROC_OPEN -#if HAVE_OPENPTY -# if HAVE_PTY_H +#ifdef HAVE_OPENPTY +# ifdef HAVE_PTY_H # include # elif defined(__FreeBSD__) /* FreeBSD defines `openpty` in */ @@ -680,7 +680,7 @@ static zend_result set_proc_descriptor_to_blackhole(descriptorspec_item *desc) static zend_result set_proc_descriptor_to_pty(descriptorspec_item *desc, int *master_fd, int *slave_fd) { -#if HAVE_OPENPTY +#ifdef HAVE_OPENPTY /* All FDs set to PTY in the child process will go to the slave end of the same PTY. * Likewise, all the corresponding entries in `$pipes` in the parent will all go to the master * end of the same PTY. @@ -728,7 +728,7 @@ static zend_result set_proc_descriptor_to_pipe(descriptorspec_item *desc, zend_s desc->type = DESCRIPTOR_TYPE_PIPE; - if (strncmp(ZSTR_VAL(zmode), "w", 1) != 0) { + if (!zend_string_starts_with_literal(zmode, "w")) { desc->parentend = newpipe[1]; desc->childend = newpipe[0]; desc->mode_flags = O_WRONLY; @@ -1318,7 +1318,7 @@ PHP_FUNCTION(proc_open) #else efree_argv(argv); #endif -#if HAVE_OPENPTY +#ifdef HAVE_OPENPTY if (pty_master_fd != -1) { close(pty_master_fd); } diff --git a/ext/standard/random.c b/ext/standard/random.c index d6140ffd2ae25..bea2a474d4408 100644 --- a/ext/standard/random.c +++ b/ext/standard/random.c @@ -147,7 +147,7 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, bool should_throw) struct stat st; if (fd < 0) { -#if HAVE_DEV_URANDOM +#ifdef HAVE_DEV_URANDOM fd = open("/dev/urandom", O_RDONLY); #endif if (fd < 0) { diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 419b49e586f71..49daae56b5ea6 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -26,7 +26,7 @@ #include "streamsfuncs.h" #include "php_network.h" #include "php_string.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif @@ -46,7 +46,7 @@ static php_stream_context *decode_context_param(zval *contextresource); /* Streams based network functions */ -#if HAVE_SOCKETPAIR +#ifdef HAVE_SOCKETPAIR /* {{{ Creates a pair of connected, indistinguishable socket streams */ PHP_FUNCTION(stream_socket_pair) { @@ -1343,7 +1343,7 @@ PHP_FUNCTION(stream_set_blocking) /* }}} */ /* {{{ Set timeout on stream read to seconds + microseonds */ -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) PHP_FUNCTION(stream_set_timeout) { zval *socket; diff --git a/ext/standard/string.c b/ext/standard/string.c index 593c67cb32248..59f633fd18587 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -320,7 +320,7 @@ PHP_FUNCTION(strcspn) /* }}} */ /* {{{ PHP_MINIT_FUNCTION(nl_langinfo) */ -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO PHP_MINIT_FUNCTION(nl_langinfo) { #define REGISTER_NL_LANGINFO_CONSTANT(x) REGISTER_LONG_CONSTANT(#x, x, CONST_CS | CONST_PERSISTENT) @@ -1429,7 +1429,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, /* Strip trailing slashes */ while (basename_end >= s -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 && (*basename_end == '/' || *basename_end == '\\' || (*basename_end == ':' @@ -1447,7 +1447,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, basename_start = basename_end; basename_end++; while (basename_start > s -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 && *(basename_start-1) != '/' && *(basename_start-1) != '\\') { @@ -1474,7 +1474,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, case 0: goto quit_loop; case 1: -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 if (*s == '/' || *s == '\\') { #else if (*s == '/') { @@ -1483,7 +1483,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, state = 0; basename_end = s; } -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 /* Catch relative paths in c:file.txt style. They're not to confuse with the NTFS streams. This part ensures also, that no drive letter traversing happens. */ @@ -1810,11 +1810,7 @@ PHP_FUNCTION(str_starts_with) Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); - if (ZSTR_LEN(needle) > ZSTR_LEN(haystack)) { - RETURN_FALSE; - } - - RETURN_BOOL(memcmp(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(needle)) == 0); + RETURN_BOOL(zend_string_starts_with(haystack, needle)); } /* }}} */ @@ -3348,7 +3344,7 @@ PHP_FUNCTION(strtr) /* }}} */ /* {{{ Reverse a string */ -#if ZEND_INTRIN_SSSE3_NATIVE +#ifdef ZEND_INTRIN_SSSE3_NATIVE #include #elif defined(__aarch64__) #include @@ -3370,7 +3366,7 @@ PHP_FUNCTION(strrev) s = ZSTR_VAL(str); e = s + ZSTR_LEN(str); --e; -#if ZEND_INTRIN_SSSE3_NATIVE +#ifdef ZEND_INTRIN_SSSE3_NATIVE if (e - s > 15) { const __m128i map = _mm_set_epi8( 0, 1, 2, 3, @@ -3668,10 +3664,10 @@ PHPAPI zend_string *php_addcslashes(zend_string *str, const char *what, size_t w /* {{{ php_addslashes */ -#if ZEND_INTRIN_SSE4_2_NATIVE +#ifdef ZEND_INTRIN_SSE4_2_NATIVE # include # include "Zend/zend_bitset.h" -#elif ZEND_INTRIN_SSE4_2_RESOLVER +#elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) # include # include "Zend/zend_bitset.h" # include "Zend/zend_cpuinfo.h" @@ -3682,7 +3678,7 @@ zend_string *php_addslashes_default(zend_string *str); ZEND_INTRIN_SSE4_2_FUNC_DECL(void php_stripslashes_sse42(zend_string *str)); void php_stripslashes_default(zend_string *str); -# if ZEND_INTRIN_SSE4_2_FUNC_PROTO +# ifdef ZEND_INTRIN_SSE4_2_FUNC_PROTO PHPAPI zend_string *php_addslashes(zend_string *str) __attribute__((ifunc("resolve_addslashes"))); PHPAPI void php_stripslashes(zend_string *str) __attribute__((ifunc("resolve_stripslashes"))); @@ -3734,10 +3730,10 @@ PHP_MINIT_FUNCTION(string_intrin) # endif #endif -#if ZEND_INTRIN_SSE4_2_NATIVE || ZEND_INTRIN_SSE4_2_RESOLVER -# if ZEND_INTRIN_SSE4_2_NATIVE +#if defined(ZEND_INTRIN_SSE4_2_NATIVE) || defined(ZEND_INTRIN_SSE4_2_RESOLVER) +# ifdef ZEND_INTRIN_SSE4_2_NATIVE PHPAPI zend_string *php_addslashes(zend_string *str) /* {{{ */ -# elif ZEND_INTRIN_SSE4_2_RESOLVER +# elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) zend_string *php_addslashes_sse42(zend_string *str) # endif { @@ -3914,8 +3910,8 @@ static zend_always_inline char *aarch64_add_slashes(quad_word res, const char *s } #endif /* __aarch64__ */ -#if !ZEND_INTRIN_SSE4_2_NATIVE -# if ZEND_INTRIN_SSE4_2_RESOLVER +#ifndef ZEND_INTRIN_SSE4_2_NATIVE +# ifdef ZEND_INTRIN_SSE4_2_RESOLVER zend_string *php_addslashes_default(zend_string *str) /* {{{ */ # else PHPAPI zend_string *php_addslashes(zend_string *str) @@ -4076,10 +4072,10 @@ static zend_always_inline char *php_stripslashes_impl(const char *str, char *out return out; } -#if ZEND_INTRIN_SSE4_2_NATIVE || ZEND_INTRIN_SSE4_2_RESOLVER -# if ZEND_INTRIN_SSE4_2_NATIVE +#if defined(ZEND_INTRIN_SSE4_2_NATIVE) || defined(ZEND_INTRIN_SSE4_2_RESOLVER) +# ifdef ZEND_INTRIN_SSE4_2_NATIVE PHPAPI void php_stripslashes(zend_string *str) -# elif ZEND_INTRIN_SSE4_2_RESOLVER +# elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) void php_stripslashes_sse42(zend_string *str) # endif { @@ -4134,8 +4130,8 @@ void php_stripslashes_sse42(zend_string *str) } #endif -#if !ZEND_INTRIN_SSE4_2_NATIVE -# if ZEND_INTRIN_SSE4_2_RESOLVER +#ifndef ZEND_INTRIN_SSE4_2_NATIVE +# ifdef ZEND_INTRIN_SSE4_2_RESOLVER void php_stripslashes_default(zend_string *str) /* {{{ */ # else PHPAPI void php_stripslashes(zend_string *str) @@ -4738,14 +4734,14 @@ static zend_string *try_setlocale_str(zend_long cat, zend_string *loc) { /* C locale is represented as NULL. */ BG(ctype_string) = NULL; return ZSTR_CHAR('C'); - } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) { + } else if (zend_string_equals_cstr(loc, retval, len)) { BG(ctype_string) = zend_string_copy(loc); return zend_string_copy(BG(ctype_string)); } else { BG(ctype_string) = zend_string_init(retval, len, 0); return zend_string_copy(BG(ctype_string)); } - } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) { + } else if (zend_string_equals_cstr(loc, retval, len)) { return zend_string_copy(loc); } } diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c index d2cfcab9deda0..d16a3c90bb8ab 100644 --- a/ext/standard/syslog.c +++ b/ext/standard/syslog.c @@ -21,7 +21,7 @@ #include "zend_globals.h" #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c index 04f81deeb2d91..a28f30e969a14 100644 --- a/ext/standard/uniqid.c +++ b/ext/standard/uniqid.c @@ -17,7 +17,7 @@ #include "php.h" #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re index bac49206e63e8..8e5b43467fc88 100644 --- a/ext/standard/url_scanner_ex.re +++ b/ext/standard/url_scanner_ex.re @@ -333,7 +333,7 @@ enum { #define STD_PARA url_adapt_state_ex_t *ctx, char *start, char *YYCURSOR #define STD_ARGS ctx, start, xp -#if SCANNER_DEBUG +#ifdef SCANNER_DEBUG #define scdebug(x) printf x #else #define scdebug(x) diff --git a/main/main.c b/main/main.c index 2a417987f3148..dc705fcdbdfe9 100644 --- a/main/main.c +++ b/main/main.c @@ -2489,7 +2489,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file) #ifdef PHP_WIN32 if(primary_file->filename) { - UpdateIniFromRegistry((char*)primary_file->filename); + UpdateIniFromRegistry(ZSTR_VAL(primary_file->filename)); } #endif @@ -2581,7 +2581,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval *ret) zend_try { #ifdef PHP_WIN32 if(primary_file->filename) { - UpdateIniFromRegistry((char*)primary_file->filename); + UpdateIniFromRegistry(ZSTR_VAL(primary_file->filename)); } #endif diff --git a/main/output.c b/main/output.c index 3e29f8f152673..7b5bc49dab87e 100644 --- a/main/output.c +++ b/main/output.c @@ -584,7 +584,7 @@ PHPAPI int php_output_handler_started(const char *name, size_t name_len) handlers = (php_output_handler **) zend_stack_base(&OG(handlers)); for (i = 0; i < count; ++i) { - if (name_len == ZSTR_LEN(handlers[i]->name) && !memcmp(ZSTR_VAL(handlers[i]->name), name, name_len)) { + if (zend_string_equals_cstr(handlers[i]->name, name, name_len)) { return 1; } } diff --git a/main/php_variables.c b/main/php_variables.c index 0261cf0098ee4..812b46bc9c73a 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -702,8 +702,7 @@ static void php_autoglobal_merge(HashTable *dest, HashTable *src) || Z_TYPE_P(dest_entry) != IS_ARRAY) { Z_TRY_ADDREF_P(src_entry); if (string_key) { - if (!globals_check || ZSTR_LEN(string_key) != sizeof("GLOBALS") - 1 - || memcmp(ZSTR_VAL(string_key), "GLOBALS", sizeof("GLOBALS") - 1)) { + if (!globals_check || !zend_string_equals_literal(string_key, "GLOBALS")) { zend_hash_update(dest, string_key, src_entry); } else { Z_TRY_DELREF_P(src_entry); diff --git a/run-tests.php b/run-tests.php index 36ed068d0eac9..964b7c117592b 100755 --- a/run-tests.php +++ b/run-tests.php @@ -103,12 +103,12 @@ function show_usage(): void Do not delete 'all' files, 'php' test file, 'skip' or 'clean' file. - --set-timeout [n] - Set timeout for individual tests, where [n] is the number of + --set-timeout + Set timeout for individual tests, where is the number of seconds. The default value is 60 seconds, or 300 seconds when testing for memory leaks. - --context [n] + --context Sets the number of lines of surrounding context to print for diffs. The default value is 3. @@ -119,8 +119,8 @@ function show_usage(): void 'mem'. The result types get written independent of the log format, however 'diff' only exists when a test fails. - --show-slow [n] - Show all tests that took longer than [n] milliseconds to run. + --show-slow + Show all tests that took longer than milliseconds to run. --no-clean Do not execute clean section if any. @@ -530,7 +530,11 @@ function main(): void $just_save_results = true; break; case '--set-timeout': - $environment['TEST_TIMEOUT'] = $argv[++$i]; + $timeout = $argv[++$i] ?? ''; + if (!preg_match('/^\d+$/', $timeout)) { + error("'$timeout' is not a valid number of seconds, try e.g. --set-timeout 60 for 1 minute"); + } + $environment['TEST_TIMEOUT'] = intval($timeout, 10); break; case '--context': $context_line_count = $argv[++$i] ?? ''; @@ -545,7 +549,11 @@ function main(): void } break; case '--show-slow': - $slow_min_ms = $argv[++$i]; + $slow_min_ms = $argv[++$i] ?? ''; + if (!preg_match('/^\d+$/', $slow_min_ms)) { + error("'$slow_min_ms' is not a valid number of milliseconds, try e.g. --show-slow 1000 for 1 second"); + } + $slow_min_ms = intval($slow_min_ms, 10); break; case '--temp-source': $temp_source = $argv[++$i]; diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index e2e4d3660be42..4e3815ffc2543 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -563,6 +563,12 @@ if test "$PHP_FPM" != "no"; then [no], [no]) + PHP_ARG_WITH([fpm-selinux],, + [AS_HELP_STRING([--with-fpm-selinux], + [Support SELinux policy library])], + [no], + [no]) + if test "$PHP_FPM_SYSTEMD" != "no" ; then PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 209]) @@ -605,6 +611,14 @@ if test "$PHP_FPM" != "no"; then ]) fi + if test "x$PHP_FPM_SELINUX" != "xno" ; then + AC_CHECK_HEADERS([selinux/selinux.h]) + AC_CHECK_LIB(selinux, security_setenforce, [ + PHP_ADD_LIBRARY(selinux) + AC_DEFINE(HAVE_SELINUX, 1, [ SElinux available ]) + ],[]) + fi + PHP_SUBST_OLD(php_fpm_systemd) AC_DEFINE_UNQUOTED(PHP_FPM_SYSTEMD, "$php_fpm_systemd", [fpm systemd service type]) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 9514979ac1ce2..003c62b7d05df 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -334,7 +334,7 @@ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* port_str = dup_address; } - if (port == 0) { + if (port < 1 || port > 65535) { zlog(ZLOG_ERROR, "invalid port value '%s'", port_str); free(dup_address); return -1; diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c index 2f6eef339c493..9c94fa1eae038 100644 --- a/sapi/fpm/fpm/fpm_unix.c +++ b/sapi/fpm/fpm/fpm_unix.c @@ -31,6 +31,10 @@ #include #endif +#ifdef HAVE_SELINUX +#include +#endif + #include "fpm.h" #include "fpm_conf.h" #include "fpm_cleanup.h" @@ -412,8 +416,17 @@ int fpm_unix_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ } #ifdef HAVE_PRCTL - if (wp->config->process_dumpable && 0 > prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)) { - zlog(ZLOG_SYSERROR, "[pool %s] failed to prctl(PR_SET_DUMPABLE)", wp->config->name); + if (wp->config->process_dumpable) { + int dumpable = 1; +#ifdef HAVE_SELINUX + if (security_get_boolean_active("deny_ptrace") == 1) { + zlog(ZLOG_SYSERROR, "[pool %s] ptrace is denied", wp->config->name); + dumpable = 0; + } +#endif + if (dumpable && 0 > prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)) { + zlog(ZLOG_SYSERROR, "[pool %s] failed to prctl(PR_SET_DUMPABLE)", wp->config->name); + } } #endif diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index 6525c1eadad64..6a42412440193 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -77,6 +77,8 @@ Show compiled in modules .PD 1 .B \-v Version number +.TP +.PD 0 .B \-\-prefix \fIpath\fP .TP .PD 1 diff --git a/sapi/fpm/tests/log-invalid-port.phpt b/sapi/fpm/tests/log-invalid-port.phpt new file mode 100644 index 0000000000000..361700378eb1a --- /dev/null +++ b/sapi/fpm/tests/log-invalid-port.phpt @@ -0,0 +1,36 @@ +--TEST-- +FPM: test invalid port value +--SKIPIF-- + +--FILE-- +start(); +$tester->expectLogError("invalid port value '69002'"); +$tester->terminate(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index ce4b71282e7a0..7686fb83a4a32 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -27,6 +27,10 @@ #define DEFAULT_SHORT_OPEN_TAG "1" /* Platform-Specific Configuration. Should not be changed. */ +/* Alignment for Zend memory allocator */ +#define ZEND_MM_ALIGNMENT (size_t)8 +#define ZEND_MM_ALIGNMENT_LOG2 (size_t)3 +#define ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT 0 #define PHP_SIGCHILD 0 #define HAVE_GETSERVBYNAME 1 #define HAVE_GETSERVBYPORT 1