diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2022-07-07 15:14:14 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@mariadb.com> | 2022-07-07 15:14:14 +0200 |
commit | 66c06735a2aeff32d69e5d2a4378563ad474691f (patch) | |
tree | b4ebd4a1b8db66639a81afa36292b2efbe720839 | |
parent | d6e80c21d6acbd2eab8b26897e137e9d473a35c3 (diff) | |
download | mariadb-git-66c06735a2aeff32d69e5d2a4378563ad474691f.tar.gz |
MDEV-28746 Wrong error code ER_BAD_DB_ERROR for long filenames
Add check for path length if CreateFile fails with ERROR_PATH_NOT_FOUND.
-rw-r--r-- | mysql-test/main/create_windows.result | 2 | ||||
-rw-r--r-- | mysql-test/main/create_windows.test | 10 | ||||
-rw-r--r-- | mysys/my_winfile.c | 13 |
3 files changed, 18 insertions, 7 deletions
diff --git a/mysql-test/main/create_windows.result b/mysql-test/main/create_windows.result new file mode 100644 index 00000000000..c064eb7c86f --- /dev/null +++ b/mysql-test/main/create_windows.result @@ -0,0 +1,2 @@ +create table `...................................................`(i int); +ERROR HY000: Can't create table `test`.`...................................................` (errno: 38 "Filename too long") diff --git a/mysql-test/main/create_windows.test b/mysql-test/main/create_windows.test new file mode 100644 index 00000000000..6fe99f6aeb6 --- /dev/null +++ b/mysql-test/main/create_windows.test @@ -0,0 +1,10 @@ +--source include/windows.inc + +# MDEV-28746 Wrong error code ER_BAD_DB_ERROR for long filenames + +# There are 51 dots in the table name below, with every dot encoded with 5 +# bytes in "mysql file name encoding", making the filename length 255 byte. +# Adding drive and extension makes it exceed MAX_PATH= 260 bytes +let $t = `SELECT(REPEAT('.',51))`; +--error ER_CANT_CREATE_TABLE +eval create table `$t`(i int); diff --git a/mysys/my_winfile.c b/mysys/my_winfile.c index 0c76eb25560..0baca6d62d7 100644 --- a/mysys/my_winfile.c +++ b/mysys/my_winfile.c @@ -250,13 +250,12 @@ File my_win_sopen(const char *path, int oflag, int shflag, int pmode) if ((osfh= CreateFile(path, fileaccess, fileshare, &SecurityAttributes, filecreate, fileattrib, NULL)) == INVALID_HANDLE_VALUE) { - /* - OS call to open/create file failed! map the error, release - the lock, and return -1. note that it's not necessary to - call _free_osfhnd (it hasn't been used yet). - */ - my_osmaperr(GetLastError()); /* map error */ - DBUG_RETURN(-1); /* return error to caller */ + DWORD last_error= GetLastError(); + if (last_error == ERROR_PATH_NOT_FOUND && strlen(path) >= MAX_PATH) + errno= ENAMETOOLONG; + else + my_osmaperr(last_error); /* map error */ + DBUG_RETURN(-1); } if ((fh= my_open_osfhandle(osfh, |