diff --git a/0001-FIX-port-documentation-scripts-to-python3.patch b/0001-FIX-port-documentation-scripts-to-python3.patch
deleted file mode 100644
index ba0cba3ab82791973444337bda49a16d080c5ee5..0000000000000000000000000000000000000000
--- a/0001-FIX-port-documentation-scripts-to-python3.patch
+++ /dev/null
@@ -1,850 +0,0 @@
-From f04dd2918b15853e866d3941b72005696c8c3b8f Mon Sep 17 00:00:00 2001
-From: Jakub Martisko
-Date: Tue, 3 Jul 2018 09:33:07 +0200
-Subject: [PATCH] FIX: port documentation scripts to python3
-
----
- configure | 2 +-
- configure.ac | 2 +-
- docs/cpp2markdown-1.py | 9 ++++--
- docs/cpp2markdown.py | 6 ++--
- docs/make-doc.py | 56 ++++++++++++++++++-----------------
- docs/makedocs.py | 26 ++++++++--------
- docs/zzipdoc/commentmarkup.py | 5 ++--
- docs/zzipdoc/dbk2htm.py | 5 ++--
- docs/zzipdoc/docbookdocument.py | 34 +++++++++++----------
- docs/zzipdoc/functionheader.py | 3 +-
- docs/zzipdoc/functionlisthtmlpage.py | 14 +++++----
- docs/zzipdoc/functionlistreference.py | 8 +++--
- docs/zzipdoc/functionprototype.py | 3 +-
- docs/zzipdoc/htm2dbk.py | 10 ++++---
- docs/zzipdoc/htmldocument.py | 34 +++++++++++----------
- docs/zzipdoc/match.py | 17 ++++++-----
- docs/zzipdoc/options.py | 5 ++--
- docs/zzipdoc/textfile.py | 6 ++--
- docs/zzipdoc/textfileheader.py | 6 ++--
- 18 files changed, 140 insertions(+), 109 deletions(-)
-
-diff --git a/configure b/configure
-index 72a5b6c..6ff3ee4 100755
---- a/configure
-+++ b/configure
-@@ -12270,7 +12270,7 @@ fi
- done
- test -n "$PERL" || PERL="echo no perl found for"
-
--for ac_prog in python
-+for ac_prog in python3
- do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
- set dummy $ac_prog; ac_word=$2
-diff --git a/configure.ac b/configure.ac
-index 4708f8d..68aeb73 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -87,7 +87,7 @@ AX_CREATE_PKGCONFIG_INFO(dnl
- AX_PAX_TAR_CREATE
- AX_PAX_TAR_EXTRACT
- AC_PATH_PROGS(PERL, perl5 perl, echo no perl found for)
--AC_PATH_PROGS(PYTHON, python, echo no python found for)
-+AC_PATH_PROGS(PYTHON, python3, echo no python found for)
- AC_PATH_PROGS(MKZIP, zip pkzip, :)
- AC_PATH_PROGS(XMLTO, xmlto, :)
-
-diff --git a/docs/cpp2markdown-1.py b/docs/cpp2markdown-1.py
-index 60d28c4..1deaed9 100755
---- a/docs/cpp2markdown-1.py
-+++ b/docs/cpp2markdown-1.py
-@@ -1,9 +1,12 @@
- #! /usr/bin/env python
-+from __future__ import absolute_import
-+from __future__ import print_function
- import pygments.lexers.compiled as lexer
- import optparse
- import re
- from pygments.token import Token
- import logging
-+from six.moves import range
-
- logg = logging.getLogger(__name__)
-
-@@ -39,7 +42,7 @@ class CppToMarkdown:
- check2 = re.compile(r"^\s[*]\s+\b[Cc]opyright\b")
- empty1 = re.compile(r"^\s[*]\s*$")
- state = "intro"
-- for i in xrange(1,len(lines)-1):
-+ for i in range(1,len(lines)-1):
- line = lines[i]
- if state == "intro":
- if empty1.match(line):
-@@ -108,7 +111,7 @@ class CppToMarkdown:
- def run(self, filename):
- filetext = open(filename).read()
- for line in self.process(filetext, filename):
-- print line
-+ print(line)
- def process(self, filetext, filename=""):
- section_ruler = "-----------------------------------------"
- copyright = ""
-@@ -136,7 +139,7 @@ class CppToMarkdown:
- else:
- if text:
- yield "#### NOTES"
-- print token, text.replace("\n", "\n ")
-+ print(token, text.replace("\n", "\n "))
- if copyright:
- yield section_ruler
- yield "### COPYRIGHT"
-diff --git a/docs/cpp2markdown.py b/docs/cpp2markdown.py
-index 710bbdc..b8fe11d 100644
---- a/docs/cpp2markdown.py
-+++ b/docs/cpp2markdown.py
-@@ -1,3 +1,5 @@
-+from __future__ import absolute_import
-+from __future__ import print_function
- import pygments.lexers.compiled as lexer
- import optparse
- import re
-@@ -62,7 +64,7 @@ class CppToMarkdown:
- def run(self, filename):
- filetext = open(filename).read()
- for line in self.process(filetext, filename):
-- print line
-+ print(line)
- def process(self, filetext, filename=""):
- for token, text in self.parse(filetext):
- if token == FileInclude:
-@@ -86,7 +88,7 @@ class CppToMarkdown:
- else:
- if text:
- yield "#### NOTES"
-- print token, text.replace("\n", "\n ")
-+ print(token, text.replace("\n", "\n "))
- def isexported_function(self):
- function = self.function_text.strip().replace("\n"," ")
- logg.debug("@ --------------------------------------")
-diff --git a/docs/make-doc.py b/docs/make-doc.py
-index f12553f..22775ef 100644
---- a/docs/make-doc.py
-+++ b/docs/make-doc.py
-@@ -1,5 +1,7 @@
- #! /usr/bin/python
- # -*- coding: UTF-8 -*-
-+from __future__ import absolute_import
-+from __future__ import print_function
- import sys
- import re
- import string
-@@ -23,7 +25,7 @@ def s(string, pattern, repl, count=0):
- def m(string, pattern):
- return re.match(pattern, string)
- def sorted_keys(dict):
-- keys = dict.keys()
-+ keys = list(dict.keys())
- keys.sort()
- return keys
-
-@@ -59,18 +61,18 @@ def section2html(text):
- "" : "", "
" : "
" ,
- "" : "", "" : "" }
- for str in mapping:
-- text = string.replace(text, str, mapping[str])
-+ text = text.replace(str, mapping[str])
- return text
- def html(text):
- return section2html(paramdef2html(text))
- def cdata1(text):
-- return string.replace(text, "&", "&")
-+ return text.replace("&", "&")
- def cdata31(text):
-- return string.replace(string.replace(text, "<","<"), ">",">")
-+ return text.replace(text, "<","<").replace( ">",">")
- def cdata3(text):
- return cdata31(cdata1(text))
- def cdata43(text):
-- return string.replace(text,"\"", """)
-+ return text.replace("\"", """)
- def cdata41(text):
- return cdata43(cdata31(text))
- def cdata4(text):
-@@ -126,7 +128,7 @@ def this_function_link(text, name):
- class Options:
- var = {}
- def __getattr__(self, name):
-- if not self.var.has_key(name): return None
-+ if name not in self.var: return None
- return self.var[name]
- def __setattr__(self, name, value):
- self.var[name] = value
-@@ -158,7 +160,7 @@ class File:
- self.copyright = ""
- def __getattr__(self, name):
- """ defend against program to break on uninited members """
-- if self.__dict__.has_key(name): return self.__dict__[name]
-+ if name in self.__dict__: return self.__dict__[name]
- warn("no such member: "+name); return None
- def set_author(self, text):
- if self.authors:
-@@ -215,7 +217,7 @@ def scan_options (options, list):
- #else
- try:
- input = open(name, "r")
-- except IOError, error:
-+ except IOError as error:
- warn(#...... (scan_options) ...............
- "can not open input file: "+name, error)
- continue
-@@ -294,12 +296,12 @@ class Function:
- # return ""
- def __getattr__(self, name):
- """ defend against program exit on members being not inited """
-- if self.__dict__.has_key(name): return self.__dict__[name]
-+ if name in self.__dict__: return self.__dict__[name]
- warn("no such member: "+name); return None
- def dict(self):
- return self.__dict__
- def dict_sorted_keys(self):
-- keys = self.__dict__.keys()
-+ keys = list(self.__dict__.keys())
- keys.sort()
- return keys
- def parse(self, prototype):
-@@ -376,7 +378,7 @@ def examine_head_anchors(func_list):
- function.head = s(function.head, r"(.*)also:(.*)", lambda x
- : set_seealso(function, x.group(2)) and x.group(1))
- if function.seealso and None:
-- print "function[",function.name,"].seealso=",function.seealso
-+ print("function[",function.name,"].seealso=",function.seealso)
- examine_head_anchors(function_list)
-
- # =============================================================== HTML =====
-@@ -455,7 +457,7 @@ def combined_html_pages(func_list):
- s(ensure_name(this_function_link(section2html( func.body ),
- func.name), func.name),
- r"(?sx) (?para>\s*)
", r"\1"))
-- return combined.values()
-+ return list(combined.values())
- html_pages = combined_html_pages(function_list)
-
- def html_resolve_links_on_page(text, list):
-@@ -495,7 +497,7 @@ class HtmlPage:
- return T
- def add_page_map(self, list):
- """ generate the index-block at the start of the onepage-html file """
-- keys = list.keys()
-+ keys = list(list.keys())
- keys.sort()
- for name in keys:
- self.toc += "\n"+ \
-@@ -524,11 +526,11 @@ html.add_page_list(html_pages)
- # and finally print the html-formatted output
- try:
- F = open(o.libhtmlfile, "w")
--except IOError, error:
-+except IOError as error:
- warn(# ............. open(o.libhtmlfile, "w") ..............
- "can not open html output file: "+o.libhtmlfile, error)
- else:
-- print >> F, html.page_text()
-+ print(html.page_text(), file=F)
- F.close()
- #fi
-
-@@ -987,40 +989,40 @@ doctype += '"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">'+"\n"
-
- try:
- F = open(o.docbookfile,"w")
--except IOError, error:
-+except IOError as error:
- warn("can not open docbook output file: "+o.docbookfile, error)
- else:
-- print >> F, doctype, 'Manual Pages'
-+ print(doctype, 'Manual Pages', file=F)
-
- for page in combined_pages:
-- print >> F, page.refentry_text()
-+ print(page.refentry_text(), file=F)
- #od
-
- for page in header_refpages.values():
- if not page.refentry: continue
-- print >> F, "\n",
-- print >> F, page.refentry_text()
-+ print("\n", end=' ', file=F)
-+ print(page.refentry_text(), file=F)
- #od
-
-- print >> F, "\n",'',"\n"
-+ print("\n",'',"\n", file=F)
- F.close()
- #fi
-
- # _____________________________________________________________________
- try:
- F = open( o.dumpdocfile, "w")
--except IOError, error:
-+except IOError as error:
- warn ("can not open"+o.dumpdocfile,error)
- else:
- for func in function_list:
- name = func.name
-- print >> F, ""+"\n"
-+ print(""+"\n", file=F)
- for H in sorted_keys(func.dict()):
-- print >> F, "<"+H+" name=\""+name+"\">",
-- print >> F, str(func.dict()[H]),
-- print >> F, ""+H+">"
-+ print("<"+H+" name=\""+name+"\">", end=' ', file=F)
-+ print(str(func.dict()[H]), end=' ', file=F)
-+ print(""+H+">", file=F)
- #od
-- print >> F, "\n\n";
-+ print("\n\n", file=F);
- #od
- F.close();
- #fi
-diff --git a/docs/makedocs.py b/docs/makedocs.py
-index 1bc8f88..d987292 100644
---- a/docs/makedocs.py
-+++ b/docs/makedocs.py
-@@ -1,3 +1,5 @@
-+from __future__ import absolute_import
-+from __future__ import print_function
- import sys
- from zzipdoc.match import *
- from zzipdoc.options import *
-@@ -37,7 +39,7 @@ class PerFile:
- return None
- def print_list_mainheader(self):
- for t_fileheader in self.headers:
-- print t_fileheader.get_filename(), t_fileheader.src_mainheader()
-+ print(t_fileheader.get_filename(), t_fileheader.src_mainheader())
-
- class PerFunctionEntry:
- def __init__(self, header, comment, prototype):
-@@ -66,10 +68,10 @@ class PerFunction:
- functionprototype) ]
- def print_list_titleline(self):
- for funcheader in self.headers:
-- print funcheader.get_filename(), "[=>]", funcheader.get_titleline()
-+ print(funcheader.get_filename(), "[=>]", funcheader.get_titleline())
- def print_list_name(self):
- for funcheader in self.prototypes:
-- print funcheader.get_filename(), "[>>]", funcheader.get_name()
-+ print(funcheader.get_filename(), "[>>]", funcheader.get_name())
-
- class PerFunctionFamilyEntry:
- def __init__(self, leader):
-@@ -122,12 +124,12 @@ class PerFunctionFamily:
- for name in self.retarget:
- into = self.retarget[name]
- if into not in name_list:
-- print ("function '"+name+"' retarget into '"+into+
-- "' does not exist - keep alone")
-+ print(("function '"+name+"' retarget into '"+into+
-+ "' does not exist - keep alone"))
- if into in self.retarget:
- other = self.retarget[into]
-- print ("function '"+name+"' retarget into '"+into+
-- "' which is itself a retarget into '"+other+"'")
-+ print(("function '"+name+"' retarget into '"+into+
-+ "' which is itself a retarget into '"+other+"'"))
- if into not in lead_list:
- lead_list += [ into ]
- for func in self.functions:
-@@ -141,7 +143,7 @@ class PerFunctionFamily:
- entry.add(func) # the first
- self.entries += [ entry ]
- else:
-- print "head function '"+name+" has no entry"
-+ print("head function '"+name+" has no entry")
- for func in self.functions:
- name = func.get_name()
- if name in self.retarget:
-@@ -150,14 +152,14 @@ class PerFunctionFamily:
- if entry is not None:
- entry.add(func) # will not add duplicates
- else:
-- print "into function '"+name+" has no entry"
-+ print("into function '"+name+" has no entry")
- def print_list_name(self):
- for family in self.entries:
- name = family.get_name()
-- print name, ":",
-+ print(name, ":", end=' ')
- for item in family.functions:
-- print item.get_name(), ",",
-- print ""
-+ print(item.get_name(), ",", end=' ')
-+ print("")
- class HtmlManualPageAdapter:
- def __init__(self, entry):
- """ usually takes a PerFunctionEntry """
-diff --git a/docs/zzipdoc/commentmarkup.py b/docs/zzipdoc/commentmarkup.py
-index 3f605a7..31727a3 100644
---- a/docs/zzipdoc/commentmarkup.py
-+++ b/docs/zzipdoc/commentmarkup.py
-@@ -1,4 +1,5 @@
--from match import Match
-+from __future__ import absolute_import
-+from .match import Match
-
- def markup_link_syntax(text):
- """ markup the link-syntax ` => somewhere ` in the text block """
-@@ -31,7 +32,7 @@ class CommentMarkup:
- comment = self.header.comment
- try:
- comment = self.header.get_otherlines()
-- except Exception, e:
-+ except Exception as e:
- pass
- mode = ""
- text = ""
-diff --git a/docs/zzipdoc/dbk2htm.py b/docs/zzipdoc/dbk2htm.py
-index f8593e6..2b68e95 100644
---- a/docs/zzipdoc/dbk2htm.py
-+++ b/docs/zzipdoc/dbk2htm.py
-@@ -1,4 +1,5 @@
--from match import Match
-+from __future__ import absolute_import
-+from .match import Match
- import string
-
- class dbk2htm_conversion:
-@@ -9,7 +10,7 @@ class dbk2htm_conversion:
- pass
- def section2html(self, text):
- for str in self.mapping:
-- text = string.replace(text, str, self.mapping[str])
-+ text = text.replace(str, self.mapping[str])
- return text
- def paramdef2html(self, text):
- s = Match()
-diff --git a/docs/zzipdoc/docbookdocument.py b/docs/zzipdoc/docbookdocument.py
-index c4602ad..44a0b23 100644
---- a/docs/zzipdoc/docbookdocument.py
-+++ b/docs/zzipdoc/docbookdocument.py
-@@ -1,6 +1,8 @@
- #! /usr/bin/env python
- # -*- coding: UTF-8 -*-
--from match import Match
-+from __future__ import absolute_import
-+from __future__ import print_function
-+from .match import Match
-
- class DocbookDocument:
- """ binds some xml content page with additional markup - in this
-@@ -23,14 +25,14 @@ class DocbookDocument:
- def get_title(self):
- if self.title: return title
- try: return self.text[0].get_title()
-- except Exception, e: pass
-+ except Exception as e: pass
- return self.title
- def _xml_doctype(self, rootnode):
- return ""
- def _xml_text(self, xml):
- """ accepts adapter objects with .xml_text() """
- try: return xml.xml_text()
-- except Exception, e: print "DocbookDocument/text", e; pass
-+ except Exception as e: print("DocbookDocument/text", e); pass
- return str(xml)
- def _fetch_rootnode(self, text):
- fetch = Match(r"^[^<>]*<(\w+)\b")
-@@ -47,7 +49,7 @@ class DocbookDocument:
- return filename
- def save(self, filename = None):
- filename = self._filename(filename)
-- print "writing '"+filename+"'"
-+ print("writing '"+filename+"'")
- if len(self.text) > 1:
- self.save_all(filename)
- else:
-@@ -58,12 +60,12 @@ class DocbookDocument:
- xml_text = self._xml_text(text)
- rootnode = self._fetch_rootnode(xml_text)
- doctype = self._xml_doctype(rootnode)
-- print >>fd, doctype
-- print >>fd, xml_text
-+ print(doctype, file=fd)
-+ print(xml_text, file=fd)
- fd.close()
- return True
-- except IOError, e:
-- print "could not open '"+filename+"'file", e
-+ except IOError as e:
-+ print("could not open '"+filename+"'file", e)
- return False
- def save_all(self, filename):
- assert len(self.text) > 1
-@@ -76,20 +78,20 @@ class DocbookDocument:
- else:
- rootnode = self.rootnode
- doctype = self._xml_doctype(rootnode)
-- print >>fd, doctype
-+ print(doctype, file=fd)
- title = self.get_title()
- if title and self.rootnode in self.has_title_child:
-- print >>fd, "<"+self.rootnode+'>'+title+''
-+ print("<"+self.rootnode+'>'+title+'', file=fd)
- elif title:
-- print >>fd, "<"+self.rootnode+' id="'+title+'">'
-+ print("<"+self.rootnode+' id="'+title+'">', file=fd)
- else:
-- print >>fd, "<"+self.rootnode+'>'
-+ print("<"+self.rootnode+'>', file=fd)
- for text in self.text:
- text = self._xml_text(text)
-- print >>fd, text
-- print >>fd, ""+self.rootnode+">"
-+ print(text, file=fd)
-+ print(""+self.rootnode+">", file=fd)
- fd.close()
- return True
-- except IOError, e:
-- print "could not open '"+filename+"'file", e
-+ except IOError as e:
-+ print("could not open '"+filename+"'file", e)
- return False
-diff --git a/docs/zzipdoc/functionheader.py b/docs/zzipdoc/functionheader.py
-index 81bb385..a424a6d 100644
---- a/docs/zzipdoc/functionheader.py
-+++ b/docs/zzipdoc/functionheader.py
-@@ -1,4 +1,5 @@
--from match import Match
-+from __future__ import absolute_import
-+from .match import Match
-
- class FunctionHeader:
- """ parsing the comment block that is usually presented before
-diff --git a/docs/zzipdoc/functionlisthtmlpage.py b/docs/zzipdoc/functionlisthtmlpage.py
-index 4ec9178..8009194 100644
---- a/docs/zzipdoc/functionlisthtmlpage.py
-+++ b/docs/zzipdoc/functionlisthtmlpage.py
-@@ -1,5 +1,7 @@
--from options import *
--from match import Match
-+from __future__ import absolute_import
-+from __future__ import print_function
-+from .options import *
-+from .match import Match
-
- class FunctionListHtmlPage:
- """ The main part here is to create a TOC (table of contents) at the
-@@ -35,7 +37,7 @@ class FunctionListHtmlPage:
- head_text = entry.head_xml_text()
- body_text = entry.body_xml_text(name)
- if not head_text:
-- print "no head_text for", name
-+ print("no head_text for", name)
- return
- try:
- prespec = entry.head_get_prespec()
-@@ -43,7 +45,7 @@ class FunctionListHtmlPage:
- callspec = entry.head_get_callspec()
- head_text = (""+namespec+""
- +callspec+" : "+prespec+"
")
-- except Exception, e:
-+ except Exception as e:
- pass
- try:
- extraline = ""
-@@ -56,7 +58,7 @@ class FunctionListHtmlPage:
- ''+filename+''+
- '')
- body_text = extraline + body_text
-- except Exception, e:
-+ except Exception as e:
- pass
- def link(text):
- return (text & Match("(\w*)")
-@@ -102,7 +104,7 @@ class FunctionListHtmlPage:
- text &= (Match("(?s)(\w+)")
- >> (lambda x: self.resolve_internal(x.group(1))))
- if len(self.not_found_in_anchors):
-- print "not found in anchors: ", self.not_found_in_anchors
-+ print("not found in anchors: ", self.not_found_in_anchors)
- return (text & Match("(?s)([^<>]*)")
- >> "\\1
")
- def resolve_external(self, func, sect):
-diff --git a/docs/zzipdoc/functionlistreference.py b/docs/zzipdoc/functionlistreference.py
-index c38ff0a..5993d45 100644
---- a/docs/zzipdoc/functionlistreference.py
-+++ b/docs/zzipdoc/functionlistreference.py
-@@ -1,7 +1,9 @@
- #! /usr/bin/env python
- # -*- coding: UTF-8 -*-
--from match import Match
--from htm2dbk import *
-+from __future__ import absolute_import
-+from __future__ import print_function
-+from .match import Match
-+from .htm2dbk import *
-
- class FunctionListReference:
- """ Creating a docbook-style list of parts
-@@ -19,7 +21,7 @@ class FunctionListReference:
- description = entry.body_xml_text(name)
- funcsynopsis = entry.head_xml_text()
- if not funcsynopsis:
-- print "no funcsynopsis for", name
-+ print("no funcsynopsis for", name)
- return
- if self.entry is None:
- self.entry = FunctionListRefEntry(entry, self.o)
-diff --git a/docs/zzipdoc/functionprototype.py b/docs/zzipdoc/functionprototype.py
-index fda85bb..1247f6c 100644
---- a/docs/zzipdoc/functionprototype.py
-+++ b/docs/zzipdoc/functionprototype.py
-@@ -1,4 +1,5 @@
--from match import Match
-+from __future__ import absolute_import
-+from .match import Match
-
- class FunctionPrototype:
- """ takes a single function prototype line (cut from some source file)
-diff --git a/docs/zzipdoc/htm2dbk.py b/docs/zzipdoc/htm2dbk.py
-index ec9685b..12b70dd 100644
---- a/docs/zzipdoc/htm2dbk.py
-+++ b/docs/zzipdoc/htm2dbk.py
-@@ -6,8 +6,10 @@ The mapping of markups and links is far from perfect. But all we
- want is the docbook-to-pdf converter and similar technology being
- present in the world of docbook-to-anything converters. """
-
-+from __future__ import absolute_import
-+from __future__ import print_function
- from datetime import date
--import match
-+from . import match
- import sys
-
- m = match.Match
-@@ -146,8 +148,8 @@ def htm2dbk_files(args):
- doc.filename = filename
- doc.add(f.read())
- f.close()
-- except IOError, e:
-- print >> sys.stderr, "can not open "+filename
-+ except IOError as e:
-+ print("can not open "+filename, file=sys.stderr)
- return doc.value()
-
- def html2docbook(text):
-@@ -155,4 +157,4 @@ def html2docbook(text):
- return htm2dbk_conversion().convert2(text)
-
- if __name__ == "__main__":
-- print htm2dbk_files(sys.argv[1:])
-+ print(htm2dbk_files(sys.argv[1:]))
-diff --git a/docs/zzipdoc/htmldocument.py b/docs/zzipdoc/htmldocument.py
-index 47d58dc..5e4445a 100644
---- a/docs/zzipdoc/htmldocument.py
-+++ b/docs/zzipdoc/htmldocument.py
-@@ -1,6 +1,8 @@
- #! /usr/bin/env python
- # -*- coding: UTF-8 -*-
--from match import Match
-+from __future__ import absolute_import
-+from __future__ import print_function
-+from .match import Match
-
- class HtmlDocument:
- """ binds some html content page with additional markup - in this
-@@ -29,31 +31,31 @@ class HtmlDocument:
- def get_title(self):
- if self.title: return self.title
- try: return self.text[0].get_title()
-- except Exception, e: pass
-+ except Exception as e: pass
- return self.title
- def _html_meta(self, meta):
- """ accepts adapter objects with .html_meta() """
- try: return meta.html_meta()
-- except Exception, e: pass
-+ except Exception as e: pass
- return str(meta)
- def _html_style(self, style):
- """ accepts adapter objects with .html_style() and .xml_style() """
- ee = None
- try: return style.html_style()
-- except Exception, e: ee = e; pass
-+ except Exception as e: ee = e; pass
- try: return style.xml_style()
-- except Exception, e: print "HtmlDocument/style", ee, e; pass
-+ except Exception as e: print("HtmlDocument/style", ee, e); pass
- try: return str(style)
-- except Exception, e: print "HtmlDocument/style", e; return ""
-+ except Exception as e: print("HtmlDocument/style", e); return ""
- def _html_text(self, html):
- """ accepts adapter objects with .html_text() and .xml_text() """
- ee = None
- try: return html.html_text()
-- except Exception, e: ee = e; pass
-+ except Exception as e: ee = e; pass
- try: return html.xml_text()
-- except Exception, e: print "HtmlDocument/text", ee, e; pass
-+ except Exception as e: print("HtmlDocument/text", ee, e); pass
- try: return str(html)
-- except Exception, e: print "HtmlDocument/text", e; return " "
-+ except Exception as e: print("HtmlDocument/text", e); return " "
- def navigation(self):
- if self.navi:
- return self.navi
-@@ -63,7 +65,7 @@ class HtmlDocument:
- self.navi = fd.read()
- fd.close()
- return self.navi
-- except Exception, e:
-+ except Exception as e:
- pass
- return None
- def html_header(self):
-@@ -103,15 +105,15 @@ class HtmlDocument:
- return filename
- def save(self, filename = None):
- filename = self._filename(filename)
-- print "writing '"+filename+"'"
-+ print("writing '"+filename+"'")
- try:
- fd = open(filename, "w")
-- print >>fd, self.html_header()
-+ print(self.html_header(), file=fd)
- for text in self.text:
-- print >>fd, self._html_text(text)
-- print >>fd, self.html_footer()
-+ print(self._html_text(text), file=fd)
-+ print(self.html_footer(), file=fd)
- fd.close()
- return True
-- except IOError, e:
-- print "could not open '"+filename+"'file", e
-+ except IOError as e:
-+ print("could not open '"+filename+"'file", e)
- return False
-diff --git a/docs/zzipdoc/match.py b/docs/zzipdoc/match.py
-index a089ec3..5f12478 100644
---- a/docs/zzipdoc/match.py
-+++ b/docs/zzipdoc/match.py
-@@ -3,7 +3,10 @@
- # @creator (C) 2003 Guido U. Draheim
- # @license http://creativecommons.org/licenses/by-nc-sa/2.0/de/
-
-+from __future__ import absolute_import
-+from __future__ import print_function
- import re
-+import six
-
- # ---------------------------------------------------------- Regex Match()
- # beware, stupid python interprets backslashes in replace-parts only partially!
-@@ -18,7 +21,7 @@ class MatchReplace:
- MatchReplace.__call__(self, matching, template, count, flags)
- def __call__(self, matching, template = None, count = 0, flags = None):
- """ other than __init__ the template may be left off to be unchanged"""
-- if isinstance(count, basestring): # count/flags swapped over?
-+ if isinstance(count, six.string_types): # count/flags swapped over?
- flags = count; count = 0
- if isinstance(matching, Match):
- self.matching = matching
-@@ -57,7 +60,7 @@ class Match(str):
- def __call__(self, pattern, flags = None):
- assert isinstance(pattern, str) or pattern is None
- assert isinstance(flags, str) or flags is None
-- str.__init__(self, pattern)
-+ super(Match,self).__init__()
- self.replaced = 0 # set by subn() inside MatchReplace
- self.found = None # set by search() to a MatchObject
- self.pattern = pattern
-@@ -90,14 +93,14 @@ class Match(str):
- if __name__ == "__main__":
- # matching:
- if "foo" & Match("oo"):
-- print "oo"
-+ print("oo")
- x = Match()
- if "foo" & x("(o+)"):
-- print x[1]
-+ print(x[1])
- # replacing:
- y = "fooboo" & Match("oo") >> "ee"
-- print y
-+ print(y)
- r = Match("oo") >> "ee"
-- print "fooboo" & r
-+ print("fooboo" & r)
- s = MatchReplace("oo", "ee")
-- print "fooboo" & s
-+ print("fooboo" & s)
-diff --git a/docs/zzipdoc/options.py b/docs/zzipdoc/options.py
-index c6758d5..4a93bb7 100644
---- a/docs/zzipdoc/options.py
-+++ b/docs/zzipdoc/options.py
-@@ -3,13 +3,14 @@
- # @creator (C) 2003 Guido U. Draheim
- # @license http://creativecommons.org/licenses/by-nc-sa/2.0/de/
-
--from match import Match
-+from __future__ import absolute_import
-+from .match import Match
-
- # use as o.optionname to check for commandline options.
- class Options:
- var = {}
- def __getattr__(self, name):
-- if not self.var.has_key(name): return None
-+ if name not in self.var: return None
- return self.var[name]
- def __setattr__(self, name, value):
- self.var[name] = value
-diff --git a/docs/zzipdoc/textfile.py b/docs/zzipdoc/textfile.py
-index bfaff8d..9fabeac 100644
---- a/docs/zzipdoc/textfile.py
-+++ b/docs/zzipdoc/textfile.py
-@@ -1,4 +1,6 @@
-
-+from __future__ import absolute_import
-+from six.moves import range
- def _src_to_xml(text):
- return text.replace("&", "&").replace("<", "<").replace(">", ">")
-
-@@ -17,7 +19,7 @@ class TextFile:
- self.src_text = fd.read()
- fd.close()
- return True
-- except IOError, e:
-+ except IOError as e:
- pass
- return False
- def assert_src_text(self):
-@@ -41,7 +43,7 @@ class TextFile:
- self._line(self.src_text, offset)
- def _line(self, text, offset):
- line = 1
-- for x in xrange(0,offset):
-+ for x in range(0,offset):
- if x == "\n":
- line += 1
- return line
-diff --git a/docs/zzipdoc/textfileheader.py b/docs/zzipdoc/textfileheader.py
-index ceaa28e..63be1e1 100644
---- a/docs/zzipdoc/textfileheader.py
-+++ b/docs/zzipdoc/textfileheader.py
-@@ -1,4 +1,6 @@
--from match import Match
-+from __future__ import absolute_import
-+from __future__ import print_function
-+from .match import Match
-
- class TextFileHeader:
- """ scan for a comment block at the source file start and fill the
-@@ -17,7 +19,7 @@ class TextFileHeader:
- x = Match()
- text = self.textfile.get_src_text()
- if not text:
-- print "nonexistent file:", self.textfile.get_filename()
-+ print("nonexistent file:", self.textfile.get_filename())
- return False
- if text & x(r"(?s)[/][*]+(\s(?:.(?!\*\/))*.)\*\/"
- r"(?:\s*\#(?:define|ifdef|endif)[ ]*\S*[ ]*\S*)*"
---
-2.14.4
-
diff --git a/CVE-2018-16548.part1.patch b/CVE-2018-16548.part1.patch
deleted file mode 100644
index 25c2b747db49d338d8c3ba0f4aed321dce2bc72c..0000000000000000000000000000000000000000
--- a/CVE-2018-16548.part1.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 9411bde3e4a70a81ff3ffd256b71927b2d90dcbb Mon Sep 17 00:00:00 2001
-From: jmoellers
-Date: Fri, 7 Sep 2018 11:32:04 +0200
-Subject: [PATCH] Avoid memory leak from __zzip_parse_root_directory().
-
----
- test/test.zip | Bin 1361 -> 1361 bytes
- zzip/zip.c | 36 ++++++++++++++++++++++++++++++++++--
- 2 files changed, 34 insertions(+), 2 deletions(-)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index 88b833b..a685280 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -475,9 +475,15 @@ __zzip_parse_root_directory(int fd,
- } else
- {
- if (io->fd.seeks(fd, zz_rootseek + zz_offset, SEEK_SET) < 0)
-+ {
-+ free(hdr0);
- return ZZIP_DIR_SEEK;
-+ }
- if (io->fd.read(fd, &dirent, sizeof(dirent)) < __sizeof(dirent))
-+ {
-+ free(hdr0);
- return ZZIP_DIR_READ;
-+ }
- d = &dirent;
- }
-
-@@ -577,12 +583,38 @@ __zzip_parse_root_directory(int fd,
-
- if (hdr_return)
- *hdr_return = hdr0;
-+ else
-+ {
-+ /* If it is not assigned to *hdr_return, it will never be free()'d */
-+ free(hdr0);
-+ /* Make sure we don't free it again in case of error */
-+ hdr0 = NULL;
-+ }
- } /* else zero (sane) entries */
- # ifndef ZZIP_ALLOW_MODULO_ENTRIES
-- return (entries != zz_entries ? ZZIP_CORRUPTED : 0);
-+ if (entries != zz_entries)
-+ {
-+ /* If it was assigned to *hdr_return, undo assignment */
-+ if (p_reclen && hdr_return)
-+ *hdr_return = NULL;
-+ /* Free it, if it was not already free()'d */
-+ if (hdr0 != NULL)
-+ free(hdr0);
-+ return ZZIP_CORRUPTED;
-+ }
- # else
-- return ((entries & (unsigned)0xFFFF) != zz_entries ? ZZIP_CORRUPTED : 0);
-+ if (((entries & (unsigned)0xFFFF) != zz_entries)
-+ {
-+ /* If it was assigned to *hdr_return, undo assignment */
-+ if (p_reclen && hdr_return)
-+ *hdr_return = NULL;
-+ /* Free it, if it was not already free()'d */
-+ if (hdr0 != NULL)
-+ free(hdr0);
-+ return ZZIP_CORRUPTED;
-+ }
- # endif
-+ return 0;
- }
-
- /* ------------------------- high-level interface ------------------------- */
diff --git a/CVE-2018-16548.part2.patch b/CVE-2018-16548.part2.patch
deleted file mode 100644
index b9bea2667cc25a353aa78df7f4f3962bcd0d10f8..0000000000000000000000000000000000000000
--- a/CVE-2018-16548.part2.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From d2e5d5c53212e54a97ad64b793a4389193fec687 Mon Sep 17 00:00:00 2001
-From: jmoellers
-Date: Fri, 7 Sep 2018 11:49:28 +0200
-Subject: [PATCH] Avoid memory leak from __zzip_parse_root_directory().
-
----
- zzip/zip.c | 25 ++-----------------------
- 1 file changed, 2 insertions(+), 23 deletions(-)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index a685280..51a1a4d 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -587,34 +587,13 @@ __zzip_parse_root_directory(int fd,
- {
- /* If it is not assigned to *hdr_return, it will never be free()'d */
- free(hdr0);
-- /* Make sure we don't free it again in case of error */
-- hdr0 = NULL;
- }
- } /* else zero (sane) entries */
- # ifndef ZZIP_ALLOW_MODULO_ENTRIES
-- if (entries != zz_entries)
-- {
-- /* If it was assigned to *hdr_return, undo assignment */
-- if (p_reclen && hdr_return)
-- *hdr_return = NULL;
-- /* Free it, if it was not already free()'d */
-- if (hdr0 != NULL)
-- free(hdr0);
-- return ZZIP_CORRUPTED;
-- }
-+ return (entries != zz_entries) ? ZZIP_CORRUPTED : 0;
- # else
-- if (((entries & (unsigned)0xFFFF) != zz_entries)
-- {
-- /* If it was assigned to *hdr_return, undo assignment */
-- if (p_reclen && hdr_return)
-- *hdr_return = NULL;
-- /* Free it, if it was not already free()'d */
-- if (hdr0 != NULL)
-- free(hdr0);
-- return ZZIP_CORRUPTED;
-- }
-+ return ((entries & (unsigned)0xFFFF) != zz_entries) ? ZZIP_CORRUPTED : 0;
- # endif
-- return 0;
- }
-
- /* ------------------------- high-level interface ------------------------- */
diff --git a/CVE-2018-16548.part3.patch b/CVE-2018-16548.part3.patch
deleted file mode 100644
index f2f8214040bb32e9b6612618d0da93568a99c6c2..0000000000000000000000000000000000000000
--- a/CVE-2018-16548.part3.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 0e1dadb05c1473b9df2d7b8f298dab801778ef99 Mon Sep 17 00:00:00 2001
-From: jmoellers
-Date: Fri, 7 Sep 2018 13:55:35 +0200
-Subject: [PATCH] One more free() to avoid memory leak.
-
----
- zzip/zip.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index 51a1a4d..bc6c080 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -589,6 +589,8 @@ __zzip_parse_root_directory(int fd,
- free(hdr0);
- }
- } /* else zero (sane) entries */
-+ else
-+ free(hdr0);
- # ifndef ZZIP_ALLOW_MODULO_ENTRIES
- return (entries != zz_entries) ? ZZIP_CORRUPTED : 0;
- # else
diff --git a/CVE-2018-17828-singlez.patch b/CVE-2018-17828-singlez.patch
deleted file mode 100644
index 7343ab1010245a866a7455bddbb0d8783c0e9c5b..0000000000000000000000000000000000000000
--- a/CVE-2018-17828-singlez.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-diff --git a/bins/unzip-mem.c b/bins/unzip-mem.c
-index c45cb72..ff564a5 100644
---- a/bins/unzip-mem.c
-+++ b/bins/unzip-mem.c
-@@ -88,10 +88,53 @@ static void zzip_mem_entry_pipe(ZZIP_MEM_DISK* disk,
- }
- }
-
-+
-+
-+
-+static inline void
-+remove_dotdotslash(char *path)
-+{
-+ /* Note: removing "../" from the path ALWAYS shortens the path, never adds to it! */
-+ char *dotdotslash;
-+ int warned = 0;
-+
-+ dotdotslash = path;
-+ while ((dotdotslash = strstr(dotdotslash, "../")) != NULL)
-+ {
-+ /*
-+ * Remove only if at the beginning of the pathname ("../path/name")
-+ * or when preceded by a slash ("path/../name"),
-+ * otherwise not ("path../name..")!
-+ */
-+ if (dotdotslash == path || dotdotslash[-1] == '/')
-+ {
-+ char *src, *dst;
-+ if (!warned)
-+ {
-+ /* Note: the first time through the pathname is still intact */
-+ fprintf(stderr, "Removing \"../\" path component(s) in %s\n", path);
-+ warned = 1;
-+ }
-+ /* We cannot use strcpy(), as there "The strings may not overlap" */
-+ for (src = dotdotslash+3, dst=dotdotslash; (*dst = *src) != '\0'; src++, dst++)
-+ ;
-+ }
-+ else
-+ dotdotslash +=3; /* skip this instance to prevent infinite loop */
-+ }
-+}
-+
- static void zzip_mem_entry_make(ZZIP_MEM_DISK* disk,
- ZZIP_MEM_ENTRY* entry)
- {
-- FILE* file = fopen (entry->zz_name, "w");
-+ char name_stripped[PATH_MAX+1];
-+ FILE* file;
-+
-+ strncpy(name_stripped, entry->zz_name, PATH_MAX);
-+ name_stripped[PATH_MAX]='\0';
-+ remove_dotdotslash(name_stripped);
-+
-+ file = fopen (name_stripped, "wb");
- if (file) { zzip_mem_entry_pipe (disk, entry, file); fclose (file); }
- perror (entry->zz_name);
- if (status < EXIT_WARNINGS) status = EXIT_WARNINGS;
diff --git a/CVE-2018-17828.patch b/CVE-2018-17828.patch
deleted file mode 100644
index a340295add8420bd7a698ebc83d1aa81fbe6d99a..0000000000000000000000000000000000000000
--- a/CVE-2018-17828.patch
+++ /dev/null
@@ -1,341 +0,0 @@
-From 81dfa6b3e08f6934885ba5c98939587d6850d08e Mon Sep 17 00:00:00 2001
-From: Josef Moellers
-Date: Thu, 4 Oct 2018 14:21:48 +0200
-Subject: [PATCH] Fix issue #62: Remove any "../" components from pathnames of
- extracted files. [CVE-2018-17828]
-
----
- bins/unzzipcat-big.c | 57 +++++++++++++++++++++++++++++++++++++++++++-
- bins/unzzipcat-mem.c | 57 +++++++++++++++++++++++++++++++++++++++++++-
- bins/unzzipcat-mix.c | 57 +++++++++++++++++++++++++++++++++++++++++++-
- bins/unzzipcat-zip.c | 57 +++++++++++++++++++++++++++++++++++++++++++-
- 4 files changed, 224 insertions(+), 4 deletions(-)
-
-diff --git a/bins/unzzipcat-big.c b/bins/unzzipcat-big.c
-index 982d262..88c4d65 100644
---- a/bins/unzzipcat-big.c
-+++ b/bins/unzzipcat-big.c
-@@ -53,6 +53,48 @@ static void unzzip_cat_file(FILE* disk, char* name, FILE* out)
- }
- }
-
-+/*
-+ * NAME: remove_dotdotslash
-+ * PURPOSE: To remove any "../" components from the given pathname
-+ * ARGUMENTS: path: path name with maybe "../" components
-+ * RETURNS: Nothing, "path" is modified in-place
-+ * NOTE: removing "../" from the path ALWAYS shortens the path, never adds to it!
-+ * Also, "path" is not used after creating it.
-+ * So modifying "path" in-place is safe to do.
-+ */
-+static inline void
-+remove_dotdotslash(char *path)
-+{
-+ /* Note: removing "../" from the path ALWAYS shortens the path, never adds to it! */
-+ char *dotdotslash;
-+ int warned = 0;
-+
-+ dotdotslash = path;
-+ while ((dotdotslash = strstr(dotdotslash, "../")) != NULL)
-+ {
-+ /*
-+ * Remove only if at the beginning of the pathname ("../path/name")
-+ * or when preceded by a slash ("path/../name"),
-+ * otherwise not ("path../name..")!
-+ */
-+ if (dotdotslash == path || dotdotslash[-1] == '/')
-+ {
-+ char *src, *dst;
-+ if (!warned)
-+ {
-+ /* Note: the first time through the pathname is still intact */
-+ fprintf(stderr, "Removing \"../\" path component(s) in %s\n", path);
-+ warned = 1;
-+ }
-+ /* We cannot use strcpy(), as there "The strings may not overlap" */
-+ for (src = dotdotslash+3, dst=dotdotslash; (*dst = *src) != '\0'; src++, dst++)
-+ ;
-+ }
-+ else
-+ dotdotslash +=3; /* skip this instance to prevent infinite loop */
-+ }
-+}
-+
- static void makedirs(const char* name)
- {
- char* p = strrchr(name, '/');
-@@ -70,6 +112,16 @@ static void makedirs(const char* name)
-
- static FILE* create_fopen(char* name, char* mode, int subdirs)
- {
-+ char *name_stripped;
-+ FILE *fp;
-+ int mustfree = 0;
-+
-+ if ((name_stripped = strdup(name)) != NULL)
-+ {
-+ remove_dotdotslash(name_stripped);
-+ name = name_stripped;
-+ mustfree = 1;
-+ }
- if (subdirs)
- {
- char* p = strrchr(name, '/');
-@@ -79,7 +131,10 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
- free (dir_name);
- }
- }
-- return fopen(name, mode);
-+ fp = fopen(name, mode);
-+ if (mustfree)
-+ free(name_stripped);
-+ return fp;
- }
-
-
-diff --git a/bins/unzzipcat-mem.c b/bins/unzzipcat-mem.c
-index 9bc966b..793bde8 100644
---- a/bins/unzzipcat-mem.c
-+++ b/bins/unzzipcat-mem.c
-@@ -58,6 +58,48 @@ static void unzzip_mem_disk_cat_file(ZZIP_MEM_DISK* disk, char* name, FILE* out)
- }
- }
-
-+/*
-+ * NAME: remove_dotdotslash
-+ * PURPOSE: To remove any "../" components from the given pathname
-+ * ARGUMENTS: path: path name with maybe "../" components
-+ * RETURNS: Nothing, "path" is modified in-place
-+ * NOTE: removing "../" from the path ALWAYS shortens the path, never adds to it!
-+ * Also, "path" is not used after creating it.
-+ * So modifying "path" in-place is safe to do.
-+ */
-+static inline void
-+remove_dotdotslash(char *path)
-+{
-+ /* Note: removing "../" from the path ALWAYS shortens the path, never adds to it! */
-+ char *dotdotslash;
-+ int warned = 0;
-+
-+ dotdotslash = path;
-+ while ((dotdotslash = strstr(dotdotslash, "../")) != NULL)
-+ {
-+ /*
-+ * Remove only if at the beginning of the pathname ("../path/name")
-+ * or when preceded by a slash ("path/../name"),
-+ * otherwise not ("path../name..")!
-+ */
-+ if (dotdotslash == path || dotdotslash[-1] == '/')
-+ {
-+ char *src, *dst;
-+ if (!warned)
-+ {
-+ /* Note: the first time through the pathname is still intact */
-+ fprintf(stderr, "Removing \"../\" path component(s) in %s\n", path);
-+ warned = 1;
-+ }
-+ /* We cannot use strcpy(), as there "The strings may not overlap" */
-+ for (src = dotdotslash+3, dst=dotdotslash; (*dst = *src) != '\0'; src++, dst++)
-+ ;
-+ }
-+ else
-+ dotdotslash +=3; /* skip this instance to prevent infinite loop */
-+ }
-+}
-+
- static void makedirs(const char* name)
- {
- char* p = strrchr(name, '/');
-@@ -75,6 +117,16 @@ static void makedirs(const char* name)
-
- static FILE* create_fopen(char* name, char* mode, int subdirs)
- {
-+ char *name_stripped;
-+ FILE *fp;
-+ int mustfree = 0;
-+
-+ if ((name_stripped = strdup(name)) != NULL)
-+ {
-+ remove_dotdotslash(name_stripped);
-+ name = name_stripped;
-+ mustfree = 1;
-+ }
- if (subdirs)
- {
- char* p = strrchr(name, '/');
-@@ -84,7 +136,10 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
- free (dir_name);
- }
- }
-- return fopen(name, mode);
-+ fp = fopen(name, mode);
-+ if (mustfree)
-+ free(name_stripped);
-+ return fp;
- }
-
- static int unzzip_cat (int argc, char ** argv, int extract)
-diff --git a/bins/unzzipcat-mix.c b/bins/unzzipcat-mix.c
-index 91c2f00..73b6ed6 100644
---- a/bins/unzzipcat-mix.c
-+++ b/bins/unzzipcat-mix.c
-@@ -69,6 +69,48 @@ static void unzzip_cat_file(ZZIP_DIR* disk, char* name, FILE* out)
- }
- }
-
-+/*
-+ * NAME: remove_dotdotslash
-+ * PURPOSE: To remove any "../" components from the given pathname
-+ * ARGUMENTS: path: path name with maybe "../" components
-+ * RETURNS: Nothing, "path" is modified in-place
-+ * NOTE: removing "../" from the path ALWAYS shortens the path, never adds to it!
-+ * Also, "path" is not used after creating it.
-+ * So modifying "path" in-place is safe to do.
-+ */
-+static inline void
-+remove_dotdotslash(char *path)
-+{
-+ /* Note: removing "../" from the path ALWAYS shortens the path, never adds to it! */
-+ char *dotdotslash;
-+ int warned = 0;
-+
-+ dotdotslash = path;
-+ while ((dotdotslash = strstr(dotdotslash, "../")) != NULL)
-+ {
-+ /*
-+ * Remove only if at the beginning of the pathname ("../path/name")
-+ * or when preceded by a slash ("path/../name"),
-+ * otherwise not ("path../name..")!
-+ */
-+ if (dotdotslash == path || dotdotslash[-1] == '/')
-+ {
-+ char *src, *dst;
-+ if (!warned)
-+ {
-+ /* Note: the first time through the pathname is still intact */
-+ fprintf(stderr, "Removing \"../\" path component(s) in %s\n", path);
-+ warned = 1;
-+ }
-+ /* We cannot use strcpy(), as there "The strings may not overlap" */
-+ for (src = dotdotslash+3, dst=dotdotslash; (*dst = *src) != '\0'; src++, dst++)
-+ ;
-+ }
-+ else
-+ dotdotslash +=3; /* skip this instance to prevent infinite loop */
-+ }
-+}
-+
- static void makedirs(const char* name)
- {
- char* p = strrchr(name, '/');
-@@ -86,6 +128,16 @@ static void makedirs(const char* name)
-
- static FILE* create_fopen(char* name, char* mode, int subdirs)
- {
-+ char *name_stripped;
-+ FILE *fp;
-+ int mustfree = 0;
-+
-+ if ((name_stripped = strdup(name)) != NULL)
-+ {
-+ remove_dotdotslash(name_stripped);
-+ name = name_stripped;
-+ mustfree = 1;
-+ }
- if (subdirs)
- {
- char* p = strrchr(name, '/');
-@@ -95,7 +147,10 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
- free (dir_name);
- }
- }
-- return fopen(name, mode);
-+ fp = fopen(name, mode);
-+ if (mustfree)
-+ free(name_stripped);
-+ return fp;
- }
-
- static int unzzip_cat (int argc, char ** argv, int extract)
-diff --git a/bins/unzzipcat-zip.c b/bins/unzzipcat-zip.c
-index 2810f85..7f7f3fa 100644
---- a/bins/unzzipcat-zip.c
-+++ b/bins/unzzipcat-zip.c
-@@ -69,6 +69,48 @@ static void unzzip_cat_file(ZZIP_DIR* disk, char* name, FILE* out)
- }
- }
-
-+/*
-+ * NAME: remove_dotdotslash
-+ * PURPOSE: To remove any "../" components from the given pathname
-+ * ARGUMENTS: path: path name with maybe "../" components
-+ * RETURNS: Nothing, "path" is modified in-place
-+ * NOTE: removing "../" from the path ALWAYS shortens the path, never adds to it!
-+ * Also, "path" is not used after creating it.
-+ * So modifying "path" in-place is safe to do.
-+ */
-+static inline void
-+remove_dotdotslash(char *path)
-+{
-+ /* Note: removing "../" from the path ALWAYS shortens the path, never adds to it! */
-+ char *dotdotslash;
-+ int warned = 0;
-+
-+ dotdotslash = path;
-+ while ((dotdotslash = strstr(dotdotslash, "../")) != NULL)
-+ {
-+ /*
-+ * Remove only if at the beginning of the pathname ("../path/name")
-+ * or when preceded by a slash ("path/../name"),
-+ * otherwise not ("path../name..")!
-+ */
-+ if (dotdotslash == path || dotdotslash[-1] == '/')
-+ {
-+ char *src, *dst;
-+ if (!warned)
-+ {
-+ /* Note: the first time through the pathname is still intact */
-+ fprintf(stderr, "Removing \"../\" path component(s) in %s\n", path);
-+ warned = 1;
-+ }
-+ /* We cannot use strcpy(), as there "The strings may not overlap" */
-+ for (src = dotdotslash+3, dst=dotdotslash; (*dst = *src) != '\0'; src++, dst++)
-+ ;
-+ }
-+ else
-+ dotdotslash +=3; /* skip this instance to prevent infinite loop */
-+ }
-+}
-+
- static void makedirs(const char* name)
- {
- char* p = strrchr(name, '/');
-@@ -86,6 +128,16 @@ static void makedirs(const char* name)
-
- static FILE* create_fopen(char* name, char* mode, int subdirs)
- {
-+ char *name_stripped;
-+ FILE *fp;
-+ int mustfree = 0;
-+
-+ if ((name_stripped = strdup(name)) != NULL)
-+ {
-+ remove_dotdotslash(name_stripped);
-+ name = name_stripped;
-+ mustfree = 1;
-+ }
- if (subdirs)
- {
- char* p = strrchr(name, '/');
-@@ -95,7 +147,10 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
- free (dir_name);
- }
- }
-- return fopen(name, mode);
-+ fp = fopen(name, mode);
-+ if (mustfree)
-+ free(name_stripped);
-+ return fp;
- }
-
- static int unzzip_cat (int argc, char ** argv, int extract)
diff --git a/CVE-2018-7725.patch b/CVE-2018-7725.patch
deleted file mode 100644
index b24c8aa468e4d3a6c0e8eaa588778f19d93f8791..0000000000000000000000000000000000000000
--- a/CVE-2018-7725.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 1ba660b3300d67b8ce9f6b96bbae0b36fa2d6b06 Mon Sep 17 00:00:00 2001
-From: Guido Draheim
-Date: Tue, 13 Mar 2018 01:29:44 +0100
-Subject: [PATCH] check zlib space to be within buffer #39
-
----
- zzip/memdisk.c | 9 +++++++++
- zzip/mmapped.c | 2 ++
- 2 files changed, 11 insertions(+)
-
-diff --git a/zzip/memdisk.c b/zzip/memdisk.c
-index 3de201c..8d5743d 100644
---- a/zzip/memdisk.c
-+++ b/zzip/memdisk.c
-@@ -521,11 +521,20 @@ zzip_mem_entry_fopen(ZZIP_MEM_DISK * dir, ZZIP_MEM_ENTRY * entry)
- file->zlib.avail_in = zzip_mem_entry_csize(entry);
- file->zlib.next_in = zzip_mem_entry_to_data(entry);
-
-+ debug2("compressed size %i", (int) file->zlib.avail_in);
-+ if (file->zlib.next_in + file->zlib.avail_in >= file->endbuf)
-+ goto error;
-+ if (file->zlib.next_in < file->buffer)
-+ goto error;
-+
- if (! zzip_mem_entry_data_deflated(entry) ||
- inflateInit2(&file->zlib, -MAX_WBITS) != Z_OK)
- { free (file); return 0; }
-
- return file;
-+error:
-+ errno = EBADMSG;
-+ return NULL;
- }
-
- zzip__new__ ZZIP_MEM_DISK_FILE *
-diff --git a/zzip/mmapped.c b/zzip/mmapped.c
-index 920c4df..8af18f4 100644
---- a/zzip/mmapped.c
-+++ b/zzip/mmapped.c
-@@ -654,6 +654,8 @@ zzip_disk_entry_fopen(ZZIP_DISK * disk, ZZIP_DISK_ENTRY * entry)
- DBG2("compressed size %i", (int) file->zlib.avail_in);
- if (file->zlib.next_in + file->zlib.avail_in >= disk->endbuf)
- goto error;
-+ if (file->zlib.next_in < disk->buffer)
-+ goto error;
-
- if (! zzip_file_header_data_deflated(header))
- goto error;
diff --git a/CVE-2018-7726.part1.patch b/CVE-2018-7726.part1.patch
deleted file mode 100644
index 563c0e176ce40916c7486b328cd4b1e8b175f87d..0000000000000000000000000000000000000000
--- a/CVE-2018-7726.part1.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 8f48323c181e20b7e527b8be7229d6eb1148ec5f Mon Sep 17 00:00:00 2001
-From: Guido Draheim
-Date: Tue, 13 Mar 2018 00:23:33 +0100
-Subject: [PATCH] check rootseek and rootsize to be positive #27
-
----
- zzip/zip.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index a5db9d8..6be8d7c 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -318,6 +318,8 @@ __zzip_fetch_disk_trailer(int fd, zzip_off_t filesize,
- trailer->zz_rootseek = zzip_disk_trailer_rootseek(orig);
- trailer->zz_rootsize = zzip_disk_trailer_rootsize(orig);
- # endif
-+ if (trailer->zz_rootseek < 0 || trailer->zz_rootsize < 0)
-+ return(ZZIP_CORRUPTED); // forged value
-
- __fixup_rootseek(offset + tail - mapped, trailer);
- /*
-@@ -344,6 +346,8 @@ __zzip_fetch_disk_trailer(int fd, zzip_off_t filesize,
- zzip_disk64_trailer_finalentries(orig);
- trailer->zz_rootseek = zzip_disk64_trailer_rootseek(orig);
- trailer->zz_rootsize = zzip_disk64_trailer_rootsize(orig);
-+ if (trailer->zz_rootseek < 0 || trailer->zz_rootsize < 0)
-+ return(ZZIP_CORRUPTED); // forged value
- /*
- * "extract data from files archived in a single zip file."
- * So the file offsets must be within the current ZIP archive!
diff --git a/CVE-2018-7726.part2.patch b/CVE-2018-7726.part2.patch
deleted file mode 100644
index 574c1cef2bebb7fef4ddb25134d8bf6ff9d960d7..0000000000000000000000000000000000000000
--- a/CVE-2018-7726.part2.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 19c9e4dc6c5cf92a38d0d23dbccac6993f9c41be Mon Sep 17 00:00:00 2001
-From: Guido Draheim
-Date: Tue, 13 Mar 2018 01:50:36 +0100
-Subject: [PATCH] check rootseek after correction #41
-
----
- zzip/zip.c | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index 6be8d7c..0d79d52 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -1,4 +1,3 @@
--
- /*
- * Author:
- * Guido Draheim
-@@ -422,6 +421,9 @@ __zzip_parse_root_directory(int fd,
- zzip_off64_t zz_rootseek = _disk_trailer_rootseek(trailer);
- __correct_rootseek(zz_rootseek, zz_rootsize, trailer);
-
-+ if (zz_entries < 0 || zz_rootseek < 0 || zz_rootseek < 0)
-+ return ZZIP_CORRUPTED;
-+
- hdr0 = (struct zzip_dir_hdr *) malloc(zz_rootsize);
- if (! hdr0)
- return ZZIP_DIRSIZE;
-@@ -465,8 +467,9 @@ __zzip_parse_root_directory(int fd,
- # endif
-
- if (fd_map)
-- { d = (void*)(fd_map+zz_fd_gap+zz_offset); } /* fd_map+fd_gap==u_rootseek */
-- else
-+ {
-+ d = (void*)(fd_map+zz_fd_gap+zz_offset); /* fd_map+fd_gap==u_rootseek */
-+ } else
- {
- if (io->fd.seeks(fd, zz_rootseek + zz_offset, SEEK_SET) < 0)
- return ZZIP_DIR_SEEK;
diff --git a/CVE-2018-7726.part3.patch b/CVE-2018-7726.part3.patch
deleted file mode 100644
index 471b596781cc3e8fefc155a0c83a30c8cb80a39a..0000000000000000000000000000000000000000
--- a/CVE-2018-7726.part3.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From feae4da1a5c92100c44ebfcbaaa895959cc0829b Mon Sep 17 00:00:00 2001
-From: Guido Draheim
-Date: Thu, 15 Mar 2018 23:54:37 +0100
-Subject: [PATCH] fix for zz_rootsize #41
-
----
- zzip/zip.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/zzip/zip.c b/zzip/zip.c
-index 0d79d52..14e2e06 100644
---- a/zzip/zip.c
-+++ b/zzip/zip.c
-@@ -421,7 +421,7 @@ __zzip_parse_root_directory(int fd,
- zzip_off64_t zz_rootseek = _disk_trailer_rootseek(trailer);
- __correct_rootseek(zz_rootseek, zz_rootsize, trailer);
-
-- if (zz_entries < 0 || zz_rootseek < 0 || zz_rootseek < 0)
-+ if (zz_entries < 0 || zz_rootseek < 0 || zz_rootsize < 0)
- return ZZIP_CORRUPTED;
-
- hdr0 = (struct zzip_dir_hdr *) malloc(zz_rootsize);
diff --git a/CVE-2018-7727.patch b/CVE-2018-7727.patch
deleted file mode 100644
index bb534790d191dbe215d26186372a32b0fc43629e..0000000000000000000000000000000000000000
--- a/CVE-2018-7727.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From 83a2da55922f67e07f22048ac9671a44cc0d35c4 Mon Sep 17 00:00:00 2001
-From: Guido Draheim
-Date: Wed, 14 Mar 2018 07:50:44 +0100
-Subject: [PATCH] ensure disk_close to avoid mem-leak #40
-
----
- bins/unzzipcat-mem.c | 57 +++++++++++++++++++++++++++-------------------------
- bins/unzzipdir-mem.c | 10 ++++-----
- 2 files changed, 34 insertions(+), 33 deletions(-)
-
-diff --git a/bins/unzzipcat-mem.c b/bins/unzzipcat-mem.c
-index d13029c..9bc966b 100644
---- a/bins/unzzipcat-mem.c
-+++ b/bins/unzzipcat-mem.c
-@@ -89,7 +89,7 @@ static FILE* create_fopen(char* name, char* mode, int subdirs)
-
- static int unzzip_cat (int argc, char ** argv, int extract)
- {
-- int done;
-+ int done = 0;
- int argn;
- ZZIP_MEM_DISK* disk;
-
-@@ -116,47 +116,50 @@ static int unzzip_cat (int argc, char ** argv, int extract)
- FILE* out = stdout;
- if (extract) out = create_fopen(name, "w", 1);
- if (! out) {
-- if (errno != EISDIR) done = EXIT_ERRORS;
-+ if (errno != EISDIR) {
-+ DBG3("can not open output file %i %s", errno, strerror(errno));
-+ done = EXIT_ERRORS;
-+ }
- continue;
- }
- unzzip_mem_disk_cat_file (disk, name, out);
- if (extract) fclose(out);
- }
-- return done;
-- }
--
-- if (argc == 3 && !extract)
-+ }
-+ else if (argc == 3 && !extract)
- { /* list from one spec */
- ZZIP_MEM_ENTRY* entry = 0;
- while ((entry = zzip_mem_disk_findmatch(disk, argv[2], entry, 0, 0)))
- {
- unzzip_mem_entry_fprint (disk, entry, stdout);
- }
--
-- return 0;
-- }
--
-- for (argn=1; argn < argc; argn++)
-- { /* list only the matching entries - each in order of commandline */
-- ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
-- for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
-- {
-- char* name = zzip_mem_entry_to_name (entry);
-- if (! _zzip_fnmatch (argv[argn], name,
-- FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
-+ } else {
-+ for (argn=1; argn < argc; argn++)
-+ { /* list only the matching entries - each in order of commandline */
-+ ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
-+ for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
- {
-- FILE* out = stdout;
-- if (extract) out = create_fopen(name, "w", 1);
-- if (! out) {
-- if (errno != EISDIR) done = EXIT_ERRORS;
-- continue;
-- }
-- unzzip_mem_disk_cat_file (disk, name, out);
-- if (extract) fclose(out);
-- break; /* match loop */
-+ char* name = zzip_mem_entry_to_name (entry);
-+ if (! _zzip_fnmatch (argv[argn], name,
-+ FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
-+ {
-+ FILE* out = stdout;
-+ if (extract) out = create_fopen(name, "wb", 1);
-+ if (! out) {
-+ if (errno != EISDIR) {
-+ DBG3("can not open output file %i %s", errno, strerror(errno));
-+ done = EXIT_ERRORS;
-+ }
-+ continue;
-+ }
-+ unzzip_mem_disk_cat_file (disk, name, out);
-+ if (extract) fclose(out);
-+ break; /* match loop */
-+ }
- }
- }
- }
-+ zzip_mem_disk_close(disk);
- return done;
- }
-
-diff --git a/bins/unzzipdir-mem.c b/bins/unzzipdir-mem.c
-index e54cd8d..beca788 100644
---- a/bins/unzzipdir-mem.c
-+++ b/bins/unzzipdir-mem.c
-@@ -68,10 +68,8 @@ unzzip_list (int argc, char ** argv, int verbose)
- printf ("%lli/%lli %s %s\n", csize, usize, defl, name);
- }
- }
-- return 0;
- }
--
-- if (argc == 3)
-+ else if (argc == 3)
- { /* list from one spec */
- ZZIP_MEM_ENTRY* entry = 0;
- while ((entry = zzip_mem_disk_findmatch(disk, argv[2], entry, 0, 0)))
-@@ -89,9 +87,8 @@ unzzip_list (int argc, char ** argv, int verbose)
- printf ("%lli/%lli %s %s\n", csize, usize, defl, name);
- }
- }
-- return 0;
- }
--
-+ else
- { /* list only the matching entries - in order of zip directory */
- ZZIP_MEM_ENTRY* entry = zzip_mem_disk_findfirst(disk);
- for (; entry ; entry = zzip_mem_disk_findnext(disk, entry))
-@@ -118,8 +115,9 @@ unzzip_list (int argc, char ** argv, int verbose)
- }
- }
- }
-- return 0;
- }
-+ zzip_mem_disk_close(disk);
-+ return EXIT_OK;
- }
-
- int
diff --git a/download b/download
new file mode 100644
index 0000000000000000000000000000000000000000..f7135894e99b1f8d14094aeb46e5f9d114f0c93e
--- /dev/null
+++ b/download
@@ -0,0 +1 @@
+e180a749c15b33d24c5f3a75e2076b28 v0.13.71-pruned.tar.gz
diff --git a/match.py b/match.py
new file mode 100644
index 0000000000000000000000000000000000000000..04c1bf94d1a707bf47893dd81851cefac86e2046
--- /dev/null
+++ b/match.py
@@ -0,0 +1,108 @@
+#! /usr/bin/env python3
+
+from __future__ import print_function
+
+import re
+
+try:
+ basestring
+except NameError:
+ basestring = str
+
+# ---------------------------------------------------------- Regex Match()
+# beware, stupid python interprets backslashes in replace-parts only partially!
+class MatchReplace:
+ """ A MatchReplace is a mix of a Python Pattern and a Replace-Template """
+ def __init__(self, matching, template, count = 0, flags = None):
+ """ setup a substition from regex 'matching' into 'template',
+ the replacement count default of 0 will replace all occurrences.
+ The first argument may be a Match object or it is a string that
+ will be turned into one by using Match(matching, flags). """
+ self.template = template
+ MatchReplace.__call__(self, matching, template, count, flags)
+ def __call__(self, matching, template = None, count = 0, flags = None):
+ """ other than __init__ the template may be left off to be unchanged"""
+ if isinstance(count, basestring): # count/flags swapped over?
+ flags = count; count = 0
+ if isinstance(matching, Match):
+ self.matching = matching
+ else:
+ self.matching = Match()(matching, flags) ## python 2.4.2 bug
+ if template is not None:
+ self.template = template
+ self.count = count
+ def __and__(self, string):
+ """ z = MatchReplace('foo', 'bar') & 'foo'; assert z = 'bar' """
+ text, self.matching.replaced = \
+ self.matching.regex.subn(self.template, string, self.count)
+ return text
+ def __rand__(self, string):
+ """ z = 'foo' & Match('foo') >> 'bar'; assert z = 'bar' """
+ text, self.matching.replaced = \
+ self.matching.regex.subn(self.template, string, self.count)
+ return text
+ def __iand__(self, string):
+ """ x = 'foo' ; x &= Match('foo') >> 'bar'; assert x == 'bar' """
+ string, self.matching.replaced = \
+ self.matching.regex.subn(self.template, string, self.count)
+ return string
+ def __rshift__(self, count):
+ " shorthand to set the replacement count: Match('foo') >> 'bar' >> 1 "
+ self.count = count ; return self
+ def __rlshift__(self, count):
+ self.count = count ; return self
+
+class Match:
+ """ A Match is actually a mix of a Python Pattern and MatchObject """
+ def __init__(self, pattern = None, flags = None):
+ """ flags is a string: 'i' for case-insensitive etc.; it is just
+ short for a regex prefix: Match('foo','i') == Match('(?i)foo') """
+ Match.__call__(self, pattern, flags)
+ def __call__(self, pattern, flags = None):
+ assert isinstance(pattern, str) or pattern is None
+ assert isinstance(flags, str) or flags is None
+ self.replaced = 0 # set by subn() inside MatchReplace
+ self.found = None # set by search() to a MatchObject
+ self.pattern = pattern
+ if pattern is not None:
+ if flags:
+ self.regex = re.compile("(?"+flags+")"+self.pattern)
+ else:
+ self.regex = re.compile(self.pattern)
+ return self
+ def __repr__(self):
+ return self.pattern
+ def __truth__(self):
+ return self.found is not None
+ def __and__(self, string):
+ self.found = self.regex.search(string)
+ return self.__truth__()
+ def __rand__(self, string):
+ self.found = self.regex.search(string)
+ return self.__truth__()
+ def __rshift__(self, template):
+ return MatchReplace(self, template)
+ def __rlshift__(self, template):
+ return MatchReplace(self, template)
+ def __getitem__(self, index):
+ return self.group(index)
+ def group(self, index):
+ assert self.found is not None
+ return self.found.group(index)
+ def finditer(self, string):
+ return self.regex.finditer(string)
+
+if __name__ == "__main__":
+ # matching:
+ if "foo" & Match("oo"):
+ print("oo")
+ x = Match()
+ if "foo" & x("(o+)"):
+ print(x[1])
+ # replacing:
+ y = "fooboo" & Match("oo") >> "ee"
+ print(y)
+ r = Match("oo") >> "ee"
+ print("fooboo" & r)
+ s = MatchReplace("oo", "ee")
+ print("fooboo" & s)
diff --git a/zziplib-0.13.67-multilib-32.patch b/multilib-32.patch
similarity index 47%
rename from zziplib-0.13.67-multilib-32.patch
rename to multilib-32.patch
index 66acd383070ab48bd8c713ca7704b656c47be960..ae99a598d7a2c5beee1e7a41c07b490c09928d57 100644
--- a/zziplib-0.13.67-multilib-32.patch
+++ b/multilib-32.patch
@@ -1,6 +1,6 @@
---- ./a/zzip/_config.h 2018-10-11 12:28:07.994739469 +0200
-+++ ./b/zzip/_config.h 2018-10-11 10:30:48.000000000 +0200
-@@ -133,9 +133,11 @@
+--- ./a/zzip/_config.h 2021-07-21 14:18:09.000000000 +0200
++++ ./b/zzip/_config.h 2021-07-21 14:46:24.037432969 +0200
+@@ -138,9 +138,12 @@
/* whether the system defaults to 32bit off_t but can do 64bit when requested
*/
@@ -9,23 +9,11 @@
#define ZZIP_LARGEFILE_SENSITIVE 1
#endif
+#endif
++/* #undef LARGEFILE_SENSITIVE */
- /* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-@@ -185,7 +187,11 @@
-
- /* The number of bytes in type long */
- #ifndef ZZIP_SIZEOF_LONG
--#define ZZIP_SIZEOF_LONG 4
-+#if __WORDSIZE == 32
-+#define ZZIP_SIZEOF_LONG 4
-+#elif __WORDSIZE == 64
-+#define ZZIP_SIZEOF_LONG 8
-+#endif
- #endif
-
- /* The number of bytes in type short */
-@@ -221,9 +227,11 @@
+ /* Define to the sub-directory where libtool stores uninstalled libraries. */
+ #ifndef ZZIP_LT_OBJDIR
+@@ -227,9 +230,13 @@
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
@@ -34,6 +22,8 @@
#define ZZIP__FILE_OFFSET_BITS 64
#endif
+#endif
++/* #undef _FILE_OFFSET_BITS */
++
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
diff --git a/zziplib-0.13.67-multilib.patch b/multilib-64.patch
similarity index 39%
rename from zziplib-0.13.67-multilib.patch
rename to multilib-64.patch
index 169520b1006df7cc5747f5ea41f67e248b449893..5285e3a074de7bc63c736942e0f0a65d2db2d6b8 100644
--- a/zziplib-0.13.67-multilib.patch
+++ b/multilib-64.patch
@@ -1,42 +1,29 @@
-diff -up ./x86_64-redhat-linux-gnu/zzip/_config.h.orig ./x86_64-redhat-linux-gnu/zzip/_config.h
---- ./x86_64-redhat-linux-gnu/zzip/_config.h.orig 2018-02-01 22:13:36.593910695 +0200
-+++ ./x86_64-redhat-linux-gnu/zzip/_config.h 2018-02-01 22:15:40.341476130 +0200
-@@ -133,7 +133,11 @@
+--- ./a/zzip/_config.h 2021-07-21 14:18:14.000000000 +0200
++++ ./b/zzip/_config.h 2021-07-21 14:46:24.037432969 +0200
+@@ -138,6 +138,11 @@
/* whether the system defaults to 32bit off_t but can do 64bit when requested
*/
--/* #undef LARGEFILE_SENSITIVE */
+#if __WORDSIZE == 32
+#ifndef ZZIP_LARGEFILE_SENSITIVE
+#define ZZIP_LARGEFILE_SENSITIVE 1
+#endif
+#endif
+ /* #undef LARGEFILE_SENSITIVE */
- /* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-@@ -183,8 +187,12 @@
-
- /* The number of bytes in type long */
- #ifndef ZZIP_SIZEOF_LONG
-+#if __WORDSIZE == 32
-+#define ZZIP_SIZEOF_LONG 4
-+#elif __WORDSIZE == 64
- #define ZZIP_SIZEOF_LONG 8
- #endif
-+#endif
-
- /* The number of bytes in type short */
- #ifndef ZZIP_SIZEOF_SHORT
-@@ -219,7 +227,11 @@
+ /* Define to the sub-directory where libtool stores uninstalled libraries. */
+@@ -225,8 +230,14 @@
#endif
/* Number of bits in a file offset, on hosts where this is settable. */
--/* #undef _FILE_OFFSET_BITS */
+#if __WORDSIZE == 32
+#ifndef ZZIP__FILE_OFFSET_BITS
+#define ZZIP__FILE_OFFSET_BITS 64
+#endif
+#endif
+ /* #undef _FILE_OFFSET_BITS */
++
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
+
diff --git a/options.py b/options.py
new file mode 100644
index 0000000000000000000000000000000000000000..6bbdec47e8bbc430cbba32ebf6f965d912224f6f
--- /dev/null
+++ b/options.py
@@ -0,0 +1,28 @@
+#! /usr/bin/env python3
+
+from zzipdoc.match import Match
+
+# use as o.optionname to check for commandline options.
+class Options:
+ var = {}
+ def __getattr__(self, name):
+ if not name in self.var: return None
+ return self.var[name]
+ def __setattr__(self, name, value):
+ self.var[name] = value
+ def scan(self, optionstring): # option-name or None
+ x = Match()
+ if optionstring & x(r"^--?(\w+)=(.*)"):
+ self.var[x[1]] = x[2] ; return x[1]
+ if optionstring & x(r"^--?no-(\w+)$"):
+ self.var[x[1]] = "" ; return x[1]
+ if optionstring & x(r"^--?(\w+)$"):
+ self.var[x[1]] = "*"; return x[1]
+ return None
+#end Options
+
+if False:
+ o = Options()
+ o.help = """
+ scans for options
+ """
diff --git a/v0.13.68.tar.gz b/v0.13.68.tar.gz
deleted file mode 100644
index 75ef9f60fca1c3718d3543b2762df36a2caed7dc..0000000000000000000000000000000000000000
Binary files a/v0.13.68.tar.gz and /dev/null differ
diff --git a/zziplib.spec b/zziplib.spec
index 04cff3bc645d4fca70704629dd381ef903406645..088e29159bd6bbf9f114f84a281aa3a4051380a4 100644
--- a/zziplib.spec
+++ b/zziplib.spec
@@ -1,36 +1,28 @@
-%define anolis_release .0.1
Summary: Lightweight library to easily extract data from zip files
Name: zziplib
-Version: 0.13.68
-Release: 9%{anolis_release}%{?dist}
+Version: 0.13.71
+Release: 9%{?dist}
License: LGPLv2+ or MPLv1.1
-Group: Applications/Archiving
URL: http://zziplib.sourceforge.net/
-Source: https://github.com/gdraheim/zziplib/archive/v%{version}.tar.gz
-
-Patch100: zziplib-0.13.67-multilib.patch
-Patch101: zziplib-0.13.67-multilib-32.patch
-
-Patch1: 0001-FIX-port-documentation-scripts-to-python3.patch
-Patch2: CVE-2018-7725.patch
-#part1 also fixes #1545818
-Patch3: CVE-2018-7726.part1.patch
-Patch4: CVE-2018-7726.part2.patch
-Patch5: CVE-2018-7726.part3.patch
-Patch6: CVE-2018-7727.patch
-
-Patch7: CVE-2018-16548.part1.patch
-Patch8: CVE-2018-16548.part2.patch
-Patch9: CVE-2018-16548.part3.patch
-
-Patch10: CVE-2018-17828.patch
-Patch11: CVE-2018-17828-singlez.patch
-
-Patch12: CVE-2020-18442.patch
-
+#Source: https://github.com/gdraheim/zziplib/archive/v%{version}.tar.gz
+
+#Using the pruned version of the upstream archive. The archive does not contain the Source1 and Source2 files. Their github version is used instead (the original ones had licensing issues)
+#rhbz#1982241
+Source0: v%{version}-pruned.tar.gz
+#https://raw.githubusercontent.com/gdraheim/zziplib/465450c86c930026664329876e5350d21a7527db/docs/zzipdoc/match.py
+Source1: match.py
+#https://raw.githubusercontent.com/gdraheim/zziplib/465450c86c930026664329876e5350d21a7527db/docs/zzipdoc/options.py
+Source2: options.py
+
+Patch1: CVE-2020-18442.patch
+Patch100: multilib-32.patch
+Patch101: multilib-64.patch
+
+BuildRequires: make
+BuildRequires: gcc
BuildRequires: perl-interpreter
-BuildRequires: python3-devel
-BuildRequires: python3-six
+BuildRequires: python3
+BuildRequires: python3-rpm-macros
BuildRequires: zip
BuildRequires: xmlto
BuildRequires: zlib-devel
@@ -39,8 +31,6 @@ BuildRequires: pkgconfig
#BuildRequires: autoconf
#BuildRequires: automake
-Requires: glibc
-
%description
The zziplib library is intentionally lightweight, it offers the ability to
easily extract data from files archived in a single zip file. Applications
@@ -50,7 +40,6 @@ which is actually used by the zip/unzip tools.
%package utils
Summary: Utilities for the zziplib library
-Group: Applications/Archiving
Requires: %{name}%{?_isa} = %{version}-%{release}
%description utils
@@ -64,7 +53,6 @@ This packages contains all the utilities that come with the zziplib library.
%package devel
Summary: Development files for the zziplib library
-Group: Development/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: pkgconfig
Requires: zlib-devel
@@ -80,70 +68,52 @@ which is actually used by the zip/unzip tools.
This package contains files required to build applications that will use the
zziplib library.
-%package doc
-Summary: Documents for %{name}
-BuildArch: noarch
-Requires: %{name} = %{version}-%{release}
-
-%description doc
-Doc pages for %{name}.
-
%prep
%setup -q
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1
+cp %{SOURCE1} docs/zzipdoc/
+cp %{SOURCE2} docs/zzipdoc/
-%patch7 -p1
-%patch8 -p1
-%patch9 -p1
-%patch10 -p1
-%patch11 -p1
-%patch12 -p1
+%patch1 -p1
-pathfix.py -i %{__python3} -pn docs
%build
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
%configure \
--disable-static \
--enable-sdl \
- --enable-frame-pointer \
- --enable-builddir=_builddir
+ --enable-frame-pointer
# Remove rpath on 64bit archs
-sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' */libtool
-sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' */libtool
+sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
+sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
# Only patch generated _config.h on non-i686 and armv7hl
# These platforms have a correct _config.h already
-cd _builddir
+
+pushd %{_builddir}/zziplib-%{version}
%ifarch i686 armv7hl
-%apply_patch %{PATCH101} -p2
+ patch -p2 < %{PATCH100}
%endif
%ifnarch i686 armv7hl
-%apply_patch %{PATCH100} -p2
+ patch -p2 < %{PATCH101}
%endif
-cd ..
+popd
-%{__make} %{?_smp_mflags}
+%make_build
%install
-make install DESTDIR=%{buildroot}
-
-%post -p /sbin/ldconfig
+%make_install
-%postun -p /sbin/ldconfig
+%ldconfig_scriptlets
%files
+%doc docs/COPYING* ChangeLog README TODO
%{_libdir}/*.so.*
%files utils
%{_bindir}/*
%files devel
+%doc docs/README.SDL docs/*.htm
%{_includedir}/*
%exclude %{_libdir}/*.la
%{_libdir}/*.so
@@ -151,47 +121,86 @@ make install DESTDIR=%{buildroot}
%{_datadir}/aclocal/*.m4
%{_mandir}/man3/*
-%files doc
-%doc docs/README.SDL docs/*.htm docs/*.html
-%doc docs/COPYING* ChangeLog README TODO
-
%changelog
-* Fri Jul 15 2022 Liwei Ge - 0.13.68-9.0.1
-- Add doc sub package
-
-* Mon Aug 02 2021 Jakub Martisko - 0.13.68-9
+* Tue Aug 10 2021 Mohan Boddu - 0.13.71-9
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+ Related: rhbz#1991688
+
+* Tue Jul 27 2021 Jakub Martisko - 0.13.71-8
+- Add gating tests
+Resolves: rhbz#1986332
+
+* Fri Jul 23 2021 Jakub Martisko - 0.13.71-7
+- Remove the doc/zzipdoc/{options,match}.py scritps from the original tar
+- Replace them with a current github version
+- The original version of the files contains autogenerated header with incompatible license
+- This build thus uses modified tar archive
+Resolves: rhbz#1982241
+
+* Thu Jul 22 2021 Jakub Martisko - 0.13.71-6
- Fix CVE-2020-18442
-- Resolves: CVE-2020-18442
+Resolves: CVE-2020-18442
+Resolves: 1977964
+
+* Thu Jul 22 2021 Jakub Martisko - 0.13.71-5
+- Refresh the multilib patch
+Resolves: rhbz#1915747
+
+* Fri Apr 16 2021 Mohan Boddu - 0.13.71-4
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Mon Feb 01 2021 Jakub Martisko - 0.13.71-3
+- Use python3 (versioned) as buildrequires
+
+* Thu Jan 28 2021 Fedora Release Engineering - 0.13.71-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Thu Jan 21 2021 Jakub Martisko - 0.13.71-1
+- Rebase to 0.13.71
+- Drop the CVE patches, they are now part of the upstream package
+- Build no longer requires python2
+- Resolves: 1807565
+
+* Wed Jul 29 2020 Fedora Release Engineering - 0.13.69-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Tue Jul 14 2020 Tom Stellard - 0.13.69-8
+- Use make macros
+- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
+
+* Fri Jan 31 2020 Fedora Release Engineering - 0.13.69-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Sat Jul 27 2019 Fedora Release Engineering - 0.13.69-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
-* Tue Oct 16 2018 Jakub Martisko - 0.13.68-8
-- Fix CVE-2018-17828 in the "single z" binaries
-- Resolves: #1772447
+* Sun Feb 03 2019 Fedora Release Engineering - 0.13.69-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
-* Tue Oct 16 2018 Jakub Martisko - 0.13.68-7
-- Fix CVE-2018-17828
-- Resolves: #1635890
+* Thu Jan 24 2019 Jakub Martisko - 0.13.69-4
+- Add the missing CVE-2018-17828.part2.patch file
+- Fix Formating of the previous 2 changelog entries
-* Thu Oct 11 2018 Jakub Martisko - 0.13.68-6
-- Fix multilib regression by adding a 32bit version of the multilib patch
-- Properly bump the release number in the previous changelog message
-- Resolves: #1638337
+* Thu Jan 24 2019 Jakub Martisko - 0.13.69-3
+- Related: #1626202
+- Resolves: CVE-2018-16548
-* Thu Oct 04 2018 Jakub Martisko - 0.13.68-5
-- Fix memory leak caused by the CVE-2018-16548
-- Resolves: #1626202
+* Thu Jan 24 2019 Jakub Martisko - 0.13.69-2
+- Related: 1635890
+- Resolves: CVE-2018-17828
-* Mon Aug 13 2018 Jakub Martisko - 0.13.68-4
-- Change the build dependency to python-devel and use the pathfix.py script
-- Related: 1592262
+* Mon Jul 23 2018 Alexander Bokovoy - 0.13.69-1
+- Update to 0.13.69 release
+- Fixes: #1598246 (CVE-2018-6541)
+- Fixes: #1554673 (CVE-2018-7727)
+- Use versioned python executables everywhere
-* Sat Jul 28 2018 Jakub Martisko - 0.13.68-3
-- Fix CVEs 2018-7725, 2018-7726, 2018-7727, 2018-6484, 2018-6869
-- Resolves: 1555082
-- Resolves: 1545818
+* Sat Jul 14 2018 Fedora Release Engineering - 0.13.68-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
-* Tue Jul 03 2018 Jakub Martisko - 0.13.68-2
-- Port documentation generating scripts to Python 3
-- Include both docs/*.htm and docs/*html files
+* Sun Mar 18 2018 Iryna Shcherbina - 0.13.68-2
+- Update Python 2 dependency declarations to new packaging standards
+ (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
* Wed Feb 14 2018 Alexander Bokovoy - 0.13.68-1
- 0.13.68