From 17d854cb73f61a09d3563c2dea84c083f48d90d8 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 10 Sep 2021 16:24:37 +0200 Subject: add upstream patch for PHP 8.1 --- php-pecl-rar.spec | 15 +++++- rar-php81.patch | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 rar-php81.patch diff --git a/php-pecl-rar.spec b/php-pecl-rar.spec index e879586..669d5c7 100644 --- a/php-pecl-rar.spec +++ b/php-pecl-rar.spec @@ -1,6 +1,6 @@ # spec file for php-pecl-rar # -# Copyright (c) 2013-2020 Remi Collet +# Copyright (c) 2013-2021 Remi Collet # License: CC-BY-SA # http://creativecommons.org/licenses/by-sa/4.0/ # @@ -19,12 +19,15 @@ Summary: PHP extension for reading RAR archives Name: %{?scl_prefix}php-pecl-%{pecl_name} Version: 4.2.0 -Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} +Release: 2%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')} License: PHP and Freeware with further limitations Group: Development/Languages URL: https://pecl.php.net/package/%{pecl_name} Source0: https://pecl.php.net/get/%{pecl_name}-%{version}.tgz +Patch0: %{pecl_name}-php81.patch + +BuildRequires: make BuildRequires: %{?dtsprefix}gcc BuildRequires: %{?scl_prefix}php-devel BuildRequires: %{?scl_prefix}php-pear @@ -53,6 +56,9 @@ Obsoletes: php74-pecl-%{pecl_name} <= %{version} %if "%{php_version}" > "8.0" Obsoletes: php80-pecl-%{pecl_name} <= %{version} %endif +%if "%{php_version}" > "8.1" +Obsoletes: php81-pecl-%{pecl_name} <= %{version} +%endif %endif @@ -74,6 +80,8 @@ sed -e 's/role="test"/role="src"/' \ -i package.xml cd NTS +%patch0 -p1 + # Sanity check, really often broken extver=$(sed -n '/#define PHP_RAR_VERSION/{s/.* "//;s/".*$//;p}' php_rar.h) if test "x${extver}" != "x%{version}%{?prever:-%{prever}}"; then @@ -206,6 +214,9 @@ REPORT_EXIT_STATUS=1 \ %changelog +* Fri Sep 10 2021 Remi Collet - 4.2.0-2 +- add upstream patch for PHP 8.1 + * Mon Dec 7 2020 Remi Collet - 4.2.0-1 - update to 4.2.0 diff --git a/rar-php81.patch b/rar-php81.patch new file mode 100644 index 0000000..4f4407b --- /dev/null +++ b/rar-php81.patch @@ -0,0 +1,152 @@ +From ab26d285759e4c917879967b09976a44829ed570 Mon Sep 17 00:00:00 2001 +From: Gustavo Lopes +Date: Mon, 16 Aug 2021 01:28:05 +0100 +Subject: [PATCH] Fixes for PHP 8.1 + +--- + rar_stream.c | 6 ++++++ + rararch.c | 8 +++++++- + rarentry.c | 26 +++++++++++++++----------- + tests/047.phpt | 6 +++--- + 4 files changed, 31 insertions(+), 15 deletions(-) + +diff --git a/rar_stream.c b/rar_stream.c +index 6fe207a..c6546a6 100644 +--- a/rar_stream.c ++++ b/rar_stream.c +@@ -784,7 +784,13 @@ static int _rar_get_archive_and_fragment(php_stream_wrapper *wrapper, + #if PHP_MAJOR_VERSION < 7 + *archive = zend_resolve_path(tmp_archive, tmp_arch_len TSRMLS_CC); + #else ++# if PHP_VERSION_ID < 80100 + zend_string *arc_str = zend_resolve_path(tmp_archive, tmp_arch_len); ++# else ++ zend_string *tmp_archive_str = zend_string_init_fast(tmp_archive, tmp_arch_len); ++ zend_string *arc_str = zend_resolve_path(tmp_archive_str); ++ zend_string_free(tmp_archive_str); ++# endif + if (arc_str != NULL) { + *archive = estrndup(arc_str->val, arc_str->len); + } else { +diff --git a/rararch.c b/rararch.c +index ed79f10..7cbfa26 100644 +--- a/rararch.c ++++ b/rararch.c +@@ -28,6 +28,7 @@ + /* $Id$ */ + + #include "zend_types.h" ++#include + #ifdef __cplusplus + extern "C" { + #endif +@@ -962,6 +963,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_rararchive_setallowbroken, 0, 0, 1) + ZEND_ARG_INFO(0, allow_broken) + ZEND_END_ARG_INFO() + ++#if PHP_MAJOR_VERSION >= 8 ++ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_rararchive_getiterator, 0, 0, Traversable, 0) ++ZEND_END_ARG_INFO() ++#endif ++ + ZEND_BEGIN_ARG_INFO(arginfo_rararchive_void, 0) + ZEND_END_ARG_INFO() + /* }}} */ +@@ -981,7 +987,7 @@ static zend_function_entry php_rararch_class_functions[] = { + PHP_ME(rararch, __toString, arginfo_rararchive_void, ZEND_ACC_PUBLIC) + PHP_ME_MAPPING(__construct, rar_bogus_ctor, arginfo_rararchive_void, ZEND_ACC_PRIVATE | ZEND_ACC_CTOR) + #if PHP_MAJOR_VERSION >= 8 +- PHP_ME(rararch, getIterator, arginfo_rararchive_void, ZEND_ACC_PUBLIC) ++ PHP_ME(rararch, getIterator, arginfo_rararchive_getiterator, ZEND_ACC_PUBLIC) + #endif + {NULL, NULL, NULL} + }; +diff --git a/rarentry.c b/rarentry.c +index 5943f38..5e680f6 100644 +--- a/rarentry.c ++++ b/rarentry.c +@@ -27,11 +27,10 @@ + + /* $Id$ */ + +-#ifdef __cplusplus +-extern "C" { ++#include ++#ifndef _GNU_SOURCE ++# define _GNU_SOURCE + #endif +- +-#define _GNU_SOURCE + #include + + #include +@@ -270,8 +269,8 @@ static void _rar_dos_date_to_text(unsigned dos_time, char *date_string) /* {{{ * + /* }}} */ + + /* {{{ Methods */ +-/* {{{ proto bool RarEntry::extract(string dir [, string filepath = '' +- [, string password = NULL [, bool extended_data = FALSE]]) ++/* {{{ public function extract(?string $dir, ?string $filepath = '', ++ ?string $password = null, bool $extended_data = false): void {} + Extract file from the archive */ + PHP_METHOD(rarentry, extract) + { /* lots of variables, but no need to be intimidated */ +@@ -298,7 +297,7 @@ PHP_METHOD(rarentry, extract) + * password that's different from the one stored in the rar_file_t object*/ + rar_cb_user_data cb_udata = {NULL}; + +- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ss!b", &dir, ++ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!|s!s!b", &dir, + &dir_len, &filepath, &filepath_len, &password, &password_len, + &process_ed) == FAILURE ) { + return; +@@ -714,12 +713,21 @@ PHP_METHOD(rarentry, __toString) + /* }}} */ + + /* {{{ arginfo */ ++#if PHP_MAJOR_VERSION < 8 + ZEND_BEGIN_ARG_INFO_EX(arginfo_rarentry_extract, 0, 0, 1) + ZEND_ARG_INFO(0, path) + ZEND_ARG_INFO(0, filename) + ZEND_ARG_INFO(0, password) + ZEND_ARG_INFO(0, extended_data) + ZEND_END_ARG_INFO() ++#else ++ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rarentry_extract, 0, 1, _IS_BOOL, 0) ++ ZEND_ARG_TYPE_INFO(0, dir, IS_STRING, 1) ++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filepath, IS_STRING, 1, "\'\'") ++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, password, IS_STRING, 1, "null") ++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, extended_data, _IS_BOOL, 0, "false") ++ZEND_END_ARG_INFO() ++#endif + + ZEND_BEGIN_ARG_INFO_EX(arginfo_rarentry_getstream, 0, 0, 0) + ZEND_ARG_INFO(0, password) +@@ -829,7 +837,3 @@ void minit_rarentry(TSRMLS_D) + REG_RAR_CLASS_CONST_LONG("ATTRIBUTE_UNIX_SYM_LINK", 0x0A000L); + REG_RAR_CLASS_CONST_LONG("ATTRIBUTE_UNIX_SOCKET", 0x0C000L); + } +- +-#ifdef __cplusplus +-} +-#endif +diff --git a/tests/047.phpt b/tests/047.phpt +index b1b5f53..8bd3e90 100644 +--- a/tests/047.phpt ++++ b/tests/047.phpt +@@ -10,9 +10,9 @@ function resolve($vol) { + else + return null; + } +-function int32_to_hex($value) { +- $value &= 0xffffffff; +- return str_pad(strtoupper(dechex($value)), 8, "0", STR_PAD_LEFT); ++function int32_to_hex($value) { ++ $value &= 0xffffffff; ++ return str_pad(strtoupper(dechex($value)), 8, "0", STR_PAD_LEFT); + } + echo "Fail:\n"; + $rar_file1 = rar_open(dirname(__FILE__).'/multi_broken.part1.rar'); +-- +2.31.1 + -- cgit