diff --git a/.gitignore b/.gitignore index fc341fe..3c76570 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -zip30.tar.gz +zcrypt29.tar.gz +zip231.tar.gz diff --git a/buffer_overflow.patch b/buffer_overflow.patch deleted file mode 100644 index 2ee3fff..0000000 --- a/buffer_overflow.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -urp zip30/fileio.c zip30/fileio.c ---- zip30/fileio.c 2008-05-29 03:13:24.000000000 +0300 -+++ zip30/fileio.c 2023-05-02 12:19:50.488314853 +0300 -@@ -3502,7 +3502,7 @@ zwchar *local_to_wide_string(local_strin - if ((wc_string = (wchar_t *)malloc((wsize + 1) * sizeof(wchar_t))) == NULL) { - ZIPERR(ZE_MEM, "local_to_wide_string"); - } -- wsize = mbstowcs(wc_string, local_string, strlen(local_string) + 1); -+ wsize = mbstowcs(wc_string, local_string, wsize + 1); - wc_string[wsize] = (wchar_t) 0; - - /* in case wchar_t is not zwchar */ diff --git a/exec-shield.patch b/exec-shield.patch new file mode 100644 index 0000000..3d2a1eb --- /dev/null +++ b/exec-shield.patch @@ -0,0 +1,19 @@ +diff -ur zip-2.3/crc_i386.S zip-2.3-lhh/crc_i386.S +--- zip-2.3/crc_i386.S 1999-10-09 16:10:26.000000000 -0400 ++++ zip-2.3-lhh/crc_i386.S 2003-10-24 16:15:52.000000000 -0400 +@@ -230,3 +230,6 @@ + #endif /* i386 || _i386 || _I386 || __i386 */ + + #endif /* !USE_ZLIB */ ++ ++.section .note.GNU-stack, "", @progbits ++.previous +diff -ur zip-2.3/match.S zip-2.3-lhh/match.S +--- zip-2.3/match.S 1999-07-27 17:18:14.000000000 -0400 ++++ zip-2.3-lhh/match.S 2003-10-24 16:15:38.000000000 -0400 +@@ -405,3 +405,5 @@ + #endif /* i386 || _I386 || _i386 || __i386 */ + + #endif /* !USE_ZLIB */ ++.section .note.GNU-stack, "", @progbits ++.previous diff --git a/man.patch b/man.patch deleted file mode 100644 index 9ba44c8..0000000 --- a/man.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- ./man/zipsplit.1 2008-05-08 10:17:48.000000000 +0200 -+++ ./man/zipsplit.1 2013-04-26 18:33:12.492008280 +0200 -@@ -12,6 +12,7 @@ - .RB [ \-r\ room ] - .RB [ \-b\ path ] - .RB [ \-h ] -+.RB [ \-q ] - .RB [ \-v ] - .RB [ \-L ] - zipfile -@@ -47,6 +48,9 @@ - .BI \-h - Show a short help. - .TP -+.BI \-q -+Suppress some informational messages. -+.TP - .BI \-v - Show version information. - .TP ---- ./man/zipnote.1 2013-04-26 18:40:32.145018756 +0200 -+++ ./man/zipnote.1 2013-04-26 18:40:18.943018442 +0200 -@@ -7,6 +7,7 @@ - .RB [ \-w ] - .RB [ \-b\ path ] - .RB [ \-h ] -+.RB [ \-q ] - .RB [ \-v ] - .RB [ \-L ] - zipfile -@@ -27,6 +28,9 @@ - .BI \-h - Show a short help. - .TP -+.BI \-q -+Suppress some informational messages. -+.TP - .BI \-v - Show version information. - .TP diff --git a/sources b/sources index 225e991..6d5a622 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ -7b74551e63f8ee6aab6fbc86676c0d37 zip30.tar.gz +922f7f38f8e50ec353fd5b3102e4d4d6 zcrypt29.tar.gz +6bfc076664416251d7624ab3538d1cb9 zip231.tar.gz diff --git a/tests/tests.yml b/tests/tests.yml deleted file mode 100644 index 930837a..0000000 --- a/tests/tests.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -- hosts: localhost - tags: - - classic - - tasks: - - name: Define remote_artifacts if it is not already defined - set_fact: - artifacts: ${HOME}/artifacts - when: artifacts is not defined - - - name: Make artifacts directory - file: path={{ artifacts }} state=directory recurse=yes - - - block: - - name: Execute tests - shell: | - logfile={{ artifacts }}/test.{{ item }}.log - exec 2>>$logfile 1>>$logfile - cd tests - #make script executable - chmod 0775 {{ item }} - #execute the test - python2 {{ item }}.py - if [ $? -eq 0 ]; then - echo "PASS {{ item }}" >> {{ artifacts }}/test.log - else - echo "FAIL {{ item }}" >> {{ artifacts }}/test.log - fi - with_items: - - "test_4GBsegfault" - - "test_big_file_in_archive" - - "test_long_path_in_archive" - - "test_many_files_in_archive" - - "test_umask" - - "test_umask_when_creating" - - "test_zipnote_fails_to_update_the_archive" - - # Can't go in block. See - # https://github.com/ansible/ansible/issues/20736 - - name: Check the results - shell: grep "^FAIL" {{ artifacts }}/test.log - register: test_fails - failed_when: test_fails.stdout or test_fails.stderr - - - diff --git a/tests/tests/__init__.py b/tests/tests/__init__.py deleted file mode 100755 index 471b567..0000000 --- a/tests/tests/__init__.py +++ /dev/null @@ -1,154 +0,0 @@ -''' - author = esakaiev@redhat.com -''' -import logging -import sys -import subprocess -import os -import shutil - - -def decorated_message(message): - """ - This decorator is used for providing logging header for different sections in the scripts - :param message: (`STRING`) - :return: decorated_function - """ - - def decorated_function(func): - """ - - :param func: - :return: - """ - - def wrapper(self): - """ - - :param self: - :return: - """ - print " " - print ("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::") - print (":: {0}".format(message)) - print ("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::") - - func(self) - - return wrapper - - return decorated_function - - -class BaseZipTests(object): - """ - This is a Base class for zip tests - """ - - def __init__(self): - self._set_logger() - self._purpose = "" - self.print_test_purpose() - - def _set_logger(self): - """ - This method is used for instantiating of logger - :return: - - None - """ - self.logger = logging.getLogger() - self.logger.setLevel(logging.DEBUG) - - self.handler = logging.StreamHandler(sys.stdout) - self.handler.setLevel(logging.DEBUG) - formatter = logging.Formatter('[ %(asctime)s ] :: [ %(message)s ]') - self.handler.setFormatter(formatter) - self.logger.addHandler(self.handler) - - @decorated_message("PURPOSE") - def print_test_purpose(self): - """ - - :return: - """ - print self._purpose - - def run_cmd(self, cmd, exp_err_code, message, cwd=None): - """ - This method is used for executing cmd, check output error code and - add result in the logger - :param cmd: ('STRING') - some command to execute - :param exp_err_code: ('INTEGER') - expected error code - :param message: ('STRING') - command description - :param cwd: ('STRING') - path to directory, where need to execute cmd - :return: - - errcode ('INTEGER') - """ - try: - errcode = subprocess.call(cmd, shell=True, cwd=cwd, stdout=sys.stderr.fileno()) - if errcode != exp_err_code: - self.logger.debug("FAIL :: {0}".format(message)) - else: - self.logger.debug("PASS ] :: [ {0}".format(message)) - return errcode - except subprocess.CalledProcessError as exp: - self.logger.error("Could not execute command {0}, e: {1}".format(cmd, exp)) - - def check_package(self): - """ - This method is used for checking, if zip package is installed - :return: None - """ - assert self.run_cmd("dnf list installed zip", 0, "Dnf package should be installed") == 0 - - def check_output(self, cmd, exp_output, message, cwd=None): - """ - This method is used for executing cmd and compare output result with expected message - :param cmd: (`STRING`) - some command to execute - :param exp_err_code: (`INTEGER`) - expected error code - :param message: (`STRING`) - command description - :param cwd: (`STRING`) - path to directory, where need to execute cmd - :return: - - output message (`STRING`) - """ - try: - output = self.execute_cmd(cmd, cwd) - if output != exp_output: - self.logger.debug("FAIL ]:: [ {}".format(message)) - else: - self.logger.debug("PASS ] :: [ {}".format(message)) - return output - except subprocess.CalledProcessError as exp: - self.logger.error(r'FAIL ] :: [ Could not execute command: "{0}",\ - ex: {1}'.format(cmd, exp)) - - def execute_cmd(self, cmd, cwd=None): - """ - This method is used for executing cmd and return output message - :param cmd: (`STRING`) - some command to execute - :param cwd: (`STRING`) - path to directory, where need to execute cmd - :return: - - output message (`STRING`) - """ - try: - output = subprocess.check_output(cmd, shell=True, cwd=cwd) - return output - except subprocess.CalledProcessError as exp: - self.logger.error(r'FAIL ] :: [ Could not execute command: "{0}",\ - ex: {1}'.format(cmd, exp)) - - def remove_file(self, file_path, is_directory=False): - """ - This method is used for removing files or directories after execution of test cases - :param file_path:(`STRING`) - path to file/folder - :param is_directory: (`BOOLEAN`) - True for directories - :return: None - """ - try: - if is_directory: - shutil.rmtree(file_path) - else: - os.remove(file_path) - self.logger.debug("File {0} has been successfully removed".format(file_path)) - except OSError, exp: - self.logger.debug("File {0} doesn't exists, e: {1}".format(file_path, exp)) diff --git a/tests/tests/test_4GBsegfault.py b/tests/tests/test_4GBsegfault.py deleted file mode 100755 index f11b99d..0000000 --- a/tests/tests/test_4GBsegfault.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2018 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# Author: Eduard Sakaiev - -import sys -import uuid - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = '''zip mustn't segfault when packing files larger than 4 GB. - -Note: this test can't run on RHEL 2.1 since the utilities used here -in the test don't work there as expected. This test can't run on -RHEL 5 either, but in this case, the reason is reworked zip which -can't work with files larger than 4 GB at all.''' - - -class Test4GBsegfault(BaseZipTests): - """ - This class is used for providing functionality - for Test4GBsegfault test case - """ - - def __init__(self): - """ - - """ - self._purpose = PURPOSE - super(Test4GBsegfault, self).__init__() - - self._tmpdir = "/tmp/{}".format(uuid.uuid4()) - - @decorated_message("SETUP") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - - self.run_cmd("mkdir {}".format(self._tmpdir), 0, - "Creating tmp directory {}".format(self._tmpdir)) - - @decorated_message("TEST") - def start_test(self): - """ - - :return: - """ - self.run_cmd("dd if=/dev/zero of=testfile bs=1M count=4097", 0, - "Creating of 4Gb file", self._tmpdir + "/") - self.run_cmd("zip testfile.zip testfile", 0, - "Archiving file with zip", self._tmpdir + "/") - - @decorated_message("CLEANUP") - def cleanup(self): - """ - - :return: - """ - self.run_cmd("rm -r {}".format(self._tmpdir), 0, - "Removing tmp directory") - - -if __name__ == "__main__": - test_4gb = Test4GBsegfault() - try: - test_4gb.prepare_setup() - test_4gb.start_test() - except AssertionError, exp: - test_4gb.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test_4gb.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test_4gb.cleanup() diff --git a/tests/tests/test_big_file_in_archive.py b/tests/tests/test_big_file_in_archive.py deleted file mode 100755 index c758674..0000000 --- a/tests/tests/test_big_file_in_archive.py +++ /dev/null @@ -1,128 +0,0 @@ -# python2 test_big_file_in_archive.py -# Author: Josef Zila -# Location: CoreOS/zip/Functionality/stress-tests/big-file-in-archive/runtest.sh -# Description: zip - tests handling large files (2GB,3MB,4GB) - -# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# Include rhts and rhtslib environment -# rpm -q --quiet rhtslib || rpm -Uvh http://nest.test.redhat.com/mnt/qa/scratch/pmuller/rhtslib/rhtslib.rpm - -import sys -import uuid -import platform - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -Test Name: Big file in archive -Author: Josef Zila -Location: CoreOS/zip/Functionality/stress-tests/big-file-in-archive/PURPOSE - -Short Description: -Tests handling large files (2GB,3GB,4GB) - -Long Description: -Test creates three files (2GB, 3GB and 4GB large) and attempts to archive each of them using zip. Then original files are deleted -and archives are unpacked, to check size of unpacked files. Current version of zip on all archs and distros in time of -writing(2.31-1) passes test. Note: 4GB file is too large for zip to handle, so it is not supposed to be successfully archived -or unpacked, test just checks for correct return codes. - - -how to run it: -python2 test_big_file_in_archive.py - -TEST UPDATED (esakaiev) ------------------------- -After rebase to zip-3.0-1 there is no 4GB limit. Patching the test accordingly. -''' - - -class TestBigFileInArchive(BaseZipTests): - """ - This class is used for providing functionality - for TestBigFileInArchive test case - """ - def __init__(self): - """ - - """ - self._purpose = PURPOSE - super(TestBigFileInArchive, self).__init__() - - self._files = ['/tmp/tmp.{}'.format(uuid.uuid4()) for x in xrange(3)] - self._files_sizes = [2048, 3056, 4096] - self._os_distribution = platform.linux_distribution() - - @decorated_message("Preparing Setup") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - for i, file_name in enumerate(self._files): - size = self._files_sizes[i] - assert self.run_cmd("dd if=/dev/zero of={0} bs=1M count={1}".format(file_name, size), 0, - "Creating {0} GB file".format(size / 1000), cwd="/tmp/") == 0 - - @decorated_message("Starting Test") - def start_test(self): - """ - - :return: - """ - for i, file_name in enumerate(self._files): - error_code = 0 - - self.remove_file(file_name + ".zip") # #remove archive temp files, we just need unused temp names - size = self._files_sizes[i] - - self.run_cmd("zip {0} {1}".format(file_name + ".zip", file_name), error_code, - "Archiving {} Gb file".format(size / 1000), cwd="/tmp/") - - self.remove_file(file_name) # Removing original files - - self.run_cmd("unzip {0} -d /".format(file_name + ".zip"), error_code, - "Unpacking {} Gb file".format(size / 1000), cwd="/tmp/") - - # Checking new 2GB file size - self.check_output("stat -c %s {0}".format(self._files[0]), "2147483648\n", "Checking new 2GB file size") - - @decorated_message("Cleaning up") - def cleanup(self): - """ - - :return: - """ - for file_name in self._files: - self.remove_file(file_name) - self.remove_file(file_name + ".zip") - - -if __name__ == "__main__": - test = TestBigFileInArchive() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/tests/tests/test_long_path_in_archive.py b/tests/tests/test_long_path_in_archive.py deleted file mode 100755 index 4f4d8ce..0000000 --- a/tests/tests/test_long_path_in_archive.py +++ /dev/null @@ -1,140 +0,0 @@ -# Author: Josef Zila -# Location: CoreOS/zip/Functionality/stress-tests/long-path-in-archive/runtest.sh -# Description: zip - tests handling very long paths within archive (15*256 characters long path) - -# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import sys -import uuid -import os -from shutil import copyfile - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -Test Name: -Author: Josef Zila -Location: CoreOS/zip/Functionality/stress-tests/long-path-in-archive/PURPOSE - -Short Description: -Tests handling very long paths within archive (15*256 characters long path) - -Long Description: -This test creates file with very long path of 15 directories, each 255 characters. This whole directory structure is then zipped and unzipped -to determine if zip program handles paths this long correctly. Current version of zip on all archs and distros in time of writing(2.31-1) passes test. - - -how to run it: -choose arch and distro - - -TEST UPDATED (esakaiev) -''' - - -class TestLongPathInArchive(BaseZipTests): - """ - This class is used for providing functionality - for TestLongPathInArchive test case - """ - def __init__(self): - self._purpose = PURPOSE - super(TestLongPathInArchive, self).__init__() - - self._tmpdir = "/tmp/{}".format(uuid.uuid4()) - self._file_under_test = "/proc/version" - - self._long_name = "".join(["aaaaa" for i in xrange(51)]) - self._long_path = "/".join([self._long_name for x in xrange(15)]) - self._test_file_path = self._tmpdir + "/" + self._long_path + "/" + "testfile" - self._package_ver = "" - self._package_release = "" - - @decorated_message("Prepare setup") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - - self.run_cmd("mkdir {}".format(self._tmpdir), 0, "Creating tmp directory {}".format(self._tmpdir)) - self._package_ver = self.execute_cmd("rpm -q zip --queryformat %{version}") - self._package_release = self.execute_cmd("rpm -q zip --queryformat %{version}") - - self.logger.debug("Running zip.{0}.{1} package".format(self._package_ver, self._package_release)) - # creating folders structure: - try: - - os.makedirs(self._tmpdir + "/" + self._long_path) - self.logger.debug("PASS ] :: [ Test directory with long path has been successfully created") - except OSError, exp: - self.logger.debug("FAIL ] :: [ Could not create directories by path, e: {}".format(exp)) - raise - - copyfile(self._file_under_test, self._test_file_path) - - @decorated_message("Starting Test cases") - def start_test(self): - """ - - :return: - """ - - self.run_cmd("zip -r test {0} -q".format(self._long_name), 0, - "Zipping test file", - cwd=self._tmpdir) - - self.remove_file(self._tmpdir + "/" + self._long_name, True) - self.run_cmd("unzip -qq test.zip", 0, - "Unzipping test file", - cwd=self._tmpdir) - - content_init = None - with open(self._file_under_test) as fp_init: - content_init = fp_init.read().replace('\n', '') - - content_fut = None - with open(self._test_file_path) as fp_fut: - content_fut = fp_fut.read().replace('\n', '') - - if content_init == content_fut: - self.logger.debug("PASS ] :: [ {}".format("Content of the initial file and file under test was matched")) - else: - self.logger.debug("FAIL ] :: [ {}".format("Content of the initial file and file under test wasn't matched")) - - @decorated_message("Cleaning up") - def cleanup(self): - """ - - :return: - """ - self.remove_file(self._tmpdir, True) - - -if __name__ == "__main__": - test = TestLongPathInArchive() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/tests/tests/test_many_files_in_archive.py b/tests/tests/test_many_files_in_archive.py deleted file mode 100755 index 9382675..0000000 --- a/tests/tests/test_many_files_in_archive.py +++ /dev/null @@ -1,140 +0,0 @@ -# Author: Josef Zila -# Location: CoreOS/zip/Functionality/stress-tests/many-files-in-archive/runtest.sh -# Description: zip - Tests behaviour with many files in archive (1048578 files) - -# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import sys -import uuid - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -Test Name: -Author: Josef Zila -Location: CoreOS/zip/Functionality/stress-tests/many-files-in-archive/PURPOSE - -Short Description: -Tests behaviour with many files in archive (1048577 files) - -Long Description: -This test creates 1048576 empty files and one non-empty file. Then zips and unzips directory containing all those files and tests content of -non-empty file and count of unzipped files. This test is very time-consuming. Current version of zip on all archs and distros in time of writing -(2.31-1) passes test. - - -how to run it: -choose arch and distro - - -TEST UPDATED (esakaiev) -''' - - -class TestManyFilesInArchive(BaseZipTests): - """ - This class is used for providing functionality - for TestManyFilesInArchive test case - """ - - def __init__(self): - self._purpose = PURPOSE - super(TestManyFilesInArchive, self).__init__() - - self._tmpdir = "/tmp/{}".format(uuid.uuid4()) - self._files_number = 1048576 - self._package_ver = "" - self._package_release = "" - - @decorated_message("Prepare setup") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - - self.run_cmd("mkdir {}".format(self._tmpdir), 0, - "Creating tmp directory {}".format(self._tmpdir)) - self._package_ver = self.execute_cmd("rpm -q zip --queryformat %{version}") - self._package_release = self.execute_cmd("rpm -q zip --queryformat %{version}") - - self.logger.debug("Running zip.{0}.{1} package".format(self._package_ver, self._package_release)) - self.logger.debug("Creating {0} files".format(self._files_number)) - - [open("{0}/{1}".format(self._tmpdir, i), "w").close() for i in xrange(self._files_number)] - self.logger.debug("Creating test file") - with open("{0}/test.txt".format(self._tmpdir), "w") as fp: - fp.write("12345") - - @decorated_message("Starting Test cases") - def start_test(self): - """ - - :return: - """ - - self.run_cmd("zip -r test {0} -q".format(self._tmpdir.split('/')[-1]), 0, - "Zipping test files", - cwd='/tmp') - - self.remove_file(self._tmpdir, True) - self.run_cmd("unzip -qq test.zip", 0, - "Unzipping test files", - cwd='/tmp') - - test_file_content = None - with open("{0}/test.txt".format(self._tmpdir)) as fp: - test_file_content = fp.read().replace('/n', '') - - if test_file_content == "12345": - self.logger.debug("PASS ] :: [ {}".format("Unpacked content matches original")) - else: - self.logger.debug("FAIL ] :: [ {}".format("Unpacked content does not match original!")) - - files_count = self.execute_cmd("ls {0} | wc -l".format(self._tmpdir)).replace("\n", "") - - if files_count == str(self._files_number + 1): - self.logger.debug( - "PASS ] :: [ {}".format("All {0} files present after unpacking".format(self._files_number + 1))) - else: - self.logger.debug(r"FAIL ] :: [ File count changed after unpacking! \ - Before zipping there was {0} files. \ - After unzip there is {1} files.".format(self._files_number + 1, files_count)) - - @decorated_message("Cleaning up") - def cleanup(self): - """ - - :return: - """ - self.remove_file(self._tmpdir, True) - self.remove_file("/tmp/test.zip") - - -if __name__ == "__main__": - test = TestManyFilesInArchive() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/tests/tests/test_umask.py b/tests/tests/test_umask.py deleted file mode 100755 index f4df00e..0000000 --- a/tests/tests/test_umask.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) 2006 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# Author: Radek Biba - -import sys -import uuid - -UMASK = "Running umask" - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -zip is supposed to honor umask settings when creating archives. -This test case just checks if it really does - -TEST UPDATED (esakaiev) -''' - - -class TestUmask(BaseZipTests): - """ - This class is used for providing functionality - for TestUmask test case - """ - def __init__(self): - self._purpose = PURPOSE - super(TestUmask, self).__init__() - - self._tmpdir = "/tmp/{}".format(uuid.uuid4()) - self._mask_list = ["0", "2", "20", "22", "200", "202", "220", "222", "6", "60"] - self._package_ver = "" - self._package_release = "" - - @decorated_message("Prepare setup") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - - self.run_cmd("mkdir {}".format(self._tmpdir), 0, "Creating tmp directory {}".format(self._tmpdir)) - self._package_ver = self.execute_cmd("rpm -q zip --queryformat %{version}") - self._package_release = self.execute_cmd("rpm -q zip --queryformat %{version}") - - self.logger.debug("Running zip.{0}.{1} package".format(self._package_ver, self._package_release)) - - # Trying to verify that zip honors umask. Trying with various combinations - # of 'w's and 'r's for User, Group, and Others. - @decorated_message("Starting Test cases") - def start_test(self): - """ - - :return: - """ - for mask in self._mask_list: - self.logger.debug("Running umask and zipping file {0}".format(mask)) - self.execute_cmd("umask {0}; touch {0}; zip -q {0}.zip {0}".format(mask), cwd=self._tmpdir) - - stat_test_zip = self.execute_cmd("stat -c %a {0}.zip".format(mask), cwd=self._tmpdir).replace("\n", "") - stat_test = self.execute_cmd("stat -c %a {0}".format(mask), cwd=self._tmpdir).replace("\n", "") - - print stat_test_zip, stat_test - if stat_test_zip == stat_test: - self.logger.debug( - "PASS ] :: [ permissions for {0}.zip match to {0}, {1} == {2}".format(mask, stat_test_zip, - stat_test)) - else: - self.logger.debug( - "FAIL ] :: [ permissions for {0}.zip doesn't match to {0}, {1} != {2}".format(mask, stat_test_zip, - stat_test)) - - @decorated_message("Cleaning up") - def cleanup(self): - """ - - :return: - """ - self.remove_file(self._tmpdir, True) - - -if __name__ == "__main__": - test = TestUmask() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/tests/tests/test_umask_when_creating.py b/tests/tests/test_umask_when_creating.py deleted file mode 100755 index a59a573..0000000 --- a/tests/tests/test_umask_when_creating.py +++ /dev/null @@ -1,105 +0,0 @@ -# Author: Josef Zila - -# Description: Zip did not honor umask setting when creating archives. - -# Copyright (c) 2008 Red Hat, Inc. All rights reserved. This copyrighted material -# is made available to anyone wishing to use, modify, copy, or -# redistribute it subject to the terms and conditions of the GNU General -# Public License v.2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public License for more details. -# -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import sys -import uuid - -UMASK = "Running umask" - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -Test Name: umask-when-creating -Author: Josef Zila - -Short Description: -zip does not honor umaks setting when creating archive - -Long Description: - -zip appears to have a built-in umask of 0022 regardless of the global umask. -With umask set to 0000, zip-2.3-27 creates zip files with permissions of -0644 instead of 0666. Previous versions created files with correct permissions. - - -TEST UPDATED (esakaiev) -''' - - -class TestUmaskWhenCreating(BaseZipTests): - """ - This class is used for providing functionality - for TestUmaskWhenCreating test case - """ - def __init__(self): - self._purpose = PURPOSE - super(TestUmaskWhenCreating, self).__init__() - - self._tmpdir = "/tmp/{}".format(uuid.uuid4()) - self._mask_list = ["777", "000", "027"] - self._expected_results = ["----------", "-rw-rw-rw-", "-rw-r-----"] - self._package_ver = "" - self._package_release = "" - - @decorated_message("Prepare setup") - def prepare_setup(self): - self.check_package() - - self.run_cmd("mkdir {}".format(self._tmpdir), 0, "Creating tmp directory {}".format(self._tmpdir)) - self._package_ver = self.execute_cmd("rpm -q zip --queryformat %{version}") - self._package_release = self.execute_cmd("rpm -q zip --queryformat %{version}") - - self.logger.debug("Running zip.{0}.{1} package".format(self._package_ver, self._package_release)) - - @decorated_message("Starting Test cases") - def start_test(self): - for i, mask in enumerate(self._mask_list): - self.logger.debug("Running umask and zipping file {0}".format(mask)) - self.execute_cmd("umask -S {0} >> /dev/null; zip test /etc/services >> /dev/null".format(mask), - cwd=self._tmpdir) - - result = self.execute_cmd("ls -l test.zip | cut -b 1-10", cwd=self._tmpdir).replace("\n", "") - - if result == self._expected_results[i]: - self.logger.debug( - "PASS ] :: [ file permissions match to {0}".format(self._expected_results[i])) - else: - self.logger.debug( - "FAIL ] :: [ file permissions don't match to {0}".format(self._expected_results[i])) - - self.remove_file(self._tmpdir + "/" + "test.zip") - - @decorated_message("Cleaning up") - def cleanup(self): - self.remove_file(self._tmpdir, True) - - -if __name__ == "__main__": - test = TestUmaskWhenCreating() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/tests/tests/test_zipnote_fails_to_update_the_archive.py b/tests/tests/test_zipnote_fails_to_update_the_archive.py deleted file mode 100755 index 747cf40..0000000 --- a/tests/tests/test_zipnote_fails_to_update_the_archive.py +++ /dev/null @@ -1,105 +0,0 @@ -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# -# Description: zipnote fails to update the archive -# Author: Karel Volny -# -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# -# Copyright (c) 2015 Red Hat, Inc. -# -# This copyrighted material is made available to anyone wishing -# to use, modify, copy, or redistribute it subject to the terms -# and conditions of the GNU General Public License version 2. -# -# This program is distributed in the hope that it will be -# useful, but WITHOUT ANY WARRANTY; without even the implied -# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -# PURPOSE. See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with this program; if not, write to the Free -# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. -# -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -import sys -import uuid - -sys.path.append("..") - -from tests import BaseZipTests -from tests import decorated_message - -PURPOSE = ''' -PURPOSE of zipnote-fails-to-update-the-archive -Description: zipnote fails to update the archive -Author: Karel Volny - - -TEST UPDATED (esakaiev) -''' - - -class TestZipnoteFailsToUpdateTheArchive(BaseZipTests): - """ - This class is used for providing functionality - for TestZipnoteFailsToUpdateTheArchive test case - """ - def __init__(self): - self._purpose = PURPOSE - super(TestZipnoteFailsToUpdateTheArchive, self).__init__() - - self._tmpdir = '/tmp/tmp.{}'.format(uuid.uuid4()) - - @decorated_message("Preparing setup") - def prepare_setup(self): - """ - - :return: - """ - self.check_package() - self.run_cmd("mkdir {}".format(self._tmpdir), 0, "Creating tmp directory {}".format(self._tmpdir)) - - @decorated_message("Starting Test") - def start_test(self): - """ - - :return: - """ - self.run_cmd("touch file", 0, "Creating the Demo file", cwd=self._tmpdir) - self.run_cmd("zip archive.zip file", 0, "Creating the archive including the file", cwd=self._tmpdir) - self.run_cmd("zipnote archive.zip > info.txt", 0, "Reading the archive comments", cwd=self._tmpdir) - ## bad - e.g. zip-3.0-1.el6.i686: - # zipnote error: Interrupted (aborting) - # Segmentation fault - ## good: no output - self.run_cmd("zipnote -w archive.zip < info.txt > output_file.txt 2>&1", 0, "Writing comments to the archive", - cwd=self._tmpdir) - - if 'error' in open(self._tmpdir + '/output_file.txt').read(): - self.logger.debug("FAIL ] :: [ File shouldn't contain an error pattern") - else: - self.logger.debug("PASS ] :: [ File doesn't contain an error pattern") - - @decorated_message("Cleaning up") - def cleanup(self): - """ - - :return: - """ - self.run_cmd("rm -r {}".format(self._tmpdir), 0, - "Removing tmp directory") - - -if __name__ == "__main__": - test = TestZipnoteFailsToUpdateTheArchive() - try: - test.prepare_setup() - test.start_test() - except AssertionError, exp: - test.logger.debug("FAIL ] :: [ Assertion occurred {0}".format(exp)) - except Exception, exp: - test.logger.debug("FAIL ] :: [ Exception occurred {0}".format(exp)) - finally: - test.cleanup() diff --git a/zip-2.3-currdir.patch b/zip-2.3-currdir.patch new file mode 100644 index 0000000..1ff00f6 --- /dev/null +++ b/zip-2.3-currdir.patch @@ -0,0 +1,11 @@ +--- zip-2.3/util.c.pom 1999-11-07 11:29:38.000000000 +0100 ++++ zip-2.3/util.c 2005-01-17 13:46:26.165396792 +0100 +@@ -190,6 +190,8 @@ + /* Compare the sh pattern p with the string s and return true if they match, + false if they don't or if there is a syntax error in the pattern. */ + { ++ while (s[0] == '.' && s[1] == '/') ++ s += 2; /* strip redundant leading "./" sections */ + return recmatch((ZCONST uch *) p, (ZCONST uch *) s, cs) == 1; + } + diff --git a/zip-2.3-sf.patch b/zip-2.3-sf.patch new file mode 100644 index 0000000..db785a2 --- /dev/null +++ b/zip-2.3-sf.patch @@ -0,0 +1,11 @@ +--- zip-2.3/unix/unix.c.pom 2006-10-09 16:24:47.000000000 +0200 ++++ zip-2.3/unix/unix.c 2006-10-09 17:14:18.000000000 +0200 +@@ -208,7 +208,7 @@ + doesn't collide with error values. 2^32 - 8193 should be plenty until + info-zip supports zip64. */ + if (s.st_size > MAX_ZIP_SIZE) { +- zipwarn("file too large: ", a); ++ zipwarn("file too large: ", n); + return ZE_MISS; + } + diff --git a/zip-2.31-configure.patch b/zip-2.31-configure.patch new file mode 100644 index 0000000..00b09d1 --- /dev/null +++ b/zip-2.31-configure.patch @@ -0,0 +1,213 @@ +--- zip-2.31/unix/configure.lhh 2005-11-10 13:25:26.000000000 +0100 ++++ zip-2.31/unix/configure 2005-11-10 13:40:44.311641648 +0100 +@@ -76,14 +76,20 @@ + done + fi + +-echo Check for prototypes ++echo -n Check for prototypes... + echo "int main(int argc, char *argv[]) { return 0; }" > conftest.c + $CC $CFLAGS -c conftest.c > /dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_PROTO" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_PROTO" ++else ++ echo yes ++fi ++ + + # const check currently handles mips cc and non ANSI compilers. + # does it need more ? +-echo Check the handling of const ++echo -n Check the handling of const... + cat > conftest.c << _EOF_ + typedef int charset[2]; + int main() +@@ -94,9 +100,15 @@ + } + _EOF_ + $CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_CONST" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_CONST" ++else ++ echo yes ++fi ++ + +-echo Check for time_t ++echo -n Check for time_t... + cat > conftest.c << _EOF_ + #include + #include +@@ -107,9 +119,15 @@ + } + _EOF_ + $CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_TIME_T" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_TIME_T" ++else ++ echo yes ++fi ++ + +-echo Check for size_t ++echo -n Check for size_t... + cat > conftest.c << _EOF_ + #include + int main() +@@ -119,7 +137,13 @@ + } + _EOF_ + $CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_SIZE_T" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_SIZE_T" ++else ++ echo yes ++fi ++ + + echo Check for gcc no-builtin flag + # -fno-builtin since version 2 +@@ -140,18 +164,29 @@ + # add NO_'function_name' to flags if missing + for func in rmdir strchr strrchr rename mktemp mktime mkstemp + do +- echo Check for $func +- echo "int main(){ $func(); return 0; }" > conftest.c ++ echo -n Check for $func... ++ echo "char $func(void); int main(){ $func(); return 0; }" > conftest.c + $CC $BFLAG -o conftest conftest.c >/dev/null 2>/dev/null +- [ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_`echo $func | tr '[a-z]' '[A-Z]'`" ++ if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_`echo $func | tr '[a-z]' '[A-Z]'`" ++ else ++ echo yes ++ fi + done + +-echo Check for memset ++echo -n Check for memset... + echo "int main(){ char k; memset(&k,0,0); return 0; }" > conftest.c + $CC -o conftest conftest.c >/dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DZMEM" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DZMEM" ++else ++ echo yes ++fi ++ + +-echo Check for errno declaration ++echo -n Check for errno declaration... + cat > conftest.c << _EOF_ + #include + main() +@@ -161,9 +196,14 @@ + } + _EOF_ + $CC $CFLAGS -c conftest.c >/dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_ERRNO" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_ERRNO" ++else ++ echo yes ++fi + +-echo Check for directory libraries ++echo -n Check for directory libraries... + cat > conftest.c << _EOF_ + int main() { return closedir(opendir(".")); } + _EOF_ +@@ -178,21 +218,30 @@ + done + if [ ${OPT} ]; then + LFLAGS2="${LFLAGS2} ${OPT}" ++ echo yes, ${OPT} + else + CFLAGS="${CFLAGS} -DNO_DIR" ++ echo no + fi + fi + + # Dynix/ptx 1.3 needed this +-echo Check for readlink ++echo -n Check for readlink... + echo "int main(){ return readlink(); }" > conftest.c + $CC -o conftest conftest.c >/dev/null 2>/dev/null + if [ $? -ne 0 ]; then + $CC -o conftest conftest.c -lseq >/dev/null 2>/dev/null +- [ $? -eq 0 ] && LFLAGS2="${LFLAGS2} -lseq" ++ if [ $? -eq 0 ]; then ++ LFLAGS2="${LFLAGS2} -lseq" ++ echo yes, -lseq ++ else ++ echo no ++ fi ++else ++ echo yes + fi + +-echo Check for directory include file ++echo -n Check for directory include file... + OPT="" + for inc in dirent.h sys/ndir.h ndir.h sys/dir.h + do +@@ -200,17 +249,19 @@ + $CPP conftest.c > /dev/null 2>/dev/null + [ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break + done ++echo "${OPT}" + CFLAGS="${CFLAGS} ${OPT}" + +-echo Check for non existent include files ++echo -n Check for non existent include files... + for inc in stdlib.h stddef.h unistd.h fcntl.h string.h + do + echo "#include <$inc>" > conftest.c + $CPP conftest.c >/dev/null 2>/dev/null + [ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_`echo $inc | tr '[a-z]./' '[A-Z]__'`" + done ++echo ok + +-echo Check for terminal I/O include file ++echo -n Check for terminal I/O include file... + OPT="" + for inc in termios.h termio.h sgtty.h + do +@@ -219,9 +270,10 @@ + [ $? -eq 0 ] && OPT="-DHAVE_`echo $inc | tr '[a-z]./' '[A-Z]__'`" && break + done + CFLAGS="${CFLAGS} ${OPT}" ++echo $OPT + + # needed for AIX (and others ?) when mmap is used +-echo Check for valloc ++echo -n Check for valloc... + cat > conftest.c << _EOF_ + main() + { +@@ -231,7 +283,13 @@ + } + _EOF_ + $CC ${CFLAGS} conftest.c > /dev/null 2>/dev/null +-[ $? -ne 0 ] && CFLAGS="${CFLAGS} -DNO_VALLOC" ++if [ $? -ne 0 ]; then ++ echo no ++ CFLAGS="${CFLAGS} -DNO_VALLOC" ++else ++ echo yes ++fi ++ + + echo Check for 64bit fseek + for func in fseeko fseek64 diff --git a/zip-2.31-install.patch b/zip-2.31-install.patch new file mode 100644 index 0000000..7a1f69f --- /dev/null +++ b/zip-2.31-install.patch @@ -0,0 +1,11 @@ +--- zip-2.31/unix/Makefile.install 2005-02-28 08:33:50.000000000 +0100 ++++ zip-2.31/unix/Makefile 2005-11-10 12:58:33.221425848 +0100 +@@ -129,7 +129,7 @@ + $(INSTALL_PROGRAM) $(ZIPS) $(BINDIR) + -cd $(BINDIR); $(CHMOD) $(BINFLAGS) $(ZIPS) + -$(INSTALL_D) $(MANDIR) +- $(INSTALL) man/zip.1 $(MANDIR)/zip.$(manext) ++ $(INSTALL_PROGRAM) man/zip.1 $(MANDIR)/zip.$(manext) + $(CHMOD) $(MANFLAGS) $(MANDIR)/zip.$(manext) + + uninstall: diff --git a/zip-2.31-near-4GB.patch b/zip-2.31-near-4GB.patch new file mode 100644 index 0000000..210b183 --- /dev/null +++ b/zip-2.31-near-4GB.patch @@ -0,0 +1,293 @@ +--- zip-2.31/unix/zipup.h.4GB 2005-01-29 07:47:58.000000000 +0100 ++++ zip-2.31/unix/zipup.h 2005-11-10 13:18:02.990593904 +0100 +@@ -6,13 +6,19 @@ + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + */ ++#include ++#include + #ifndef O_RDONLY + # define O_RDONLY 0 + #endif + #ifndef O_BINARY + # define O_BINARY 0 + #endif +-#define fhow (O_RDONLY|O_BINARY) ++#ifdef _LARGEFILE64_SOURCE ++#define fhow (O_RDONLY | O_LARGEFILE) ++#else ++#define fhow O_RDONLY ++#endif + #define fbad (-1) + typedef int ftype; + #define zopen(n,p) open(n,p) +--- zip-2.31/unix/unix.c.4GB 2005-02-11 03:35:02.000000000 +0100 ++++ zip-2.31/unix/unix.c 2005-11-10 13:24:19.573344624 +0100 +@@ -113,7 +113,11 @@ + char *e; /* pointer to name from readd() */ + int m; /* matched flag */ + char *p; /* path for recursion */ ++#ifdef _LARGEFILE64_SOURCE ++ struct stat64 s; /* result of stat() */ ++#else + struct stat s; /* result of stat() */ ++#endif + struct zlist far *z; /* steps through zfiles list */ + + if (strcmp(n, "-") == 0) /* if compressing stdin */ +@@ -202,6 +206,15 @@ + } /* (s.st_mode & S_IFDIR) */ + else + zipwarn("ignoring special file: ", n); ++ ++ /* Zip uses negative error codes (IIRC, to -3). Make sure file size ++ doesn't collide with error values. 2^32 - 8193 should be plenty until ++ info-zip supports zip64. */ ++ if (s.st_size > MAX_ZIP_SIZE) { ++ zipwarn("file too large: ", a); ++ return ZE_MISS; ++ } ++ + return ZE_OK; + } + +@@ -321,7 +334,12 @@ + If f is "-", use standard input as the file. If f is a device, return + a file size of -1 */ + { +- struct stat s; /* results of stat() */ ++#ifdef _LARGEFILE64_SOURCE ++ struct stat64 s; /* results of stat() */ ++#else ++ struct stat s; ++#endif ++ + /* converted to pointer from using FNMAX - 11/8/04 EG */ + char *name; + int len = strlen(f); +@@ -343,7 +361,11 @@ + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (strcmp(f, "-") == 0) { ++#ifdef _LARGEFILE64_SOURCE ++ if (fstat64(fileno(stdin), &s) != 0) { ++#else + if (fstat(fileno(stdin), &s) != 0) { ++#endif + free(name); + error("fstat(stdin)"); + } +@@ -422,7 +444,11 @@ + /* store full data in local header but just modification time stamp info + in central header */ + { ++#ifdef _LARGEFILE64_SOURCE ++ struct stat64 s; ++#else + struct stat s; ++#endif + char *name; + int len = strlen(z->name); + +--- zip-2.31/unix/configure.4GB 2004-12-05 09:51:18.000000000 +0100 ++++ zip-2.31/unix/configure 2005-11-10 13:12:47.010630160 +0100 +@@ -12,7 +12,7 @@ + trap "rm -f conftest* core a.out; exit 1" 1 2 3 15 + + CC=${1-cc} +-CFLAGS=${2-"-O2 -I. -DUNIX"} ++CFLAGS=${2-"-O2 -I. -DUNIX -g -D_LARGEFILE64_SOURCE"} + LFLAGS1="" + LN="ln -s" + +--- zip-2.31/fileio.c.4GB 2005-11-10 12:59:43.000000000 +0100 ++++ zip-2.31/fileio.c 2005-11-10 13:07:13.190378552 +0100 +@@ -599,7 +599,11 @@ + this will be done by setfileattr() later. + */ + { ++#ifdef _LARGEFILE64_SOURCE ++ struct stat64 t; /* results of stat64() */ ++#else + struct stat t; /* results of stat() */ ++#endif + #if defined(CMS_MVS) + /* cmsmvs.h defines FOPW_TEMP as memory(hiperspace). Since memory is + * lost at end of run, always do copy instead of rename. +@@ -698,8 +702,11 @@ + + return _dos_files(&buf, f, 0xff) < 0 ? 0x20 : buf.atr; + #else ++#ifdef _LARGEFILE64_SOURCE ++ struct stat64 s; ++#else + struct stat s; +- ++#endif + return SSTAT(f, &s) == 0 ? (int) s.st_mode : 0; + #endif + } +@@ -920,3 +927,108 @@ + } + + #endif /* NO_RENAME */ ++ ++/* ++ Wrapper functions for fopen/fseek/ftell for >2GB files. ++ ++ So, what we do here is add support for 4GB seeks. More appropriately, ++ 2^32 - 8193 bytes. This is tailored to the way zip uses fseek; it never ++ seeks backwards more than 8192 bytes. ++ */ ++#ifdef _LARGEFILE64_SOURCE ++FILE * ++lfopen(const char *path, const char *mode) ++{ ++ int fd; ++ FILE *f; ++ int flags; ++ int x; ++ char prev; ++ ++ if (!path || !mode | !strlen(mode)) ++ return NULL; ++ ++ for (x = 0; x < strlen(mode); x++) { ++ switch (mode[x]) { ++ case 'r': ++ flags = O_RDONLY | O_LARGEFILE; ++ break; ++ case 'w': ++ flags = O_WRONLY | O_LARGEFILE | O_CREAT | O_TRUNC; ++ break; ++ case 'a': ++ flags = O_RDWR | O_LARGEFILE; ++ break; ++ case 'b': /* b has no effect */ ++ continue; ++ case '+': ++ if (prev == 'r') { ++ flags = O_RDWR | O_LARGEFILE; ++ } else if (prev == 'w') { ++ flags = O_RDWR | O_LARGEFILE | O_CREAT | ++ O_TRUNC; ++ } else if (prev == 'a') { ++ flags = O_RDWR | O_LARGEFILE | O_CREAT; ++ } else ++ return NULL; ++ break; ++ } ++ prev = mode[x]; ++ } ++ ++ fd = open(path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); ++ if (fd == -1) ++ return NULL; ++ ++ f = fdopen(fd, mode); ++ return f; ++} ++ ++int ++lfseek(FILE *f, ulg pos, int whence) ++{ ++ struct stat64 sb; ++ ulg o, delta; ++ int ret; ++ ++ /* Hurts performance */ ++ fflush(f); ++ ++ if (pos <= MAX_ZIP_SIZE) { ++ return (lseek64(fileno(f), pos, whence) == (off64_t)-1); ++ } ++ ++ delta = ~((off64_t)pos - 1); ++ if (whence == SEEK_CUR) { ++ o = lseek64(fileno(f), 0, SEEK_CUR); ++ if (o < delta) ++ return -1; ++ ++ o -= delta; ++ return (lseek64(fileno(f), o, SEEK_SET) == (off64_t)-1); ++ } ++ ++ if (whence == SEEK_END) { ++ fstat64(fileno(f), &sb); ++ ++ if ((ulg)sb.st_size < delta) ++ return -1; ++ ++ o = (off64_t)((sb.st_size) - delta); ++ return (lseek64(fileno(f), o, SEEK_SET) == (off64_t)-1); ++ } ++ ++ return -1; ++} ++ ++ ++ulg ++lftell(FILE *f) ++{ ++ /* Hurts performance */ ++ fflush(f); ++ return (ulg)lseek64(fileno(f), 0, SEEK_CUR); ++} ++ ++#endif /* _LARGEFILE64_SOURCE */ ++ +--- zip-2.31/zip.h.4GB 2005-11-10 12:59:43.000000000 +0100 ++++ zip-2.31/zip.h 2005-11-10 13:18:57.653283912 +0100 +@@ -236,6 +236,7 @@ + #define DOSTIME_MINIMUM ((ulg)0x00210000L) + #define DOSTIME_2038_01_18 ((ulg)0x74320000L) + ++#define MAX_ZIP_SIZE 0xffffdffe /* Max archive / archive member size */ + + /* Public globals */ + extern uch upper[256]; /* Country dependent case map table */ +@@ -411,6 +412,11 @@ + int putcentral OF((struct zlist far *, FILE *)); + int putend OF((int, ulg, ulg, extent, char *, FILE *)); + int zipcopy OF((struct zlist far *, FILE *, FILE *)); ++#ifdef _LARGEFILE64_SOURCE ++int lfseek OF((FILE *, ulg, int)); ++ulg lftell OF((FILE *)); ++FILE *lfopen OF((const char *, const char *)); ++#endif /* LF64 */ + + /* in fileio.c */ + #ifndef UTIL +--- zip-2.31/tailor.h.4GB 2005-03-04 08:45:26.000000000 +0100 ++++ zip-2.31/tailor.h 2005-11-10 13:11:18.909023640 +0100 +@@ -368,12 +368,27 @@ + # define DYN_ALLOC + #endif + ++#ifdef _LARGEFILE64_SOURCE ++#define fopen lfopen ++#define fseek lfseek ++#define ftell lftell ++#endif /* LF64 */ ++ + #ifndef SSTAT +-# define SSTAT stat ++# ifdef _LARGEFILE64_SOURCE ++# define SSTAT stat64 ++# else ++# define SSTAT stat ++# endif /* LF64 */ + #endif + #ifdef S_IFLNK +-# define LSTAT lstat +-# define LSSTAT(n, s) (linkput ? lstat((n), (s)) : SSTAT((n), (s))) ++# ifdef _LARGEFILE64_SOURCE ++# define LSTAT lstat64 ++# define LSSTAT(n, s) (linkput ? lstat64((n), (s)) : SSTAT((n), (s))) ++# else ++# define LSTAT lstat64 ++# define LSSTAT(n, s) (linkput ? lstat64((n), (s)) : SSTAT((n), (s))) ++# endif /* LF64 */ + #else + # define LSTAT SSTAT + # define LSSTAT SSTAT diff --git a/zip-3.0-time.patch b/zip-2.31-time.patch similarity index 98% rename from zip-3.0-time.patch rename to zip-2.31-time.patch index f72fd16..3f272fa 100644 --- a/zip-3.0-time.patch +++ b/zip-2.31-time.patch @@ -1,7 +1,7 @@ --- zip-2.31/unix/Makefile.time 2007-02-07 09:36:30.000000000 +0100 +++ zip-2.31/unix/Makefile 2007-02-07 09:38:42.000000000 +0100 @@ -24,7 +24,7 @@ - E = + EXE = # probably can change this to 'install' if you have it -INSTALL_PROGRAM = cp diff --git a/zip-2.31-umask_mode.patch b/zip-2.31-umask_mode.patch new file mode 100644 index 0000000..ca78af6 --- /dev/null +++ b/zip-2.31-umask_mode.patch @@ -0,0 +1,12 @@ +diff -up zip-2.31/fileio.c.pom zip-2.31/fileio.c +--- zip-2.31/fileio.c.pom 2007-11-05 14:02:41.000000000 +0100 ++++ zip-2.31/fileio.c 2007-11-05 14:03:09.000000000 +0100 +@@ -976,7 +976,7 @@ lfopen(const char *path, const char *mod + prev = mode[x]; + } + +- fd = open(path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); ++ fd = open(path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + if (fd == -1) + return NULL; + diff --git a/zip-3.0-currdir.patch b/zip-3.0-currdir.patch deleted file mode 100644 index 40da32e..0000000 --- a/zip-3.0-currdir.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up zip30/util.c.currdir zip30/util.c ---- zip30/util.c.currdir 2009-11-16 12:42:17.783961701 +0100 -+++ zip30/util.c 2009-11-16 12:42:58.185960707 +0100 -@@ -493,6 +493,8 @@ int cs; /* force case-se - /* Compare the sh pattern p with the string s and return true if they match, - false if they don't or if there is a syntax error in the pattern. */ - { -+ while (s[0] == '.' && s[1] == '/') -+ s += 2; /* strip redundant leading "./" sections */ - return recmatch(p, s, cs) == 1; - } - diff --git a/zip-3.0-exec-shield.patch b/zip-3.0-exec-shield.patch deleted file mode 100644 index 05c1a6c..0000000 --- a/zip-3.0-exec-shield.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up zip30/crc_i386.S.exec_shield zip30/crc_i386.S ---- zip30/crc_i386.S.exec_shield 2009-11-13 18:37:45.000000000 +0100 -+++ zip30/crc_i386.S 2009-11-13 18:39:54.435390166 +0100 -@@ -302,3 +302,6 @@ _crc32: /* ulg c - #endif /* i386 || _i386 || _I386 || __i386 */ - - #endif /* !USE_ZLIB && !CRC_TABLE_ONLY */ -+ -+.section .note.GNU-stack, "", @progbits -+.previous -diff -up zip30/match.S.exec_shield zip30/match.S ---- zip30/match.S.exec_shield 2005-01-28 10:40:14.000000000 +0100 -+++ zip30/match.S 2009-11-13 18:39:48.570389058 +0100 -@@ -405,3 +405,6 @@ L__return: - #endif /* i386 || _I386 || _i386 || __i386 */ - - #endif /* !USE_ZLIB */ -+ -+.section .note.GNU-stack, "", @progbits -+.previous diff --git a/zip-3.0-format-security.patch b/zip-3.0-format-security.patch deleted file mode 100644 index 54ce2e6..0000000 --- a/zip-3.0-format-security.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/zip.c -+++ a/zip.c -@@ -1028,7 +1028,7 @@ local void help_extended() - - for (i = 0; i < sizeof(text)/sizeof(char *); i++) - { -- printf(text[i]); -+ printf("%s", text[i]); - putchar('\n'); - } - #ifdef DOS -@@ -1225,7 +1225,7 @@ local void version_info() - CR_MAJORVER, CR_MINORVER, CR_BETA_VER, CR_VERSION_DATE); - for (i = 0; i < sizeof(cryptnote)/sizeof(char *); i++) - { -- printf(cryptnote[i]); -+ printf("%s", cryptnote[i]); - putchar('\n'); - } - ++i; /* crypt support means there IS at least one compilation option */ diff --git a/zip-3.0-man-strip-extra.patch b/zip-3.0-man-strip-extra.patch deleted file mode 100644 index abb9f7c..0000000 --- a/zip-3.0-man-strip-extra.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ./man/zip.1.old 2024-12-11 10:51:22.837845520 +0100 -+++ ./man/zip.1 2024-12-11 10:51:34.458142392 +0100 -@@ -2297,7 +2297,7 @@ - .B \-X - .TP - .PD --.B \-\-no\-extra -+.B \-\-strip\-extra - Do not save extra file attributes (Extended Attributes on OS/2, uid/gid - and file times on Unix). The zip format uses extra fields to include - additional information for each entry. Some extra fields are specific diff --git a/zip-gnu89-build.patch b/zip-gnu89-build.patch deleted file mode 100644 index 65ee7a7..0000000 --- a/zip-gnu89-build.patch +++ /dev/null @@ -1,15 +0,0 @@ -zip uses C89-only features, so it needs to be built in C89 mode. - -diff --git a/unix/Makefile b/unix/Makefile -index 86cf54bf0f56cea9..244390893eab5fc6 100644 ---- a/unix/Makefile -+++ b/unix/Makefile -@@ -202,7 +202,7 @@ generic: flags - eval $(MAKE) $(MAKEF) zips `cat flags` - - generic_gcc: -- $(MAKE) $(MAKEF) generic CC=gcc CPP="gcc -E" -+ $(MAKE) $(MAKEF) generic CC="gcc -std=gnu89" CPP="gcc -E" - - # AT&T 6300 PLUS (don't know yet how to allocate 64K bytes): - att6300nodir: diff --git a/zip.spec b/zip.spec index d06aaf5..cc991ee 100644 --- a/zip.spec +++ b/zip.spec @@ -1,27 +1,23 @@ Summary: A file compression and packaging utility compatible with PKZIP Name: zip -Version: 3.0 -Release: 46%{?dist} -License: Info-ZIP -Source: http://downloads.sourceforge.net/infozip/zip30.tar.gz -URL: http://www.info-zip.org/Zip.html - -# This patch will probably be merged to zip 3.1 -# http://www.info-zip.org/board/board.pl?m-1249408491/ -Patch1: zip-3.0-exec-shield.patch -# Not upstreamed. -Patch2: zip-3.0-currdir.patch -# Not upstreamed. -Patch3: zip-3.0-time.patch -Patch4: man.patch -Patch5: zip-3.0-format-security.patch -Patch6: zipnote.patch -Patch7: zip-gnu89-build.patch -Patch8: buffer_overflow.patch -Patch9: zip-3.0-man-strip-extra.patch -BuildRequires: make -BuildRequires: bzip2-devel, gcc -Requires: unzip +Version: 2.31 +Release: 6%{?dist} +License: BSD +Group: Applications/Archiving +Source: http://ftp.info-zip.org/pub/infozip/src/zip231.tar.gz +Source1: ftp://ftp.freesoftware.com/pub/infozip/src/zcrypt29.tar.gz +URL: http://www.info-zip.org/pub/infozip/Zip.html +Patch0: zip23.patch +Patch1: exec-shield.patch +Patch2: zip23-umask.patch +Patch5: zip-2.3-currdir.patch +Patch6: zip-2.31-install.patch +Patch7: zip-2.31-near-4GB.patch +Patch8: zip-2.31-configure.patch +Patch9: zip-2.31-time.patch +Patch10: zip-2.3-sf.patch +Patch11: zip-2.31-umask_mode.patch +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description The zip program is a compression and file packaging utility. Zip is @@ -33,200 +29,49 @@ Install the zip package if you need to compress files using the zip program. %prep -%setup -q -n zip30 -%patch -P1 -p1 -b .exec-shield -%patch -P2 -p1 -b .currdir -%patch -P3 -p1 -b .time -%patch -P4 -p1 -b .man -%patch -P5 -p1 -b .format-security -%patch -P6 -p1 -b .zipnote -%patch -P7 -p1 -b .gnu89-build -%patch -P8 -p1 -%patch -P9 -p1 +%setup -q -a 1 +%patch0 -p1 -b .zip +%patch1 -p1 -b .zip +%patch2 -p1 -b .umask +%patch5 -p1 -b .currdir +%patch6 -p1 -b .install +%patch7 -p1 -b .4gb +%patch8 -p1 -b .lhh +%patch9 -p1 -b .time +%patch10 -p1 -b .out +%patch11 -p1 -b .um %build -%{make_build} -f unix/Makefile prefix=%{_prefix} "CFLAGS_NOOPT=-I. -DUNIX $RPM_OPT_FLAGS" generic_gcc +make -f unix/Makefile prefix=%{_prefix} "CFLAGS=$RPM_OPT_FLAGS -I. -DUNIX -D_LARGEFILE64_SOURCE" generic_gcc %{?_smp_mflags} %install -mkdir -p $RPM_BUILD_ROOT%{_bindir} +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT%{_bindir} mkdir -p $RPM_BULD_ROOT%{_mandir}/man1 -%{make_install} -f unix/Makefile prefix=$RPM_BUILD_ROOT%{_prefix} \ - MANDIR=$RPM_BUILD_ROOT%{_mandir}/man1 +make -f unix/Makefile prefix=$RPM_BUILD_ROOT%{_prefix} \ + MANDIR=$RPM_BUILD_ROOT%{_mandir}/man1 install + +pushd $RPM_BUILD_ROOT +for n in zipnote zipsplit zip zipcloak ; do + chmod 755 .%{_bindir}/$n +done +popd + +%clean +rm -rf $RPM_BUILD_ROOT %files -%license LICENSE -%doc README CHANGES TODO WHATSNEW WHERE README.CR +%defattr(-,root,root,-) +%doc README CHANGES TODO WHATSNEW WHERE LICENSE README.CR %doc proginfo/algorith.txt %{_bindir}/zipnote %{_bindir}/zipsplit %{_bindir}/zip %{_bindir}/zipcloak %{_mandir}/man1/zip.1* -%{_mandir}/man1/zipcloak.1* -%{_mandir}/man1/zipnote.1* -%{_mandir}/man1/zipsplit.1* %changelog -* Fri Jul 17 2026 Fedora Release Engineering - 3.0-46 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild - -* Sat Jan 17 2026 Fedora Release Engineering - 3.0-45 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild - -* Fri Jul 25 2025 Fedora Release Engineering - 3.0-44 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Sun Jan 19 2025 Fedora Release Engineering - 3.0-43 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild - -* Wed Dec 11 2024 Jakub Martisko - 3.0-42 -- Fix teh manpage: --no-extra option is actually called --strip-extra - -* Sat Jul 20 2024 Fedora Release Engineering - 3.0-41 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild - -* Sat Jan 27 2024 Fedora Release Engineering - 3.0-40 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild - -* Mon Sep 18 2023 Jakub Martisko - 3.0-39 -- Fixc buffer overflow in unicode file names -Resolves: rhbz#2165653 - -* Sat Jul 22 2023 Fedora Release Engineering - 3.0-38 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild - -* Thu Apr 13 2023 Lukáš Zaoral - 3.0-37 -- migrate to SPDX license format - -* Sat Jan 21 2023 Fedora Release Engineering - 3.0-36 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild - -* Fri Nov 18 2022 Florian Weimer - 3.0-35 -- Really build with -std=gnu89 (#2143565) - -* Thu Nov 17 2022 Florian Weimer - 3.0-34 -- Build with -std=gnu89 (#2143565) - -* Sat Jul 23 2022 Fedora Release Engineering - 3.0-33 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - -* Sat Jan 22 2022 Fedora Release Engineering - 3.0-32 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - -* Fri Jul 23 2021 Fedora Release Engineering - 3.0-31 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild - -* Fri Mar 05 2021 Jakub Martisko - 3.0-30 -- Use generic build instead of generic_gcc - -* Fri Mar 05 2021 Jakub Martisko - 3.0-29 -- Use build macros - -* Thu Jan 28 2021 Fedora Release Engineering - 3.0-28 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild - -* Wed Jul 29 2020 Fedora Release Engineering - 3.0-27 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild - -* Fri Jan 31 2020 Fedora Release Engineering - 3.0-26 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild - -* Sat Jul 27 2019 Fedora Release Engineering - 3.0-25 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - -* Sun Feb 03 2019 Fedora Release Engineering - 3.0-24 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild - -* Sat Jul 14 2018 Fedora Release Engineering - 3.0-23 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - -* Thu Mar 01 2018 Jakub Martisko - 3.0-22 -- Add gcc to buildrequires - -* Fri Feb 09 2018 Fedora Release Engineering - 3.0-21 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Thu Aug 03 2017 Fedora Release Engineering - 3.0-20 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Thu Jul 27 2017 Fedora Release Engineering - 3.0-19 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Sat Feb 11 2017 Fedora Release Engineering - 3.0-18 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - -* Wed Feb 01 2017 Stephen Gallagher - 3.0-17 -- Add missing %%license macro - -* Fri Feb 05 2016 Fedora Release Engineering - 3.0-16 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild - -* Fri Jun 26 2015 Petr Stodulka - 3.0-15 -- Added requirement for unzip (#1235956) - -* Fri Jun 19 2015 Fedora Release Engineering - 3.0-14 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild - -* Wed Jan 28 2015 Petr Stodulka - 3.0-13 -- fix crashing zipnote when editing .zip files (#1179420) - -* Mon Aug 18 2014 Fedora Release Engineering - 3.0-12 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild - -* Sat Jun 07 2014 Fedora Release Engineering - 3.0-11 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild - -* Tue Apr 1 2014 Peter Robinson 3.0-10 -- Add patch to fix format-security FTBFS (RHBZ 1037412) - -* Sun Aug 04 2013 Fedora Release Engineering - 3.0-9 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild - -* Fri Apr 26 2013 Michal Luscon - 3.0-8 -- Fix missing -q option in zipsplit and zipnote man pages - -* Sat Feb 23 2013 Ville Skyttä - 3.0-7 -- Enable bzip2 support. -- Fix bogus date in %%changelog. - -* Fri Feb 15 2013 Fedora Release Engineering - 3.0-6 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild - -* Sun Jul 22 2012 Fedora Release Engineering - 3.0-5 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild - -* Sat Jan 14 2012 Fedora Release Engineering - 3.0-4 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild - -* Tue Feb 08 2011 Fedora Release Engineering - 3.0-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild - -* Mon May 24 2010 Karel Klic - 3.0-2 -- Removed BuildRoot tag -- Removed %%clean section -- Removed trailing whitespaces in the spec file - -* Fri Nov 13 2009 Karel Klic - 3.0-1 -- New upstream version -- Removed zip23.patch, because ZMEM is not used anyway -- Removed zip-2.31-install.patch, problem solved in upstream -- Removed zip23-umask.patch, upstream uses mkstemp which solves the problem -- Removed zip-2.31-near-4GB.patch, because upstream version - handles large files well -- Removed zip-2.31-configure.patch, configure is better in the current version -- Removed zip-2.3-sf.patch, the error message doesn't exist in upstream anymore -- Removed zip-2.31-umask_mode.patch, which fixes also removed near-4GB patch -- Updated zip-2.31-time.patch for zip 3.0 -- Updated exec-shield.patch for zip 3.0 -- Updated zip-2.3-currdir.patch for zip 3.0 - -* Mon Jul 27 2009 Fedora Release Engineering - 2.31-8 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild - -* Wed Feb 25 2009 Fedora Release Engineering - 2.31-7 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild - * Wed Feb 20 2008 Fedora Release Engineering - 2.31-6 - Autorebuild for GCC 4.3 @@ -242,7 +87,7 @@ Resolves: rhbz#2165653 - incorporate the next peckage review comment * Tue Feb 6 2007 Ivana Varekova - 2.31-2 -- incorporate the package review +- incorporate the package review * Wed Jul 12 2006 Jesse Keating - 2.31-1.2.2 - rebuild @@ -311,7 +156,7 @@ Resolves: rhbz#2165653 * Sun Jun 24 2001 Elliot Lee - Bump release + rebuild. -* Fri Aug 25 2000 Bill Nottingham +* Thu Aug 25 2000 Bill Nottingham - add encryption code (#16878) * Thu Jul 13 2000 Prospector diff --git a/zip23-umask.patch b/zip23-umask.patch new file mode 100644 index 0000000..7ab6005 --- /dev/null +++ b/zip23-umask.patch @@ -0,0 +1,23 @@ +diff -ur zip-2.3/zip.c zip-2.3-lhh/zip.c +--- zip-2.3/zip.c 1999-11-16 15:08:10.000000000 -0500 ++++ zip-2.3-lhh/zip.c 2003-12-22 09:32:56.000000000 -0500 +@@ -849,6 +849,7 @@ + /* Add, update, freshen, or delete zip entries in a zip file. See the + command help in help() above. */ + { ++ mode_t old_umask; /* umask prior to temp file creation */ + int a; /* attributes of zip file */ + ulg c; /* start of central directory */ + int d; /* true if just adding to a zip file */ +@@ -1830,9 +1831,11 @@ + if ((tempzip = tempname(zipfile)) == NULL) { + ZIPERR(ZE_MEM, "allocating temp filename"); + } ++ old_umask = umask(0066); + if ((tempzf = y = fopen(tempzip, FOPW_TMP)) == NULL) { + ZIPERR(ZE_TEMP, tempzip); + } ++ umask(old_umask); + } + + #if (!defined(VMS) && !defined(CMS_MVS)) diff --git a/zip23.patch b/zip23.patch new file mode 100644 index 0000000..690630c --- /dev/null +++ b/zip23.patch @@ -0,0 +1,93 @@ +--- zip-2.3/zip.h.zip Mon Nov 8 14:36:51 1999 ++++ zip-2.3/zip.h Tue Jan 11 11:46:06 2000 +@@ -60,6 +60,7 @@ + + /* Set up portability */ + #include "tailor.h" ++#include + + #ifdef USE_ZLIB + # include "zlib.h" +@@ -433,12 +434,6 @@ + int setfileattr OF((char *, int)); + char *tempname OF((char *)); + int fcopy OF((FILE *, FILE *, ulg)); +- +-#ifdef ZMEM +- char *memset OF((char *, int, unsigned int)); +- char *memcpy OF((char *, char *, unsigned int)); +- int memcmp OF((char *, char *, unsigned int)); +-#endif /* ZMEM */ + + /* in system dependent fileio code (.c) */ + #ifndef UTIL +--- zip-2.3/fileio.c.zip Sun Nov 7 05:29:03 1999 ++++ zip-2.3/fileio.c Tue Jan 11 11:46:43 2000 +@@ -918,67 +918,3 @@ + } + + #endif /* NO_RENAME */ +- +- +-#ifdef ZMEM +- +-/************************/ +-/* Function memset() */ +-/************************/ +- +-/* +- * memset - for systems without it +- * bill davidsen - March 1990 +- */ +- +-char * +-memset(buf, init, len) +-register char *buf; /* buffer loc */ +-register int init; /* initializer */ +-register unsigned int len; /* length of the buffer */ +-{ +- char *start; +- +- start = buf; +- while (len--) *(buf++) = init; +- return(start); +-} +- +- +-/************************/ +-/* Function memcpy() */ +-/************************/ +- +-char * +-memcpy(dst,src,len) /* v2.0f */ +-register char *dst, *src; +-register unsigned int len; +-{ +- char *start; +- +- start = dst; +- while (len--) +- *dst++ = *src++; +- return(start); +-} +- +- +-/************************/ +-/* Function memcmp() */ +-/************************/ +- +-int +-memcmp(b1,b2,len) /* jpd@usl.edu -- 11/16/90 */ +-register char *b1, *b2; +-register unsigned int len; +-{ +- +- if (len) do { /* examine each byte (if any) */ +- if (*b1++ != *b2++) +- return (*((uch *)b1-1) - *((uch *)b2-1)); /* exit when miscompare */ +- } while (--len); +- +- return(0); /* no miscompares, yield 0 result */ +-} +- +-#endif /* ZMEM */ diff --git a/zipnote.patch b/zipnote.patch deleted file mode 100644 index 4177a7d..0000000 --- a/zipnote.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/zipnote.c b/zipnote.c -index 5e02cb6..996f012 100644 ---- a/zipnote.c -+++ b/zipnote.c -@@ -661,7 +661,7 @@ char **argv; /* command line tokens */ - if ((r = zipcopy(z)) != ZE_OK) - ziperr(r, "was copying an entry"); - } -- fclose(x); -+ fclose(in_file); - - /* Write central directory and end of central directory with new comments */ - if ((c = zftello(y)) == (zoff_t)-1) /* get start of central */