Commit 78b40d0a authored by reggie@mdk10.(none)'s avatar reggie@mdk10.(none)

BUG# 9148: Denial of service

This is a second patch needing another review.  The first patch didn't solve
the entire problem.  open and fopen on Windows will still open
files like "com1.sym" when they shouldn't.  This patch
checks that the file exists before trying to open it.
parent 2536b593
...@@ -33,9 +33,21 @@ FILE *my_fopen(const char *FileName, int Flags, myf MyFlags) ...@@ -33,9 +33,21 @@ FILE *my_fopen(const char *FileName, int Flags, myf MyFlags)
DBUG_ENTER("my_fopen"); DBUG_ENTER("my_fopen");
DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d", DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d",
FileName, Flags, MyFlags)); FileName, Flags, MyFlags));
/*
make_ftype(type,Flags); * if we are not creating, then we need to use my_access to make sure
if ((fd = fopen(FileName, type)) != 0) * the file exists since Windows doesn't handle files like "com1.sym" very well
*/
#ifdef __WIN__
if (! (Flags & O_CREAT) && my_access(FileName, F_OK))
fd=0;
else
#endif
{
make_ftype(type,Flags);
fd = fopen(FileName, type);
}
if (fd != 0)
{ {
/* /*
The test works if MY_NFILE < 128. The problem is that fileno() is char The test works if MY_NFILE < 128. The problem is that fileno() is char
......
...@@ -46,6 +46,12 @@ File my_open(const char *FileName, int Flags, myf MyFlags) ...@@ -46,6 +46,12 @@ File my_open(const char *FileName, int Flags, myf MyFlags)
DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d", DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d",
FileName, Flags, MyFlags)); FileName, Flags, MyFlags));
#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__) || defined(OS2) #if defined(MSDOS) || defined(__WIN__) || defined(__EMX__) || defined(OS2)
/* if we are not creating, then we need to use my_access to make
* sure the file exists since Windows doesn't handle files like
* "com1.sym" very well
*/
if (! (Flags & O_CREAT) && my_access(FileName, F_OK))
return -1;
if (Flags & O_SHARE) if (Flags & O_SHARE)
fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO, fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO,
MY_S_IREAD | MY_S_IWRITE); MY_S_IREAD | MY_S_IWRITE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment