mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
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>
This commit is contained in:
parent
02261d1bd9
commit
5324d25842
@ -247,6 +247,7 @@ _IO_new_file_fopen (FILE *fp, const char *filename, const char *mode,
|
|||||||
switch (*++mode)
|
switch (*++mode)
|
||||||
{
|
{
|
||||||
case '\0':
|
case '\0':
|
||||||
|
case ',':
|
||||||
break;
|
break;
|
||||||
case '+':
|
case '+':
|
||||||
omode = O_RDWR;
|
omode = O_RDWR;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <mcheck.h>
|
#include <mcheck.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -24,6 +25,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
#include <support/check.h>
|
||||||
#include <support/support.h>
|
#include <support/support.h>
|
||||||
#include <support/xstdio.h>
|
#include <support/xstdio.h>
|
||||||
|
|
||||||
@ -48,13 +50,40 @@ do_bz17916 (void)
|
|||||||
if (fp != NULL)
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
printf ("unexpected success\n");
|
printf ("unexpected success\n");
|
||||||
|
free (ccs);
|
||||||
|
fclose (fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
free (ccs);
|
free (ccs);
|
||||||
|
|
||||||
return 0;
|
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
|
static int
|
||||||
do_test (void)
|
do_test (void)
|
||||||
{
|
{
|
||||||
@ -78,7 +107,10 @@ do_test (void)
|
|||||||
|
|
||||||
xfclose (fp);
|
xfclose (fp);
|
||||||
|
|
||||||
return do_bz17916 ();
|
TEST_COMPARE (do_bz17916 (), 0);
|
||||||
|
TEST_COMPARE (do_bz18906 (), 0);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <support/test-driver.c>
|
#include <support/test-driver.c>
|
||||||
|
Loading…
Reference in New Issue
Block a user