-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I noticed several link warnings looking like this:
> CCLD test-rmdir > ../lib/libcoreutils.a(fflush.o): warning: warning: fflush.c:42: warning: > fseek cannot handle files larger than 4 GB on 32-bit platforms - use fseeko > function for handling of large files Indeed - that means that our fflush replacement will do the wrong thing on large files when the current offset is larger than 2g. Fixed by using fseeko instead. Several of our tests still use fseek, but that's not as bad, since we know we aren't operating on large files in those cases. So for those, I just #undef'd the link warning if the module being tested did not already depend on fseeko. - -- Don't work too hard, make some time for fun as well! Eric Blake e...@byu.net -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (Cygwin) Comment: Public key at home.comcast.net/~ericblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkr1/1gACgkQ84KuGfSFAYBI3wCgmJaTKgmhAtSAm5XTYk6+WDr3 9/oAoNVCqM0tljHveOF6w3/Jny5FNLjn =AIG5 -----END PGP SIGNATURE-----
>From 7becd9d708425924f3a402fdd3c6e18ba2a7e4e3 Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Sat, 7 Nov 2009 16:03:38 -0700 Subject: [PATCH] fflush, freadseek: use fseeko, not fseek Follow our own advice: fseek is not safe to use on large files. * lib/fflush.c (clear_ungetc_buffer_preserving_position) (clear_ungetc_buffer): Avoid potential problems on large files. * lib/freadseek.c (freadseek): Likewise. * modules/freadseek (Depends-on): Add fseeko. * modules/fseek (configure.ac): Set a witness. * tests/test-fflush.c (main): Use fseeko. * tests/test-fpurge.c (fseek): Disable link warning. * tests/test-freadable.c (fseek): Likewise. * tests/test-freading.c (fseek): Likewise. * tests/test-fseeko.c (fseek): Likewise. * tests/test-ftell.c (fseek): Likewise. * tests/test-ftello.c (fseek): Likewise. * tests/test-fwritable.c (fseek): Likewise. * tests/test-fwriting.c (fseek): Likewise. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 18 ++++++++++++++++++ lib/fflush.c | 4 ++-- lib/freadseek.c | 2 +- modules/freadseek | 1 + modules/fseek | 1 + tests/test-fflush.c | 2 +- tests/test-fpurge.c | 6 ++++++ tests/test-freadable.c | 8 +++++++- tests/test-freading.c | 6 ++++++ tests/test-fseeko.c | 6 ++++++ tests/test-ftell.c | 6 ++++++ tests/test-ftello.c | 6 ++++++ tests/test-fwritable.c | 8 +++++++- tests/test-fwriting.c | 8 +++++++- 14 files changed, 75 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 997a759..c9d05ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2009-11-07 Eric Blake <e...@byu.net> + + fflush, freadseek: use fseeko, not fseek + * lib/fflush.c (clear_ungetc_buffer_preserving_position) + (clear_ungetc_buffer): Avoid potential problems on large files. + * lib/freadseek.c (freadseek): Likewise. + * modules/freadseek (Depends-on): Add fseeko. + * modules/fseek (configure.ac): Set a witness. + * tests/test-fflush.c (main): Use fseeko. + * tests/test-fpurge.c (fseek): Disable link warning. + * tests/test-freadable.c (fseek): Likewise. + * tests/test-freading.c (fseek): Likewise. + * tests/test-fseeko.c (fseek): Likewise. + * tests/test-ftell.c (fseek): Likewise. + * tests/test-ftello.c (fseek): Likewise. + * tests/test-fwritable.c (fseek): Likewise. + * tests/test-fwriting.c (fseek): Likewise. + 2009-11-06 Simon Josefsson <si...@josefsson.org> * modules/memchr (Depends-on): Drop getpagesize dependency. diff --git a/lib/fflush.c b/lib/fflush.c index 7c6085c..0af1703 100644 --- a/lib/fflush.c +++ b/lib/fflush.c @@ -39,7 +39,7 @@ clear_ungetc_buffer_preserving_position (FILE *fp) { if (fp->_flags & _IO_IN_BACKUP) /* _IO_free_backup_area is a bit complicated. Simply call fseek. */ - fseek (fp, 0, SEEK_CUR); + fseeko (fp, 0, SEEK_CUR); } #else @@ -63,7 +63,7 @@ clear_ungetc_buffer (FILE *fp) # elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */ /* Nothing to do. */ # else /* other implementations */ - fseek (fp, 0, SEEK_CUR); + fseeko (fp, 0, SEEK_CUR); # endif } diff --git a/lib/freadseek.c b/lib/freadseek.c index 23046fa..fc50f51 100644 --- a/lib/freadseek.c +++ b/lib/freadseek.c @@ -106,7 +106,7 @@ freadseek (FILE *fp, size_t offset) if (fd >= 0 && lseek (fd, 0, SEEK_CUR) >= 0) { /* FP refers to a regular file. fseek is most efficient in this case. */ - return fseek (fp, offset, SEEK_CUR); + return fseeko (fp, offset, SEEK_CUR); } else { diff --git a/modules/freadseek b/modules/freadseek index 6a920ee..e1ad31c 100644 --- a/modules/freadseek +++ b/modules/freadseek @@ -9,6 +9,7 @@ lib/stdio-impl.h Depends-on: freadahead freadptr +fseeko lseek configure.ac: diff --git a/modules/fseek b/modules/fseek index 07f948e..375a54c 100644 --- a/modules/fseek +++ b/modules/fseek @@ -11,6 +11,7 @@ stdio configure.ac: gl_FUNC_FSEEK +gl_MODULE_INDICATOR([fseek]) gl_STDIO_MODULE_INDICATOR([fseek]) Makefile.am: diff --git a/tests/test-fflush.c b/tests/test-fflush.c index 3a17f8d..3afdf7b 100644 --- a/tests/test-fflush.c +++ b/tests/test-fflush.c @@ -59,7 +59,7 @@ main (void) } #endif /* POSIX requires fflush-fseek to set file offset of fd. */ - if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0) + if (fflush (f) != 0 || fseeko (f, 0, SEEK_CUR) != 0) { fputs ("Failed to flush-fseek sample file.\n", stderr); fclose (f); diff --git a/tests/test-fpurge.c b/tests/test-fpurge.c index 319a040..2197b89 100644 --- a/tests/test-fpurge.c +++ b/tests/test-fpurge.c @@ -23,6 +23,12 @@ #include <stdlib.h> #include <string.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-freadable.c b/tests/test-freadable.c index 4264cce..52a3287 100644 --- a/tests/test-freadable.c +++ b/tests/test-freadable.c @@ -1,5 +1,5 @@ /* Test of freadable() function. - Copyright (C) 2007-2008 Free Software Foundation, Inc. + Copyright (C) 2007-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,12 @@ #include <stdio.h> #include <stdlib.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-freading.c b/tests/test-freading.c index 0f8e686..dfa5ffb 100644 --- a/tests/test-freading.c +++ b/tests/test-freading.c @@ -23,6 +23,12 @@ #include <stdio.h> #include <stdlib.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-fseeko.c b/tests/test-fseeko.c index 9c284da..93b0adc 100644 --- a/tests/test-fseeko.c +++ b/tests/test-fseeko.c @@ -21,6 +21,12 @@ #include <stdio.h> #include <stdlib.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-ftell.c b/tests/test-ftell.c index 71f3ed2..786a448 100644 --- a/tests/test-ftell.c +++ b/tests/test-ftell.c @@ -23,6 +23,12 @@ #include "binary-io.h" +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-ftello.c b/tests/test-ftello.c index d3401ee..c5b1246 100644 --- a/tests/test-ftello.c +++ b/tests/test-ftello.c @@ -23,6 +23,12 @@ #include "binary-io.h" +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-fwritable.c b/tests/test-fwritable.c index 6a7b6f0..a0659ed 100644 --- a/tests/test-fwritable.c +++ b/tests/test-fwritable.c @@ -1,5 +1,5 @@ /* Test of fwritable() function. - Copyright (C) 2007-2008 Free Software Foundation, Inc. + Copyright (C) 2007-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,12 @@ #include <stdio.h> #include <stdlib.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ diff --git a/tests/test-fwriting.c b/tests/test-fwriting.c index f2ae068..9916b82 100644 --- a/tests/test-fwriting.c +++ b/tests/test-fwriting.c @@ -1,5 +1,5 @@ /* Test of fwriting() function. - Copyright (C) 2007-2008 Free Software Foundation, Inc. + Copyright (C) 2007-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,12 @@ #include <stdio.h> #include <stdlib.h> +/* None of the files accessed by this test are large, so disable the + fseek link warning if we are not using the gnulib fseek module. */ +#if !GNULIB_FSEEK +# undef fseek +#endif + #define ASSERT(expr) \ do \ { \ -- 1.6.5.rc1