Commit aa3a934b authored by unknown's avatar unknown
Browse files

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/home/my/mysql-4.1


sql/sql_parse.cc:
  Auto merged
parents 605f7061 549f56dc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -578,6 +578,7 @@ extern int my_access(const char *path, int amode);
#else
#define my_access access
#endif
extern int check_if_legal_filename(const char *path);

#ifndef TERMINATE
extern void TERMINATE(FILE *file);
+94 −26
Original line number Diff line number Diff line
@@ -15,39 +15,107 @@
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#include "mysys_priv.h"
#include <m_string.h>

#ifdef __WIN__

/*
 * Check a file or path for accessability.
 *
 * SYNOPSIS
 * 	file_access()
 * 	pathpath to check
 * 	amodemode to check
 *
 * 	DESCRIPTION
 * 	This function wraps the normal access method because the access 
 * 	available in MSVCRT> +reports that filenames such as LPT1 and 
 * 	COM1 are valid (they are but should not be so for us).
 *
 * 	RETURN VALUES
 * 	0     ok
 * 	-1    error
  Check a file or path for accessability.
 
  SYNOPSIS
    file_access()
    path 	Path to file
    amode	Access method
 
  DESCRIPTION
    This function wraps the normal access method because the access 
    available in MSVCRT> +reports that filenames such as LPT1 and 
    COM1 are valid (they are but should not be so for us).
 
  RETURN VALUES
  0    ok
  -1   error  (We use -1 as my_access is mapped to access on other platforms)
*/

int my_access(const char *path, int amode) 
{ 
  WIN32_FILE_ATTRIBUTE_DATA fileinfo;
  BOOL result;
	
	result = GetFileAttributesEx(path, GetFileExInfoStandard, 
			&fileinfo);
	if (! result) 
		return -1;
	if ((fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) &&
			(amode & 2))
  result= GetFileAttributesEx(path, GetFileExInfoStandard, &fileinfo);
  if (! result ||
      (fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) && (amode & W_OK))
  {
    my_errno= errno= EACCES;
    return -1;
  }
  return 0;
}

#endif /* __WIN__ */

#if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)

/*
  List of file names that causes problem on windows

  NOTE that one can also not have file names of type CON.TXT
*/

static const char *reserved_names[]=
{
  "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6",
  "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6",
  "LPT7", "LPT8", "LPT9", "CLOCK$",
  NullS
};

#define MAX_RESERVED_NAME_LENGTH 6

/*
  Check if a path will access a reserverd file name that may cause problems
 
  SYNOPSIS
    check_if_legal_filename
    path 	Path to file

  RETURN
    0  ok
    1  reserved file name
*/

int check_if_legal_filename(const char *path)
{
  const char *end;
  const char **reserved_name;
  DBUG_ENTER("check_if_legal_filename");

  path+= dirname_length(path);                  /* To start of filename */
  if (!(end= strchr(path, FN_EXTCHAR)))
    end= strend(path);
  if (path == end || (uint) (path - end) > MAX_RESERVED_NAME_LENGTH)
    DBUG_RETURN(0);                             /* Simplify inner loop */

  for (reserved_name= reserved_names; *reserved_name; reserved_name++)
  {
    const char *name= path;
    while (name != end)
    {
      if (my_toupper(&my_charset_latin1, *path) !=
          my_toupper(&my_charset_latin1, *name))
        break;
      if (name++ == end)
        DBUG_RETURN(1);                         /* Found wrong path */
    }
  }
  DBUG_RETURN(0);
}
#endif


#ifdef OS2
int check_if_legal_filename(const char *path)
{
  return 0;
}
#endif /* OS2 */
+7 −4
Original line number Diff line number Diff line
@@ -39,8 +39,11 @@ FILE *my_fopen(const char *FileName, int Flags, myf MyFlags)
    very  well 
  */
#ifdef __WIN__
  if (! (Flags & O_CREAT) && my_access(FileName, F_OK))
  if (check_if_legal_filename(FileName))
  {
    errno= EACCES;
    fd= 0;
  }
  else
#endif
  {
+8 −5
Original line number Diff line number Diff line
@@ -47,12 +47,15 @@ File my_open(const char *FileName, int Flags, myf MyFlags)
		   FileName, Flags, MyFlags));
#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 
    Check that we don't try to open or create a file name that may
    cause problems for us in the future (like PRN)
  */  
  if (! (Flags & O_CREAT) && my_access(FileName, F_OK))    
	  return -1;
  if (check_if_legal_filename(FileName))
  {
    errno= EACCES;
    DBUG_RETURN(my_register_filename(-1, FileName, FILE_BY_OPEN,
                                     EE_FILENOTFOUND, MyFlags));
  }
  if (Flags & O_SHARE)
    fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO,
	       MY_S_IREAD | MY_S_IWRITE);
+1 −1
Original line number Diff line number Diff line
@@ -420,7 +420,7 @@ static const uint signed_longlong_len=19;
static const char *unsigned_longlong_str="18446744073709551615";
static const uint unsigned_longlong_len=20;

inline static uint int_token(const char *str,uint length)
static inline uint int_token(const char *str,uint length)
{
  if (length < long_len)			// quick normal case
    return NUM;
Loading