[Debian-med-packaging] Bug#954127: fermi-lite broken on armhf

Steve Langasek steve.langasek at canonical.com
Tue Mar 17 08:16:20 GMT 2020


Package: fermi-lite
Version: 0.1-9
Severity: grave
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu focal ubuntu-patch

Dear maintainers,

In Ubuntu, the fermi-lite autopkgtest has started failing on armhf with
version 0.1-9; where it previously succeeded, it now produces a segfault.

Investigation shows a problem with an assumption about the behavior when
implicitly casting from an unsigned integer type to a signed integer type:
when v->n is 0 in this function, because v->n is of type size_t, v->n - 1
yields UINT32_MAX, not -1.

The attached patch fixes the segfault.

Since the code here doesn't seem to have changed since the previous version
of the package whose autopkgtests succeeded, I assume this is due to a
behavior change in the compiler.  However, as far as I can see the new and
old behavior are valid under the C standard, so this is a fermi-lite bug,
not a compiler bug.

Cheers,
-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                   https://www.debian.org/
slangasek at ubuntu.com                                     vorlon at debian.org
-------------- next part --------------
diff -Nru fermi-lite-0.1/debian/patches/ensure-signed-comparison fermi-lite-0.1/debian/patches/ensure-signed-comparison
--- fermi-lite-0.1/debian/patches/ensure-signed-comparison	1969-12-31 16:00:00.000000000 -0800
+++ fermi-lite-0.1/debian/patches/ensure-signed-comparison	2020-03-17 01:09:35.000000000 -0700
@@ -0,0 +1,21 @@
+Description: Ensure that our variable checking for >= 0 is signed
+ The type of v->n is size_t, which is an unsigned type, and we are assigning
+ v->n - 1 to i and looping while this is >= 0.  If v->n == 0, on some
+ architectures (armhf) this results in i being set to a positive value
+ (specifically, UINT32_MAX).
+Author: Steve Langasek <steve.langasek at ubuntu.com>
+Last-Update: 2020-03-17
+
+Index: fermi-lite-0.1/mag.c
+===================================================================
+--- fermi-lite-0.1.orig/mag.c
++++ fermi-lite-0.1/mag.c
+@@ -506,7 +506,7 @@
+ 
+ 	for (j = 0; j < 2; ++j) {
+ 		sum_n = sum_l = 0;
+-		for (i = v->n - 1; i >= 0; --i) {
++		for (i = (int64_t)v->n - 1; i >= 0; --i) {
+ 			const magv_t *p = &v->a[srt[i]<<32>>32];
+ 			int tmp1, tmp2;
+ 			tmp1 = tmp2 = 0;
diff -Nru fermi-lite-0.1/debian/patches/series fermi-lite-0.1/debian/patches/series
--- fermi-lite-0.1/debian/patches/series	2020-02-15 04:17:54.000000000 -0800
+++ fermi-lite-0.1/debian/patches/series	2020-03-17 01:04:57.000000000 -0700
@@ -3,4 +3,5 @@
 rename_bseq1_t.patch
 bcf_seqlib.patch
 simde
+ensure-signed-comparison
 sync_instead_of_atomic


More information about the Debian-med-packaging mailing list