From 7becd9d708425924f3a402fdd3c6e18ba2a7e4e3 Mon Sep 17 00:00:00 2001 From: Eric Blake 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 --- 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 997a759ee..c9d05ad3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2009-11-07 Eric Blake + + 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 * modules/memchr (Depends-on): Drop getpagesize dependency. diff --git a/lib/fflush.c b/lib/fflush.c index 7c6085cfd..0af17034e 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 23046fa4c..fc50f5136 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 6a920ee80..e1ad31cb0 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 07f948e8e..375a54cc5 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 3a17f8d47..3afdf7bd6 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 319a04042..2197b89df 100644 --- a/tests/test-fpurge.c +++ b/tests/test-fpurge.c @@ -23,6 +23,12 @@ #include #include +/* 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 4264cce33..52a328730 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 #include +/* 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 0f8e686ea..dfa5ffbf5 100644 --- a/tests/test-freading.c +++ b/tests/test-freading.c @@ -23,6 +23,12 @@ #include #include +/* 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 9c284da50..93b0adc36 100644 --- a/tests/test-fseeko.c +++ b/tests/test-fseeko.c @@ -21,6 +21,12 @@ #include #include +/* 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 71f3ed26d..786a448c1 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 d3401ee41..c5b1246ff 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 6a7b6f007..a0659edc0 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 #include +/* 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 f2ae068a2..9916b8229 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 #include +/* 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 \ { \ -- 2.11.0