tags 305971 patch thanks Oh what the heck, here's a patch.
Cheers, -- Steve Langasek postmodern programmer On Sat, Apr 23, 2005 at 01:58:37PM -0700, Steve Langasek wrote: > On Sat, Apr 23, 2005 at 10:50:15AM +0200, Christian T. Steigies wrote: > > Package: f2c > > Version: 20020621-3.2 > > Severity: serious > > Justification: segfaults on m68k which causes r-base build to fail (and > > probably others as well) > > > On m68k, r-base and a few other packages need f2c to build. The latest > > release of R fails to build on m68k with f2c segfaulting: > > > http://buildd.debian.org/fetch.php?&pkg=r-base&ver=2.1.0-1&arch=m68k&stamp=1114147840&file=log&as=raw > > > I assume this is dues to a bug in f2c, since with the f2c that was installed > > in the successful built, ch2inv.f can be compiled, whereas with the f2c that > > is currently in incoming, it can not. > This looks like a pretty serious regression in the latest security NMU of > f2c. The code now reads: > > char *c_functions = "c_functions"; > char *coutput = "c_output"; > char *initfname = "raw_data"; > char *initbname = "raw_data.b"; > char *blkdfname = "block_data"; > char *p1_file = "p1_file"; > char *p1_bakfile = "p1_file.BAK"; > char *sortfname = "init_file"; > char *proto_fname = "proto_file"; > > [...] > > void > set_tmp_names(Void) > { > #ifdef MSDOS > [...] > #else > sprintf(c_functions, "%s/f2c_func_XXXXXX", tmpdir); > sprintf(initfname, "%s/f2c_rc_XXXXXX", tmpdir); > sprintf(initbname, "%s/f2c_rc.b_XXXXXX", tmpdir); > sprintf(blkdfname, "%s/f2c_blkd_XXXXXX", tmpdir); > sprintf(p1_file, "%s/f2c_p1f_XXXXXX", tmpdir); > sprintf(p1_bakfile, "%s/f2c_p1fb_XXXXXX", tmpdir); > sprintf(sortfname, "%s/f2c_sort_XXXXXX", tmpdir); > #endif > [...] > } > > which is an obvious overflow condition. > > AFAICT, the initialization of these strings is completely inappropriate, and > should be replaced with a sensibly-sized buffer, followed by the use of > snprintf() instead of sprintf(). Would you (or Dan McMahill, if that's > where this patch came from) care to fix this up, or would you like me to > prepare a patch?
diff -u f2c-20020621/src/sysdep.c f2c-20020621/src/sysdep.c --- f2c-20020621/src/sysdep.c +++ f2c-20020621/src/sysdep.c @@ -26,14 +26,14 @@ char binread[] = "rb", textread[] = "r"; char binwrite[] = "wb", textwrite[] = "w"; -char *c_functions = "c_functions"; +char c_functions[64]; char *coutput = "c_output"; -char *initfname = "raw_data"; -char *initbname = "raw_data.b"; -char *blkdfname = "block_data"; -char *p1_file = "p1_file"; -char *p1_bakfile = "p1_file.BAK"; -char *sortfname = "init_file"; +char initfname[64]; +char initbname[64]; +char blkdfname[64]; +char p1_file[64]; +char p1_bakfile[64]; +char sortfname[64]; char *proto_fname = "proto_file"; char link_msg[] = "-lf2c -lm"; /* was "-lF77 -lI77 -lm -lc"; */ @@ -123,13 +123,13 @@ p1_bakfile = p1_file + k; sortfname = p1_bakfile + k; #else - sprintf(c_functions, "%s/f2c_func_XXXXXX", tmpdir); - sprintf(initfname, "%s/f2c_rc_XXXXXX", tmpdir); - sprintf(initbname, "%s/f2c_rc.b_XXXXXX", tmpdir); - sprintf(blkdfname, "%s/f2c_blkd_XXXXXX", tmpdir); - sprintf(p1_file, "%s/f2c_p1f_XXXXXX", tmpdir); - sprintf(p1_bakfile, "%s/f2c_p1fb_XXXXXX", tmpdir); - sprintf(sortfname, "%s/f2c_sort_XXXXXX", tmpdir); + snprintf(c_functions, sizeof(c_functions), "%s/f2c_func_XXXXXX", tmpdir); + snprintf(initfname, sizeof(initfname), "%s/f2c_rc_XXXXXX", tmpdir); + snprintf(initbname, sizeof(initbname), "%s/f2c_rc.b_XXXXXX", tmpdir); + snprintf(blkdfname, sizeof(blkdfname), "%s/f2c_blkd_XXXXXX", tmpdir); + snprintf(p1_file, sizeof(p1_file), "%s/f2c_p1f_XXXXXX", tmpdir); + snprintf(p1_bakfile, sizeof(p1_bakfile), "%s/f2c_p1fb_XXXXXX", tmpdir); + snprintf(sortfname, sizeof(sortfname), "%s/f2c_sort_XXXXXX", tmpdir); #endif { #ifdef MSDOS diff -u f2c-20020621/debian/changelog f2c-20020621/debian/changelog --- f2c-20020621/debian/changelog +++ f2c-20020621/debian/changelog @@ -1,3 +1,11 @@ +f2c (20020621-3.3) unstable; urgency=high + + * NMU, same issue + * Use preallocated buffers for our tmpfile names, instead of using + randomly-sized strings and scribbling on memory. Closes #305971. + + -- Steve Langasek <[EMAIL PROTECTED]> Sat, 23 Apr 2005 14:44:59 -0700 + f2c (20020621-3.2) unstable; urgency=HIGH * NMU again for same security issues. only in patch2: unchanged: --- f2c-20020621.orig/src/defs.h +++ f2c-20020621/src/defs.h @@ -64,7 +64,7 @@ extern int current_ftn_file; extern int maxcontin; -extern char *blkdfname, *initfname, *sortfname; +extern char blkdfname[], initfname[], sortfname[]; extern long headoffset; /* Since the header block requires data we don't know about until AFTER each function has been processed, we keep a only in patch2: unchanged: --- f2c-20020621.orig/src/main.c +++ f2c-20020621/src/main.c @@ -215,13 +215,13 @@ f2c_entry ("dneg", P_NO_ARGS, P_INT, &dneg, YES) }; /* table */ -extern char *c_functions; /* "c_functions" */ +extern char c_functions[]; /* "c_functions" */ extern char *coutput; /* "c_output" */ -extern char *initfname; /* "raw_data" */ -extern char *blkdfname; /* "block_data" */ -extern char *p1_file; /* "p1_file" */ -extern char *p1_bakfile; /* "p1_file.BAK" */ -extern char *sortfname; /* "init_file" */ +extern char initfname[]; /* "raw_data" */ +extern char blkdfname[]; /* "block_data" */ +extern char p1_file[]; /* "p1_file" */ +extern char p1_bakfile[]; /* "p1_file.BAK" */ +extern char sortfname[]; /* "init_file" */ extern char *proto_fname; /* "proto_file" */ FILE *protofile;
signature.asc
Description: Digital signature