diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch new file mode 100644 index 0000000..9fff13b --- /dev/null +++ b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch @@ -0,0 +1,58 @@ +From 21f532975f59f0c156c76cc739f5a93f57d8f6cb Mon Sep 17 00:00:00 2001 +From: Mark Dufour +Date: Tue, 14 Feb 2017 10:48:30 +0100 +Subject: [PATCH] [Coverity] fix issue reported for + SWIG_Python_ConvertFunctionPtr + +Fix Coverity issue reported for SWIG_Python_ConvertFunctionPtr: + +"Execution cannot reach this statement: *ptr = vptr;" + +Because if 'ty' is null, then desc becomes null and we return with +SWIG_ERROR. So 'ty' cannot be null at 'if (ty)'. +--- + Lib/python/pyrun.swg | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg +index ab1237f62..939a69204 100644 +--- a/Lib/python/pyrun.swg ++++ b/Lib/python/pyrun.swg +@@ -1287,25 +1287,22 @@ SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; +- ++ swig_cast_info *tc; ++ + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; +- if (!desc) ++ if (!desc) + return SWIG_ERROR; +- if (ty) { +- swig_cast_info *tc = SWIG_TypeCheck(desc,ty); +- if (tc) { +- int newmemory = 0; +- *ptr = SWIG_TypeCast(tc,vptr,&newmemory); +- assert(!newmemory); /* newmemory handling not yet implemented */ +- } else { +- return SWIG_ERROR; +- } ++ tc = SWIG_TypeCheck(desc,ty); ++ if (tc) { ++ int newmemory = 0; ++ *ptr = SWIG_TypeCast(tc,vptr,&newmemory); ++ assert(!newmemory); /* newmemory handling not yet implemented */ + } else { +- *ptr = vptr; ++ return SWIG_ERROR; + } + return SWIG_OK; + } +-- +2.14.3 + diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch new file mode 100644 index 0000000..990bd40 --- /dev/null +++ b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch @@ -0,0 +1,36 @@ +From 9825fcbab5c4ddd867432f9922bebfbec7b78af0 Mon Sep 17 00:00:00 2001 +From: Mark Dufour +Date: Tue, 14 Feb 2017 10:34:37 +0100 +Subject: [PATCH] [Coverity] fix issue reported for SWIG_Python_FixMethods + +Fix Coverity issue reported for SWIG_Python_FixMethods: + +"buffer_size: Calling strncpy with a source string whose length +(10 chars) is greater than or equal to the size argument (10) +will fail to null-terminate buff." + +The issue is only reported for the "swig_ptr: " line, but for +consistency we replace both occurrences of strncpy with memcpy. +--- + Lib/python/pyinit.swg | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg +index 2cc582841..fe45ac941 100644 +--- a/Lib/python/pyinit.swg ++++ b/Lib/python/pyinit.swg +@@ -306,9 +306,9 @@ SWIG_Python_FixMethods(PyMethodDef *methods, + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; +- strncpy(buff, methods[i].ml_doc, ldoc); ++ memcpy(buff, methods[i].ml_doc, ldoc); + buff += ldoc; +- strncpy(buff, "swig_ptr: ", 10); ++ memcpy(buff, "swig_ptr: ", 10); + buff += 10; + SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); + methods[i].ml_doc = ndoc; +-- +2.14.3 + diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch new file mode 100644 index 0000000..d0fe997 --- /dev/null +++ b/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch @@ -0,0 +1,41 @@ +From 13eeebd2fb3005abc876957c68bde6a92510aa44 Mon Sep 17 00:00:00 2001 +From: Mark Dufour +Date: Tue, 14 Feb 2017 10:53:14 +0100 +Subject: [PATCH] [Coverity] fix issue reported for wrapper argument checking + +Fix Coverity issue reported for wrapper argument checking: + +"Null-checking args suggests that it may be null, but it has already +been dereferenced on all paths leading to the check." + +So 'args' is null checked, but after dereferencing it with +PyTuple_Check(args). +--- + Source/Modules/python.cxx | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx +index a6801fc4e..5e058e773 100644 +--- a/Source/Modules/python.cxx ++++ b/Source/Modules/python.cxx +@@ -2541,9 +2541,14 @@ public: + + if (!fastunpack) { + Wrapper_add_local(f, "ii", "Py_ssize_t ii"); +- if (maxargs - (add_self ? 1 : 0) > 0) +- Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); +- Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n"); ++ ++ if (maxargs - (add_self ? 1 : 0) > 0) { ++ Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); ++ Append(f->code, "argc = PyObject_Length(args);\n"); ++ } else { ++ Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n"); ++ } ++ + if (add_self) + Append(f->code, "argv[0] = self;\n"); + Printf(f->code, "for (ii = 0; (ii < %d) && (ii < argc); ii++) {\n", add_self ? maxargs - 1 : maxargs); +-- +2.14.3 + diff --git a/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch b/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch new file mode 100644 index 0000000..041619e --- /dev/null +++ b/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch @@ -0,0 +1,40 @@ +From 5803e81d488e97623fe29b8629b977be01a8229e Mon Sep 17 00:00:00 2001 +From: Mark Dufour +Date: Mon, 6 Mar 2017 21:16:41 +0100 +Subject: [PATCH] Fix Coverity issue reported for setslice (pycontainer.swg): + +"CID 11151 (#3-1 of 3): Using invalid iterator (INVALIDATE_ITERATOR)18. +increment_iterator: Incrementing iterator it though it is already past +the end of its container." + +Coverity does not understand 'replace_count', so warns that we may go +past self->end() (or self->rend() I guess). +--- + Lib/python/pycontainer.swg | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg +index d40b0baa8..9aefb4fc7 100644 +--- a/Lib/python/pycontainer.swg ++++ b/Lib/python/pycontainer.swg +@@ -351,7 +351,7 @@ namespace swig { + typename Sequence::const_iterator isit = is.begin(); + typename Sequence::iterator it = self->begin(); + std::advance(it,ii); +- for (size_t rc=0; rcend(); ++rc) { + *it++ = *isit++; + for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) + it++; +@@ -367,7 +367,7 @@ namespace swig { + typename Sequence::const_iterator isit = is.begin(); + typename Sequence::reverse_iterator it = self->rbegin(); + std::advance(it,size-ii-1); +- for (size_t rc=0; rcrend(); ++rc) { + *it++ = *isit++; + for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) + it++; +-- +2.14.3 + diff --git a/swig-3.0.12-Fix-configure-for-Go-1_10.patch b/swig-3.0.12-Fix-configure-for-Go-1_10.patch deleted file mode 100644 index a171f18..0000000 --- a/swig-3.0.12-Fix-configure-for-Go-1_10.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -up swig-3.0.12/configure.ac.go110 swig-3.0.12/configure.ac ---- swig-3.0.12/configure.ac.go110 2018-02-13 13:08:16.543632561 +0100 -+++ swig-3.0.12/configure.ac 2018-02-13 13:56:20.241295155 +0100 -@@ -2606,7 +2606,7 @@ else - esac - AC_MSG_CHECKING([whether go version is too old]) - case $go_version in -- go1.1* | go1.0* | go1 ) -+ go1.1 | go1.0* | go1 ) - AC_MSG_RESULT([yes - minimum version is 1.2]) - GO= - GOOPT="-intgosize 32" -@@ -2624,7 +2624,7 @@ else - ;; - esac - case $go_version in -- go1.0* | go1 | go1.1*) -+ go1.0* | go1 | go1.1) - GOOPT="$GOOPT -use-shlib" - ;; - go1.2*) diff --git a/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch b/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch new file mode 100644 index 0000000..69e22dd --- /dev/null +++ b/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch @@ -0,0 +1,51 @@ +From 5f6012039abb6ec9e9dfea801effa6b02fd102bc Mon Sep 17 00:00:00 2001 +From: Vsevolod Kvachev +Date: Thu, 19 Apr 2018 23:04:37 +0300 +Subject: [PATCH] Fix go version matching in configure for go1.10 + +--- + configure.ac | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 833cb37bf..ba1631743 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2597,7 +2597,7 @@ else + GOVERSIONOPTION=version + go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') + case "$go_version" in +- go1 | go1.[[01234]]*) ++ go1 | go1.[[01234]] | go1.[[01234]].*) + GOC=$(sh -c "$(go env) && echo \$GOCHAR")c + ;; + *) +@@ -2606,7 +2606,7 @@ else + esac + AC_MSG_CHECKING([whether go version is too old]) + case $go_version in +- go1.1* | go1.0* | go1 ) ++ go1.1.* | go1.1 | go1.0 | go1.0.* | go1 ) + AC_MSG_RESULT([yes - minimum version is 1.2]) + GO= + GOOPT="-intgosize 32" +@@ -2624,13 +2624,13 @@ else + ;; + esac + case $go_version in +- go1.0* | go1 | go1.1*) ++ go1.0 | go1.0.* | go1 | go1.1 | go1.1.*) + GOOPT="$GOOPT -use-shlib" + ;; +- go1.2*) ++ go1.2 | go1.2.*) + GO12=true + ;; +- go1.3* | go1.4*) ++ go1.3 | go1.3.* | go1.4 | go1.4.*) + GO13=true + ;; + *) +-- +2.14.3 + diff --git a/swig.spec b/swig.spec index 64fc86c..776bb06 100644 --- a/swig.spec +++ b/swig.spec @@ -12,9 +12,11 @@ %{!?golang:%global golang 0} %{!?octave:%global octave 0} %{!?Rlang:%global Rlang 0} +%bcond_with build_ccache_swig %else %{!?octave:%global octave 1} %{!?Rlang:%global Rlang 1} +%bcond_without build_ccache_swig %endif %ifarch aarch64 %{arm} %{mips} ppc64le ppc %{power64} s390 s390x %{!?javalang:%global javalang 0} @@ -31,15 +33,17 @@ Summary: Connects C/C++/Objective C to some high-level programming languages Name: swig Version: 3.0.12 -Release: 16%{?dist} +Release: 17%{?dist} License: GPLv3+ and BSD URL: http://swig.sourceforge.net/ Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz # Define the part of man page sections Source1: description.h2m +%if %{with build_ccache_swig} Source2: description-ccache.h2m Source3: ccache-swig.sh Source4: ccache-swig.csh +%endif Patch0: swig308-Do-not-use-isystem.patch Patch1: swig-3.0.12-Fix-testsuite-to-work-without-.-in-INC.patch @@ -50,7 +54,12 @@ Patch2: https://patch-diff.githubusercontent.com/raw/swig/swig/pull/968/swig-no Patch3: swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch Patch4: swig-3.0.12-Fix-type-promotion-wrapping-some-non-trivial-constan.patch Patch5: swig-3.0.12-Correct-php-testcase.patch -Patch6: swig-3.0.12-Fix-configure-for-Go-1_10.patch +Patch6: swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch +# Backport upstream Coverity fixes (BZ# 1570037) +Patch7: swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch +Patch8: swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch +Patch9: swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch +Patch10: swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch BuildRequires: perl-interpreter, pcre-devel BuildRequires: python2-devel, python3-devel @@ -110,11 +119,11 @@ Eiffel and Guile. SWIG is normally used to create high-level interpreted programming environments, systems integration, and as a tool for building user interfaces +%if %{with build_ccache_swig} %package -n ccache-swig Summary: Fast compiler cache License: GPLv2+ Group: Development/Tools -Requires: ccache Requires: swig Conflicts: swig < 3.0.8-2 @@ -122,6 +131,7 @@ Conflicts: swig < 3.0.8-2 ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. +%endif %package doc Summary: Documentation files for SWIG @@ -151,6 +161,10 @@ in gdb. %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 for all in CHANGES README; do iconv -f ISO88591 -t UTF8 < $all > $all.new @@ -182,6 +196,9 @@ done --with-octave=/usr/bin/octave \ --without-maximum-compile-warnings \ %endif +%if %{without build_ccache_swig} + --disable-ccache \ +%endif ; make %{?_smp_mflags} @@ -231,6 +248,7 @@ chmod a+x h2m_helper_swig # Generate man page help2man -N --section 1 ./h2m_helper_swig --include %{SOURCE1} -o %{name}.1 +%if %{with build_ccache_swig} ######################################################## # Use help output for generating of man page ccache-swig %{buildroot}%{_bindir}/ccache-swig -h >>help_ccache @@ -257,19 +275,24 @@ sed -i -e 's#@DOCDIR@#%{_docdir}#' help_ccache # Generate man page help2man -N --section 1 ./h2m_helper_ccache --include help_ccache -o ccache-swig.1 +%endif # Add man page for swig to repository mkdir -p %{buildroot}%{_mandir}/man1/ install -p -m 0644 %{name}.1 %{buildroot}%{_mandir}/man1/ +%if %{with build_ccache_swig} install -p -m 0644 ccache-swig.1 %{buildroot}%{_mandir}/man1/ +%endif # Quiet some rpmlint complaints - remove empty file rm -f %{buildroot}%{_datadir}/%name/%{version}/octave/std_carray.i +%if %{with build_ccache_swig} # Enable ccache-swig by default mkdir -p %{buildroot}%{_sysconfdir}/profile.d/ install -dm 755 %{buildroot}%{_sysconfdir}/profile.d install -pm 644 %{SOURCE3} %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d +%endif # Add swig.gdb sub-package gdb mkdir -p %{buildroot}%{_datadir}/%{name}/gdb @@ -284,10 +307,12 @@ install -pm 644 Tools/swig.gdb %{buildroot}%{_datadir}/%{name}/gdb %doc ANNOUNCE CHANGES CHANGES.current %doc COPYRIGHT README TODO +%if %{with build_ccache_swig} %files -n ccache-swig %{_bindir}/ccache-swig %config(noreplace) %{_sysconfdir}/profile.d/ccache-swig.*sh %{_mandir}/man1/ccache-swig.1* +%endif %files doc %license LICENSE LICENSE-GPL LICENSE-UNIVERSITIES @@ -297,6 +322,10 @@ install -pm 644 Tools/swig.gdb %{buildroot}%{_datadir}/%{name}/gdb %{_datadir}/%{name}/gdb %changelog +* Tue Apr 24 2018 Jitka Plesnikova - 3.0.12-17 +- Backport upstream Coverity fixes (bug#1570037) +- Do not build ccache-swig on RHEL + * Wed Feb 14 2018 Jitka Plesnikova - 3.0.12-16 - Update conditions for tests - Fix configure to properly check version of Go 1.10