Package: cfortran
Followup-For: Bug #1114078
User: [email protected]
Usertags: patch

Dear Maintainers,

In Ubuntu stonking (and Debian sid with GCC 15), cfortran fails to build from 
source due to C23 prototype semantics and a heap buffer overflow in tests under 
_FORTIFY_SOURCE=3:

1. GCC 15 defaults to C23 where empty parameter lists in prototypes mean 
strictly 0 arguments. The internal testsuite in eg/ exercises legacy Fortran/C 
prototypes and function pointer casts into qsort (__compar_fn_t), resulting in:
   e2/e2.c:10:28: error: too many arguments to function 'easy_'; expected 0, 
have 2
   q/q.c:15: error: passing 'int (*)(void)' to parameter of type '__compar_fn_t'

Setting 'export DEB_CFLAGS_MAINT_APPEND = -std=gnu17' in debian/rules restores 
GNU17 semantics for building and running the testsuite.

2. In eg/fstr/fstr.c, Pstr allocates malloc(ls > lsave ? ls : lsave) without 
space for the terminating NUL byte. When strcpy writes lsave+1 bytes, it 
triggers buffer overflow termination under _FORTIFY_SOURCE=3. Allocating + 1 
byte fixes the crash. (Also submitted upstream as PR #3: 
https://github.com/bastien-roucaries/cfortran/pull/3).

Attached below is the patch against cfortran 20210827-1.1. With this patch, all 
41 testsuites pass and the package builds cleanly under GCC 15.

Thank you,
Viktor Pashaiev <[email protected]>

--- a/debian/rules
+++ b/debian/rules
@@ -4,6 +4,7 @@
 
 # Uncomment this to turn on verbose mode.
 export DH_VERBOSE=1
+export DEB_CFLAGS_MAINT_APPEND = -std=gnu17
 
 %:
        dh $@ --with autoreconf

--- a/eg/fstr/fstr.c
+++ b/eg/fstr/fstr.c
@@ -16,7 +16,7 @@
 if (!s || !save) { save=s; return; }
 ls    = strlen(s   );
 lsave = strlen(save);
-temp = (char *)malloc(ls>lsave?ls:lsave);
+temp = (char *)malloc((ls>lsave?ls:lsave) + 1);
 /* Switch contents of argument with contents of saved string. */
 strcpy(temp,save);
 strcpy(save,s   );

Reply via email to