diff --git a/.gitignore b/.gitignore index e69de29..fc341fe 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +zip30.tar.gz diff --git a/man.patch b/man.patch new file mode 100644 index 0000000..9ba44c8 --- /dev/null +++ b/man.patch @@ -0,0 +1,40 @@ +--- ./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 new file mode 100644 index 0000000..225e991 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +7b74551e63f8ee6aab6fbc86676c0d37 zip30.tar.gz diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..930837a --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,47 @@ +--- +- 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 new file mode 100755 index 0000000..471b567 --- /dev/null +++ b/tests/tests/__init__.py @@ -0,0 +1,154 @@ +''' + 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 new file mode 100755 index 0000000..f11b99d --- /dev/null +++ b/tests/tests/test_4GBsegfault.py @@ -0,0 +1,89 @@ +# 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 new file mode 100755 index 0000000..c758674 --- /dev/null +++ b/tests/tests/test_big_file_in_archive.py @@ -0,0 +1,128 @@ +# 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 new file mode 100755 index 0000000..4f4d8ce --- /dev/null +++ b/tests/tests/test_long_path_in_archive.py @@ -0,0 +1,140 @@ +# 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 new file mode 100755 index 0000000..9382675 --- /dev/null +++ b/tests/tests/test_many_files_in_archive.py @@ -0,0 +1,140 @@ +# 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 new file mode 100755 index 0000000..f4df00e --- /dev/null +++ b/tests/tests/test_umask.py @@ -0,0 +1,106 @@ +# 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 new file mode 100755 index 0000000..a59a573 --- /dev/null +++ b/tests/tests/test_umask_when_creating.py @@ -0,0 +1,105 @@ +# 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 new file mode 100755 index 0000000..747cf40 --- /dev/null +++ b/tests/tests/test_zipnote_fails_to_update_the_archive.py @@ -0,0 +1,105 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# 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-3.0-currdir.patch b/zip-3.0-currdir.patch new file mode 100644 index 0000000..40da32e --- /dev/null +++ b/zip-3.0-currdir.patch @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..05c1a6c --- /dev/null +++ b/zip-3.0-exec-shield.patch @@ -0,0 +1,20 @@ +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 new file mode 100644 index 0000000..54ce2e6 --- /dev/null +++ b/zip-3.0-format-security.patch @@ -0,0 +1,20 @@ +--- 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-time.patch b/zip-3.0-time.patch new file mode 100644 index 0000000..f72fd16 --- /dev/null +++ b/zip-3.0-time.patch @@ -0,0 +1,11 @@ +--- 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 = + + # probably can change this to 'install' if you have it +-INSTALL_PROGRAM = cp ++INSTALL_PROGRAM = cp -p + # probably can change this to 'install -d' if you have it + # XXX NextStep 3.3 and Openstep 4.x don't know about -p ! + INSTALL_D = mkdir -p diff --git a/zip.spec b/zip.spec new file mode 100644 index 0000000..a20f37c --- /dev/null +++ b/zip.spec @@ -0,0 +1,293 @@ +Summary: A file compression and packaging utility compatible with PKZIP +Name: zip +Version: 3.0 +Release: 27%{?dist} +License: BSD +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 +BuildRequires: bzip2-devel, gcc +Requires: unzip + +%description +The zip program is a compression and file packaging utility. Zip is +analogous to a combination of the UNIX tar and compress commands and +is compatible with PKZIP (a compression and file packaging utility for +MS-DOS systems). + +Install the zip package if you need to compress files using the zip +program. + +%prep +%setup -q -n zip30 +%patch1 -p1 -b .exec-shield +%patch2 -p1 -b .currdir +%patch3 -p1 -b .time +%patch4 -p1 -b .man +%patch5 -p1 -b .format-security +%patch6 -p1 -b .zipnote + +%build +make -f unix/Makefile prefix=%{_prefix} "CFLAGS_NOOPT=-I. -DUNIX $RPM_OPT_FLAGS" generic_gcc %{?_smp_mflags} + +%install +mkdir -p $RPM_BUILD_ROOT%{_bindir} +mkdir -p $RPM_BULD_ROOT%{_mandir}/man1 + +make -f unix/Makefile prefix=$RPM_BUILD_ROOT%{_prefix} \ + MANDIR=$RPM_BUILD_ROOT%{_mandir}/man1 install + +%files +%license LICENSE +%doc README CHANGES TODO WHATSNEW WHERE 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 +* 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 + +* Wed Nov 14 2007 Ivana Varekova - 2.31-5 +- add S_IWOTH option + +* Mon Nov 5 2007 Ivana Varekova - 2.31-4 +- fix "zip does not honor umask setting when creating archives" +- fix "zip segfaults by attempt to archive big file" +- spec file cleanup + +* Wed Feb 7 2007 Ivana Varekova - 2.31-3 +- incorporate the next peckage review comment + +* Tue Feb 6 2007 Ivana Varekova - 2.31-2 +- incorporate the package review + +* Wed Jul 12 2006 Jesse Keating - 2.31-1.2.2 +- rebuild + +* Fri Feb 10 2006 Jesse Keating - 2.31-1.2.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 2.31-1.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Thu Nov 10 2005 Ivana Varekova 2.31-1 +- update to 2.31 + +* Mon Mar 7 2005 Ivana Varekova 2.3-30 +- rebuilt + +* Mon Jan 17 2005 Ivana Varekova 2.3-29 +- Fix bug #142237 - problem with -d and ./files containing archives + +* Mon Jun 21 2004 Lon Hohberger 2.3-24 +- Extend max file/archive size to 2^32-8193 (4294959103) bytes +- Include better debugging output for configure script + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Fri Mar 19 2004 Lon Hohberger 2.3-22 +- Fix typos + +* Tue Feb 17 2004 Lon Hohberger 2.3-21 +- Include LICENSE file per bugzilla #116004 + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Mon Dec 22 2003 Lon Hohberger 2.3-19 +- Make temp file have umask 0066 mode (#112516) + +* Fri Oct 24 2003 Lon Hohberger 2.3-18 +- Incorporate Arjan's exec-shield patch for i386 + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Thu Dec 19 2002 Tim Powers +- bump and rebuild + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Tue Apr 2 2002 Trond Eivind Glomsrød +- Don't strip explicitly + +* Wed Mar 13 2002 Trond Eivind Glomsrød 2.3-11 +- Add URL + +* Sun Jun 24 2001 Elliot Lee +- Bump release + rebuild. + +* Fri Aug 25 2000 Bill Nottingham +- add encryption code (#16878) + +* Thu Jul 13 2000 Prospector +- automatic rebuild + +* Sun Jun 11 2000 Bill Nottingham +- rebuild in new environment + +* Mon Mar 13 2000 Bill Nottingham +- spec file cleanups (#10143) + +* Mon Feb 7 2000 Bill Nottingham +- fix some perms + +* Wed Feb 02 2000 Cristian Gafton +- fix description +- man pages are compressed + +* Tue Jan 11 2000 Bill Nottingham +- update to 2.3 + +* Fri Jul 30 1999 Bill Nottingham +- update to 2.2 + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 8) + +* Thu Mar 18 1999 Cristian Gafton +- updated text in the spec file + +* Fri Jan 15 1999 Cristian Gafton +- patch top build on the arm + +* Mon Dec 21 1998 Michael Maher +- built package for 6.0 + +* Mon Aug 10 1998 Jeff Johnson +- build root + +* Fri May 08 1998 Prospector System +- translations modified for de, fr, tr + +* Thu Jul 10 1997 Erik Troan +- built against glibc diff --git a/zipnote.patch b/zipnote.patch new file mode 100644 index 0000000..4177a7d --- /dev/null +++ b/zipnote.patch @@ -0,0 +1,13 @@ +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 */