diff options
author | Joe Simmons-Talbott <josimmon@redhat.com> | 2023-07-05 21:23:28 +0000 |
---|---|---|
committer | Joe Simmons-Talbott <josimmon@redhat.com> | 2023-07-05 21:24:06 +0000 |
commit | 5324d258427fd11ca0f4f595c94016e568b26d6b (patch) | |
tree | ccdb786892d04ac4eab6dbd32bb649d5309ee606 | |
parent | 02261d1bd930b50e9166086462dca885e9847826 (diff) | |
download | glibc-5324d258427fd11ca0f4f595c94016e568b26d6b.tar.gz glibc-5324d258427fd11ca0f4f595c94016e568b26d6b.tar.xz glibc-5324d258427fd11ca0f4f595c94016e568b26d6b.zip |
fileops: Don't process ,ccs= as individual mode flags (BZ#18906)
In processing the first 7 individual characters of the mode for fopen if ,ccs= is used those characters will be processed as well. Stop processing individual mode flags once a comma is encountered. This has the effect of requiring ,ccs= to be the last mode flag in the mode string. Add a testcase to check that the ,ccs= mode flag is not processed as individual mode flags. Reviewed-by: DJ Delorie <dj@redhat.com>
-rw-r--r-- | libio/fileops.c | 1 | ||||
-rw-r--r-- | libio/tst-fopenloc.c | 34 |
2 files changed, 34 insertions, 1 deletions
diff --git a/libio/fileops.c b/libio/fileops.c index 58c9e985e4..1c1113e339 100644 --- a/libio/fileops.c +++ b/libio/fileops.c @@ -247,6 +247,7 @@ _IO_new_file_fopen (FILE *fp, const char *filename, const char *mode, switch (*++mode) { case '\0': + case ',': break; case '+': omode = O_RDWR; diff --git a/libio/tst-fopenloc.c b/libio/tst-fopenloc.c index 089c61bf41..5b3c1849ef 100644 --- a/libio/tst-fopenloc.c +++ b/libio/tst-fopenloc.c @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <errno.h> +#include <fcntl.h> #include <locale.h> #include <mcheck.h> #include <stdio.h> @@ -24,6 +25,7 @@ #include <string.h> #include <wchar.h> #include <sys/resource.h> +#include <support/check.h> #include <support/support.h> #include <support/xstdio.h> @@ -48,14 +50,41 @@ do_bz17916 (void) if (fp != NULL) { printf ("unexpected success\n"); + free (ccs); + fclose (fp); return 1; } + free (ccs); return 0; } static int +do_bz18906 (void) +{ + /* BZ #18906 -- check processing of ,ccs= as flags case. */ + + const char *ccs = "r,ccs=+ISO-8859-1"; + size_t retval; + + FILE *fp = fopen (inputfile, ccs); + int flags; + + TEST_VERIFY (fp != NULL); + + if (fp != NULL) + { + flags = fcntl (fileno (fp), F_GETFL); + retval = (flags & O_RDWR) | (flags & O_WRONLY); + TEST_COMPARE (retval, false); + fclose (fp); + } + + return EXIT_SUCCESS; +} + +static int do_test (void) { FILE *fp; @@ -78,7 +107,10 @@ do_test (void) xfclose (fp); - return do_bz17916 (); + TEST_COMPARE (do_bz17916 (), 0); + TEST_COMPARE (do_bz18906 (), 0); + + return EXIT_SUCCESS; } #include <support/test-driver.c> |