Control: tags 897857 + patch
Control: tags 897857 + pending

Dear maintainer,

I've prepared an NMU for swig (versioned as 3.0.12-1.2) and uploaded it.

NMU diff is attached.

Cheers,
    Olly
diff -Nru swig-3.0.12/debian/changelog swig-3.0.12/debian/changelog
--- swig-3.0.12/debian/changelog	2018-06-18 00:25:41.000000000 +1200
+++ swig-3.0.12/debian/changelog	2018-08-10 12:48:36.000000000 +1200
@@ -1,3 +1,15 @@
+swig (3.0.12-1.2) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * python-fix-function-cast-warnings.patch: Fix GCC8 warnings in generated
+    Python code. (Closes: #897857)
+  * python-fix-gcc8-strncpy-warning.patch: Fix more GCC8 warnings in generated
+    Python code.
+  * fix-gcc8-memset-warnings.patch: Fix GCC8 warnings in generated code for
+    various languages.
+
+ -- Olly Betts <o...@survex.com>  Fri, 10 Aug 2018 12:48:36 +1200
+
 swig (3.0.12-1.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru swig-3.0.12/debian/patches/fix-gcc8-memset-warnings.patch swig-3.0.12/debian/patches/fix-gcc8-memset-warnings.patch
--- swig-3.0.12/debian/patches/fix-gcc8-memset-warnings.patch	1970-01-01 12:00:00.000000000 +1200
+++ swig-3.0.12/debian/patches/fix-gcc8-memset-warnings.patch	2018-08-10 12:48:36.000000000 +1200
@@ -0,0 +1,212 @@
+Description: Fix new GCC8 warnings in generated code
+ Backported from upstream git master based on the following ranges of commits:
+ git diff 74345c92^..b229d92f
+ git diff dd26e8a0^..a67eff0a
+ git diff ef1351c7..7ac21f37
+Author: Mike Romberg <mike-romb...@comcast.net>
+Origin: upstream
+Last-Updated: 2018-08-10
+
+--- a/Lib/python/pycontainer.swg
++++ b/Lib/python/pycontainer.swg
+@@ -434,8 +434,8 @@
+     {
+       swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index);
+       try {
+-	return swig::as<T>(item, true);
+-      } catch (std::exception& e) {
++	return swig::as<T>(item);
++      } catch (const std::invalid_argument& e) {
+ 	char msg[1024];
+ 	sprintf(msg, "in sequence element %d ", (int)_index);
+ 	if (!PyErr_Occurred()) {
+--- a/Lib/python/pystdcommon.swg
++++ b/Lib/python/pystdcommon.swg
+@@ -107,14 +107,14 @@
+ 
+   template <class Type> 
+   struct traits_as<Type, value_category> {
+-    static Type as(PyObject *obj, bool throw_error) {
++    static Type as(PyObject *obj) {
+       Type v;
+       int res = asval(obj, &v);
+       if (!obj || !SWIG_IsOK(res)) {
+ 	if (!PyErr_Occurred()) {
+ 	  ::%type_error(swig::type_name<Type>());
+ 	}
+-	if (throw_error) throw std::invalid_argument("bad type");
++	throw std::invalid_argument("bad type");
+       }
+       return v;
+     }
+@@ -122,7 +122,7 @@
+ 
+   template <class Type> 
+   struct traits_as<Type, pointer_category> {
+-    static Type as(PyObject *obj, bool throw_error) {
++    static Type as(PyObject *obj) {
+       Type *v = 0;      
+       int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+       if (SWIG_IsOK(res) && v) {
+@@ -134,21 +134,17 @@
+ 	  return *v;
+ 	}
+       } else {
+-	// Uninitialized return value, no Type() constructor required.
+-	static Type *v_def = (Type*) malloc(sizeof(Type));
+ 	if (!PyErr_Occurred()) {
+ 	  %type_error(swig::type_name<Type>());
+ 	}
+-	if (throw_error) throw std::invalid_argument("bad type");
+-	memset(v_def,0,sizeof(Type));
+-	return *v_def;
++	throw std::invalid_argument("bad type");
+       }
+     }
+   };
+ 
+   template <class Type> 
+   struct traits_as<Type*, pointer_category> {
+-    static Type* as(PyObject *obj, bool throw_error) {
++    static Type* as(PyObject *obj) {
+       Type *v = 0;      
+       int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+       if (SWIG_IsOK(res)) {
+@@ -157,15 +153,14 @@
+ 	if (!PyErr_Occurred()) {
+ 	  %type_error(swig::type_name<Type>());
+ 	}
+-	if (throw_error) throw std::invalid_argument("bad type");
+-	return 0;
++	throw std::invalid_argument("bad type");
+       }
+     }
+   };
+     
+   template <class Type>
+-  inline Type as(PyObject *obj, bool te = false) {
+-    return traits_as<Type, typename traits<Type>::category>::as(obj, te);
++  inline Type as(PyObject *obj) {
++    return traits_as<Type, typename traits<Type>::category>::as(obj);
+   }
+ 
+   template <class Type> 
+--- a/Lib/ruby/rubycontainer.swg
++++ b/Lib/ruby/rubycontainer.swg
+@@ -183,8 +183,8 @@
+     {
+       VALUE item = rb_ary_entry(_seq, _index );
+       try {
+-	return swig::as<T>(item, true);
+-      } catch (std::exception& e) {
++	return swig::as<T>(item);
++      } catch (const std::invalid_argument& e) {
+ 	char msg[1024];
+ 	sprintf(msg, "in sequence element %d ", _index);
+ 	VALUE lastErr = rb_gv_get("$!");
+@@ -926,7 +926,7 @@
+       VALUE elem = argv[0];
+       int idx = 0;
+       try {
+-	Sequence::value_type val = swig::as<Sequence::value_type>( elem, true );
++	Sequence::value_type val = swig::as<Sequence::value_type>( elem );
+ 	if ( i >= len ) {
+ 	  $self->resize(i-1, val);
+ 	  return $self;
+@@ -943,7 +943,7 @@
+ 	  }
+ 
+       } 
+-      catch( std::invalid_argument )
++      catch( const std::invalid_argument & )
+ 	{
+ 	  rb_raise( rb_eArgError, "%s",
+ 		    Ruby_Format_TypeError( "", 
+@@ -967,10 +967,10 @@
+ 	  Sequence::iterator start = $self->begin();
+ 	  VALUE elem = argv[idx];
+ 	  try {
+-	    Sequence::value_type val = swig::as<Sequence::value_type>( elem, true );
++	    Sequence::value_type val = swig::as<Sequence::value_type>( elem );
+ 	    $self->insert( start, val );
+ 	  }
+-	  catch( std::invalid_argument )
++	  catch( const std::invalid_argument & )
+ 	    {
+ 	      rb_raise( rb_eArgError, "%s",
+ 			Ruby_Format_TypeError( "", 
+--- a/Lib/ruby/rubystdcommon.swg
++++ b/Lib/ruby/rubystdcommon.swg
+@@ -114,15 +114,15 @@
+ 
+   template <class Type> 
+   struct traits_as<Type, value_category> {
+-    static Type as(VALUE obj, bool throw_error) {
++    static Type as(VALUE obj) {
+       Type v;
+       int res = asval(obj, &v);
+       if (!obj || !SWIG_IsOK(res)) {
+-	if (throw_error) throw std::invalid_argument("bad type");
+ 	VALUE lastErr = rb_gv_get("$!");
+ 	if (lastErr == Qnil) {
+ 	  %type_error(swig::type_name<Type>());
+ 	}
++        throw std::invalid_argument("bad type");
+       }
+       return v;
+     }
+@@ -130,7 +130,7 @@
+ 
+   template <class Type> 
+   struct traits_as<Type, pointer_category> {
+-    static Type as(VALUE obj, bool throw_error) {
++    static Type as(VALUE obj) {
+       Type *v = 0;      
+       int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+       if (SWIG_IsOK(res) && v) {
+@@ -142,40 +142,35 @@
+ 	  return *v;
+ 	}
+       } else {
+-	// Uninitialized return value, no Type() constructor required.
+-	if (throw_error) throw std::invalid_argument("bad type");
+ 	VALUE lastErr = rb_gv_get("$!");
+ 	if (lastErr == Qnil) {
+ 	  %type_error(swig::type_name<Type>());
+ 	}
+-	static Type *v_def = (Type*) malloc(sizeof(Type));
+-	memset(v_def,0,sizeof(Type));
+-	return *v_def;
++        throw std::invalid_argument("bad type");
+       }
+     }
+   };
+ 
+   template <class Type> 
+   struct traits_as<Type*, pointer_category> {
+-    static Type* as(VALUE obj, bool throw_error) {
++    static Type* as(VALUE obj) {
+       Type *v = 0;      
+       int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+       if (SWIG_IsOK(res)) {
+ 	return v;
+       } else {
+-	if (throw_error) throw std::invalid_argument("bad type");
+ 	VALUE lastErr = rb_gv_get("$!");
+ 	if (lastErr == Qnil) {
+ 	  %type_error(swig::type_name<Type>());
+ 	}
+-	return 0;
++        throw std::invalid_argument("bad type");
+       }
+     }
+   };
+ 
+   template <class Type>
+-  inline Type as(VALUE obj, bool te = false) {
+-    return traits_as< Type, typename traits< Type >::category >::as(obj, te);
++  inline Type as(VALUE obj) {
++    return traits_as< Type, typename traits< Type >::category >::as(obj);
+   }
+ 
+   template <class Type> 
diff -Nru swig-3.0.12/debian/patches/python-fix-function-cast-warnings.patch swig-3.0.12/debian/patches/python-fix-function-cast-warnings.patch
--- swig-3.0.12/debian/patches/python-fix-function-cast-warnings.patch	1970-01-01 12:00:00.000000000 +1200
+++ swig-3.0.12/debian/patches/python-fix-function-cast-warnings.patch	2018-08-10 11:29:30.000000000 +1200
@@ -0,0 +1,174 @@
+Description: [Python] Fix new GCC8 warnings in generated code
+ Avoid casts between incompatible function types where possible (when
+ keyword args are in use, it is not possible to avoid such warnings as
+ they are inherent in the design of Python's C API in that particular
+ case).
+Author: Olly Betts <o...@survex.com>
+Bug-Debian: https://bugs.debian.org/897857
+Bug: https://github.com/swig/swig/issues/1259
+Origin: upstream
+Forwarded: https://github.com/swig/swig/commit/7f9883011029674553a2a4b623d459f02b512458
+Last-Updated: 2018-08-10
+
+--- a/Lib/python/pyinit.swg
++++ b/Lib/python/pyinit.swg
+@@ -368,8 +368,8 @@
+     (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+   };
+   static SwigPyGetSet thisown_getset_closure = {
+-    (PyCFunction) SwigPyObject_own,
+-    (PyCFunction) SwigPyObject_own
++    SwigPyObject_own,
++    SwigPyObject_own
+   };
+   static PyGetSetDef thisown_getset_def = {
+     (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -465,6 +465,14 @@
+   return repr;  
+ }
+ 
++/* We need a version taking two PyObject* parameters so it's a valid
++ * PyCFunction to use in swigobject_methods[]. */
++SWIGRUNTIME PyObject *
++SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
++{
++  return SwigPyObject_repr((SwigPyObject*)v);
++}
++
+ SWIGRUNTIME int
+ SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+ {
+@@ -594,11 +602,7 @@
+ }
+ 
+ SWIGRUNTIME PyObject* 
+-#ifdef METH_NOARGS
+-SwigPyObject_next(PyObject* v)
+-#else
+ SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+-#endif
+ {
+   SwigPyObject *sobj = (SwigPyObject *) v;
+   if (sobj->next) {    
+@@ -633,6 +637,20 @@
+   return SWIG_Py_Void();
+ }
+ 
++#ifdef METH_NOARGS
++static PyObject*
++SwigPyObject_disown2(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
++{
++  return SwigPyObject_disown(v);
++}
++
++static PyObject*
++SwigPyObject_acquire2(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
++{
++  return SwigPyObject_acquire(v);
++}
++#endif
++
+ SWIGINTERN PyObject*
+ SwigPyObject_own(PyObject *v, PyObject *args)
+ {
+@@ -673,12 +691,12 @@
+ #ifdef METH_O
+ static PyMethodDef
+ swigobject_methods[] = {
+-  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
+-  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"acquires ownership of the pointer"},
++  {(char *)"disown",  (PyCFunction)SwigPyObject_disown2, METH_NOARGS,  (char *)"releases ownership of the pointer"},
++  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire2,METH_NOARGS,  (char *)"acquires ownership of the pointer"},
+   {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
+   {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
+   {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
+-  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
++  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr2,   METH_NOARGS,  (char *)"returns object representation"},
+   {0, 0, 0, 0}  
+ };
+ #else
+@@ -689,7 +707,7 @@
+   {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
+   {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
+   {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
+-  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
++  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_VARARGS,  (char *)"returns object representation"},
+   {0, 0, 0, 0}  
+ };
+ #endif
+--- a/Source/Modules/python.cxx
++++ b/Source/Modules/python.cxx
+@@ -1109,7 +1109,7 @@
+    * ------------------------------------------------------------ */
+   int add_pyinstancemethod_new() {
+     String *name = NewString("SWIG_PyInstanceMethod_New");
+-    Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_O, NULL},\n", name, name);
++    Printf(methods, "\t { \"%s\", %s, METH_O, NULL},\n", name, name);
+     Delete(name);
+     return 0;
+   }
+@@ -2479,17 +2479,17 @@
+     if (!kw) {
+       if (n && funpack) {
+ 	if (num_required == 0 && num_arguments == 0) {
+-	  Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_NOARGS, ", name, function);
++	  Printf(methods, "\t { \"%s\", %s, METH_NOARGS, ", name, function);
+ 	} else if (num_required == 1 && num_arguments == 1) {
+-	  Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_O, ", name, function);
++	  Printf(methods, "\t { \"%s\", %s, METH_O, ", name, function);
+ 	} else {
+-	  Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function);
++	  Printf(methods, "\t { \"%s\", %s, METH_VARARGS, ", name, function);
+ 	}
+       } else {
+-	Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function);
++	Printf(methods, "\t { \"%s\", %s, METH_VARARGS, ", name, function);
+       }
+     } else {
+-      Printf(methods, "\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS, ", name, function);
++      Printf(methods, "\t { \"%s\", (PyCFunction)%s, METH_VARARGS|METH_KEYWORDS, ", name, function);
+     }
+ 
+     if (!n) {
+@@ -3857,7 +3857,7 @@
+     if (shadow) {
+       if (builtin) {
+ 	String *rname = SwigType_namestr(real_classname);
+-	Printf(builtin_methods, "  { \"__disown__\", (PyCFunction) Swig::Director::swig_pyobj_disown< %s >, METH_NOARGS, \"\" },\n", rname);
++	Printf(builtin_methods, "  { \"__disown__\", Swig::Director::swig_pyobj_disown< %s >, METH_NOARGS, \"\" },\n", rname);
+ 	Delete(rname);
+       } else {
+ 	String *symname = Getattr(n, "sym:name");
+@@ -4694,13 +4694,13 @@
+ 	int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2;
+ 	String *ds = have_docstring(n) ? cdocstring(n, AUTODOC_FUNC) : NewString("");
+ 	if (check_kwargs(n)) {
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, METH_VARARGS|METH_KEYWORDS, (char *) \"%s\" },\n", symname, wname, ds);
++	  Printf(builtin_methods, "  { \"%s\", (PyCFunction)%s, METH_VARARGS|METH_KEYWORDS, \"%s\" },\n", symname, wname, ds);
+ 	} else if (argcount == 0) {
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, METH_NOARGS, (char *) \"%s\" },\n", symname, wname, ds);
++	  Printf(builtin_methods, "  { \"%s\", %s, METH_NOARGS, \"%s\" },\n", symname, wname, ds);
+ 	} else if (argcount == 1) {
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, METH_O, (char *) \"%s\" },\n", symname, wname, ds);
++	  Printf(builtin_methods, "  { \"%s\", %s, METH_O, \"%s\" },\n", symname, wname, ds);
+ 	} else {
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, METH_VARARGS, (char *) \"%s\" },\n", symname, wname, ds);
++	  Printf(builtin_methods, "  { \"%s\", %s, METH_VARARGS, \"%s\" },\n", symname, wname, ds);
+ 	}
+ 	Delete(fullname);
+ 	Delete(wname);
+@@ -4801,10 +4801,10 @@
+ 	  Append(pyflags, "METH_VARARGS");
+ 	if (have_docstring(n)) {
+ 	  String *ds = cdocstring(n, AUTODOC_STATICFUNC);
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, %s, (char *) \"%s\" },\n", symname, wname, pyflags, ds);
++	  Printf(builtin_methods, "  { \"%s\", (PyCFunction)%s, %s, \"%s\" },\n", symname, wname, pyflags, ds);
+ 	  Delete(ds);
+ 	} else {
+-	  Printf(builtin_methods, "  { \"%s\", (PyCFunction) %s, %s, \"\" },\n", symname, wname, pyflags);
++	  Printf(builtin_methods, "  { \"%s\", (PyCFunction)%s, %s, \"\" },\n", symname, wname, pyflags);
+ 	}
+ 	Delete(fullname);
+ 	Delete(wname);
diff -Nru swig-3.0.12/debian/patches/python-fix-gcc8-strncpy-warning.patch swig-3.0.12/debian/patches/python-fix-gcc8-strncpy-warning.patch
--- swig-3.0.12/debian/patches/python-fix-gcc8-strncpy-warning.patch	1970-01-01 12:00:00.000000000 +1200
+++ swig-3.0.12/debian/patches/python-fix-gcc8-strncpy-warning.patch	2018-08-10 11:57:37.000000000 +1200
@@ -0,0 +1,28 @@
+Description: Fix 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.
+Author: Mark Dufour <m.duf...@kopano.com>
+Origin: upstream
+Forwarded: https://github.com/swig/swig/commit/9825fcbab5c4ddd867432f9922bebfbec7b78af0
+Last-Updated: 2018-08-10
+
+diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg
+index 2cc58284..fe45ac94 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;
diff -Nru swig-3.0.12/debian/patches/series swig-3.0.12/debian/patches/series
--- swig-3.0.12/debian/patches/series	2018-06-18 00:13:21.000000000 +1200
+++ swig-3.0.12/debian/patches/series	2018-08-10 12:35:46.000000000 +1200
@@ -1,2 +1,5 @@
 ccache-rename.diff
 octave4.4.patch
+python-fix-function-cast-warnings.patch
+python-fix-gcc8-strncpy-warning.patch
+fix-gcc8-memset-warnings.patch

Reply via email to