Bug#1011176: apertium-recursive: fails to detect EOF condition on unsigned char archs
Steve Langasek
steve.langasek at canonical.com
Tue May 17 22:08:10 BST 2022
Package: apertium-recursive
Version: 1.1.0-1
Severity: serious
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu kinetic ubuntu-patch
Dear maintainers,
The new version of apertium-recursive FTBFS in Ubuntu on most archs because
of incorrect handling of EOF condition from fgetc():
[...]
g++ -DHAVE_CONFIG_H -I. -Wdate-time -D_FORTIFY_SOURCE=2 -Wall -Wextra -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -I/usr/include/lttoolbox-3.6 -I/usr/include/apertium-3.8 -I/usr/lib/aarch64-linux-gnu/apertium-3.8/include -I/usr/include/libxml2 -Wall -Wextra -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -std=c++20 -c -o pattern.o pattern.cc
rtx_comp.cc: In function ‘int main(int, char**)’:
rtx_comp.cc:104:10: warning: comparison is always false due to limited range of
data type [-Wtype-limits]
104 | if(c == EOF)
| ^
[...]
======================================================================
FAIL: test_compiles (__main__.NoRules)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/<<PKGBUILDDIR>>/tests/./run_tests.py", line 8, in test_compiles
with self.assertRaises(subprocess.CalledProcessError):
AssertionError: CalledProcessError not raised
----------------------------------------------------------------------
Ran 66 tests in 2.751s
[...]
(https://launchpad.net/ubuntu/+source/apertium-recursive/1.1.0-1/+build/23586338)
I have no idea why the tests passed at build time in Debian! But the logic
error in the C code is clear: fgetc() returns an int, not a char, and on
many archs (but not x86), a bare 'char' is unsigned, so can never == EOF.
The attached patch has been uploaded to Ubuntu to fix the build failure
there, and complete the libapertium3-3.8-1 transition.
Please consider applying it in Debian as well (and forwarding upstream).
--
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 apertium-recursive-1.1.0/debian/patches/series apertium-recursive-1.1.0/debian/patches/series
--- apertium-recursive-1.1.0/debian/patches/series 1969-12-31 16:00:00.000000000 -0800
+++ apertium-recursive-1.1.0/debian/patches/series 2022-05-17 13:49:42.000000000 -0700
@@ -0,0 +1 @@
+unsigned-char.patch
diff -Nru apertium-recursive-1.1.0/debian/patches/unsigned-char.patch apertium-recursive-1.1.0/debian/patches/unsigned-char.patch
--- apertium-recursive-1.1.0/debian/patches/unsigned-char.patch 1969-12-31 16:00:00.000000000 -0800
+++ apertium-recursive-1.1.0/debian/patches/unsigned-char.patch 2022-05-17 13:52:04.000000000 -0700
@@ -0,0 +1,29 @@
+Description: fgetc() returns an int, not a (unsigned) char
+ The code is wrongly assigning fgetc()'s return value to a char instead of an
+ int. On some architectures, this is doubly wrong because 'char' is
+ unsigned, meaning it can never hold the EOF value:
+ .
+ rtx_comp.cc: In function ‘int main(int, char**)’:
+ rtx_comp.cc:104:10: warning: comparison is always false due to limited range of data type [-Wtype-limits]
+ 104 | if(c == EOF)
+ | ^
+ .
+ Fix the type, which removes the warning and also fixes build failures on
+ these unsigned char archs in Ubuntu.
+Author: Steve Langasek <steve.langasek at ubuntu.com>
+Last-Update: 2022-05-17
+Forwarded: no
+
+Index: apertium-recursive-1.1.0/src/rtx_comp.cc
+===================================================================
+--- apertium-recursive-1.1.0.orig/src/rtx_comp.cc
++++ apertium-recursive-1.1.0/src/rtx_comp.cc
+@@ -98,7 +98,7 @@
+ cout << "Unable to open " << argv[optind] << " for reading." << endl;
+ exit(EXIT_FAILURE);
+ }
+- char c;
++ int c;
+ while((c = fgetc(check)) != '<')
+ {
+ if(c == EOF)
More information about the debian-science-maintainers
mailing list