# HG changeset patch # User Bruno Haible # Date 1213229856 -7200 # Node ID 270b7afb8fb7e6eb7a8c9a72a6f4e7c6f8e1dc10 # Parent 3a2bf9fb3efb5ae154c629aadbfe3bbfefeb21de Work around open() bug on HP-UX 11 and Solaris 9. diff -r 3a2bf9fb3efb -r 270b7afb8fb7 ChangeLog --- a/ChangeLog Thu Jun 12 01:12:11 2008 +0200 +++ b/ChangeLog Thu Jun 12 02:17:36 2008 +0200 @@ -1,3 +1,12 @@ +2008-06-11 Bruno Haible + + * m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug. + * lib/open.c: Include errno.h. + (open): Fail when attempting to write to a file that has a trailing + slash. + * tests/test-open.c (main): Test against trailing slash bug. + * doc/posix-functions/open.texi: Mention the trailing slash bug. + 2008-06-10 Bruno Haible * tests/test-vc-list-files-git.sh: Make double use of 'exit'. Needed diff -r 3a2bf9fb3efb -r 270b7afb8fb7 doc/posix-functions/open.texi --- a/doc/posix-functions/open.texi Thu Jun 12 01:12:11 2008 +0200 +++ b/doc/posix-functions/open.texi Thu Jun 12 02:17:36 2008 +0200 @@ -9,6 +9,10 @@ Portability problems fixed by Gnulib: @itemize @item +This function does not fail when the file name argument ends in a slash +and (without the slash) names a nonexistent file, on some platforms: +HP-UX 11.00, Solaris 9. +@item On Windows platforms (excluding Cygwin), this function does usually not recognize the @file{/dev/null} filename. @end itemize diff -r 3a2bf9fb3efb -r 270b7afb8fb7 lib/open.c --- a/lib/open.c Thu Jun 12 01:12:11 2008 +0200 +++ b/lib/open.c Thu Jun 12 02:17:36 2008 +0200 @@ -1,5 +1,5 @@ /* Open a descriptor to a file. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 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 @@ -24,6 +24,7 @@ /* If the fchdir replacement is used, open() is defined in fchdir.c. */ #ifndef FCHDIR_REPLACEMENT +# include # include # include # include @@ -51,6 +52,18 @@ va_end (arg); } +# if OPEN_TRAILING_SLASH_BUG + if (flags & (O_CREAT | O_WRONLY | O_RDWR)) + { + size_t len = strlen (filename); + if (len > 0 && filename[len - 1] == '/') + { + errno = EISDIR; + return -1; + } + } +# endif + # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (strcmp (filename, "/dev/null") == 0) filename = "NUL"; diff -r 3a2bf9fb3efb -r 270b7afb8fb7 m4/open.m4 --- a/m4/open.m4 Thu Jun 12 01:12:11 2008 +0200 +++ b/m4/open.m4 Thu Jun 12 02:17:36 2008 +0200 @@ -1,5 +1,5 @@ -# open.m4 serial 1 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# open.m4 serial 2 +dnl Copyright (C) 2007-2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -13,5 +13,40 @@ REPLACE_OPEN=1 AC_LIBOBJ([open]) ;; + *) + dnl open("foo/") should not create a file when the file name has a + dnl trailing slash. + AC_CACHE_CHECK([whether open recognizes a trailing slash], + [gl_cv_func_open_slash], + [ + AC_TRY_RUN([ +#include +#if HAVE_UNISTD_H +# include +#endif +int main () +{ + return open ("conftest.sl/", O_CREAT, 0600) >= 0; +}], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], + [ +changequote(,)dnl + case "$host_os" in + solaris2.[0-9]*) gl_cv_func_open_slash="guessing no" ;; + hpux*) gl_cv_func_open_slash="guessing no" ;; + *) gl_cv_func_open_slash="guessing yes" ;; + esac +changequote([,])dnl + ]) + rm -f conftest.sl + ]) + case "$gl_cv_func_open_slash" in + *no) + AC_DEFINE([OPEN_TRAILING_SLASH_BUG], 1, + [Define to 1 if open() fails to recognize a trailing slash.]) + REPLACE_OPEN=1 + AC_LIBOBJ([open]) + ;; + esac + ;; esac ]) diff -r 3a2bf9fb3efb -r 270b7afb8fb7 tests/test-open.c --- a/tests/test-open.c Thu Jun 12 01:12:11 2008 +0200 +++ b/tests/test-open.c Thu Jun 12 02:17:36 2008 +0200 @@ -38,6 +38,8 @@ int main () { + ASSERT (open ("nonexist.ent/", O_CREAT, 0600) < 0); + ASSERT (open ("/dev/null", O_RDONLY) >= 0); return 0;