From: Wez Furlong Date: Wed, 1 Jan 2003 09:55:38 +0000 (+0000) Subject: Workaround a bug in glibc 2.2.9x and later that causes it not to seek to EOF X-Git-Tag: PHP_4_3_before_13561_fix~150 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8721992dde3234458f294a1d1be09c381469d2a;p=php Workaround a bug in glibc 2.2.9x and later that causes it not to seek to EOF for stdio streams opened with a mode of "a+". --- diff --git a/acinclude.m4 b/acinclude.m4 index d7af5fffdf..f851045dde 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1462,6 +1462,45 @@ int main(void) { fi ]) +AC_DEFUN([PHP_BROKEN_GLIBC_FOPEN_APPEND],[ + AC_MSG_CHECKING([for broken libc stdio]) + AC_TRY_RUN([ +#include +int main(int argc, char *argv[]) +{ + FILE *fp; + long position; + char *filename = "/tmp/phpglibccheck"; + + fp = fopen(filename, "w"); + if (fp == NULL) { + perror("fopen"); + exit(2); + } + fputs("foobar", fp); + fclose(fp); + + fp = fopen(filename, "a+"); + position = ftell(fp); + fclose(fp); + unlink(filename); + if (position == 0) + return 1; + return 0; +} +], +[have_broken_glibc_fopen_append=no], +[have_broken_glibc_fopen_append=yes ]) + + if test "$have_broken_glibc_fopen_append" = "yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_BROKEN_GLIBC_FOPEN_APPEND,1, [Define if your glibc borks on fopen with mode a+]) + else + AC_MSG_RESULT(no) + fi +]) + + AC_DEFUN([PHP_FOPENCOOKIE],[ AC_CHECK_FUNC(fopencookie, [ have_glibc_fopencookie=yes ]) diff --git a/configure.in b/configure.in index 586841acc3..6d597743af 100644 --- a/configure.in +++ b/configure.in @@ -382,6 +382,7 @@ sys/ipc.h \ ]) PHP_FOPENCOOKIE +PHP_BROKEN_GLIBC_FOPEN_APPEND dnl Checks for typedefs, structures, and compiler characteristics. dnl ------------------------------------------------------------------------- diff --git a/main/streams.c b/main/streams.c index 02be2f2d75..74b95bf94b 100755 --- a/main/streams.c +++ b/main/streams.c @@ -1317,6 +1317,12 @@ PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STRE stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode); +#ifdef HAVE_BROKEN_GLIBC_FOPEN_APPEND + if (strchr(mode, 'a')) { + fseek(file, 0, SEEK_END); + } +#endif + if (stream) { if (self->is_pipe) { stream->flags |= PHP_STREAM_FLAG_NO_SEEK; @@ -2417,7 +2423,7 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio } } - if (stream && stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && strchr(mode, 'a')) { + if (stream && stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && strchr(mode, 'a') && stream->position == 0) { off_t newpos = 0; /* if opened for append, we need to revise our idea of the initial file position */