summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2022-07-07 15:14:14 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2022-07-07 15:14:14 +0200
commit66c06735a2aeff32d69e5d2a4378563ad474691f (patch)
treeb4ebd4a1b8db66639a81afa36292b2efbe720839
parentd6e80c21d6acbd2eab8b26897e137e9d473a35c3 (diff)
downloadmariadb-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.result2
-rw-r--r--mysql-test/main/create_windows.test10
-rw-r--r--mysys/my_winfile.c13
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,