Bug#52134 performance schema file io, symlink in path
Backport from mysql-next-mr (5.6) to mysql-trunk (5.5)
This commit is contained in:
parent
c92a6ea8ea
commit
edf7865437
@ -829,7 +829,7 @@ find_or_create_file(PFS_thread *thread, PFS_file_class *klass,
|
|||||||
- it fits into pfs->m_filename
|
- it fits into pfs->m_filename
|
||||||
- it is safe to use mysys apis to normalize the file name.
|
- it is safe to use mysys apis to normalize the file name.
|
||||||
*/
|
*/
|
||||||
memcpy(safe_buffer, filename, FN_REFLEN - 2);
|
memcpy(safe_buffer, filename, FN_REFLEN - 1);
|
||||||
safe_buffer[FN_REFLEN - 1]= 0;
|
safe_buffer[FN_REFLEN - 1]= 0;
|
||||||
safe_filename= safe_buffer;
|
safe_filename= safe_buffer;
|
||||||
}
|
}
|
||||||
@ -840,16 +840,58 @@ find_or_create_file(PFS_thread *thread, PFS_file_class *klass,
|
|||||||
Normalize the file name to avoid duplicates when using aliases:
|
Normalize the file name to avoid duplicates when using aliases:
|
||||||
- absolute or relative paths
|
- absolute or relative paths
|
||||||
- symbolic links
|
- symbolic links
|
||||||
|
Names are resolved as follows:
|
||||||
|
- /real/path/to/real_file ==> same
|
||||||
|
- /path/with/link/to/real_file ==> /real/path/to/real_file
|
||||||
|
- real_file ==> /real/path/to/real_file
|
||||||
|
- ./real_file ==> /real/path/to/real_file
|
||||||
|
- /real/path/to/sym_link ==> same
|
||||||
|
- /path/with/link/to/sym_link ==> /real/path/to/sym_link
|
||||||
|
- sym_link ==> /real/path/to/sym_link
|
||||||
|
- ./sym_link ==> /real/path/to/sym_link
|
||||||
|
When the last component of a file is a symbolic link,
|
||||||
|
the last component is *not* resolved, so that all file io
|
||||||
|
operations on a link (create, read, write, delete) are counted
|
||||||
|
against the link itself, not the target file.
|
||||||
|
Resolving the name would lead to create counted against the link,
|
||||||
|
and read/write/delete counted against the target, leading to
|
||||||
|
incoherent results and instrumentation leaks.
|
||||||
|
Also note that, when creating files, this name resolution
|
||||||
|
works properly for files that do not exist (yet) on the file system.
|
||||||
*/
|
*/
|
||||||
char buffer[FN_REFLEN];
|
char buffer[FN_REFLEN];
|
||||||
|
char dirbuffer[FN_REFLEN];
|
||||||
|
size_t dirlen;
|
||||||
const char *normalized_filename;
|
const char *normalized_filename;
|
||||||
int normalized_length;
|
int normalized_length;
|
||||||
|
|
||||||
/*
|
dirlen= dirname_length(safe_filename);
|
||||||
Ignore errors, the file may not exist.
|
if (dirlen == 0)
|
||||||
my_realpath always provide a best effort result in buffer.
|
{
|
||||||
*/
|
dirbuffer[0]= FN_CURLIB;
|
||||||
(void) my_realpath(buffer, safe_filename, MYF(0));
|
dirbuffer[1]= FN_LIBCHAR;
|
||||||
|
dirbuffer[2]= '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(dirbuffer, safe_filename, dirlen);
|
||||||
|
dirbuffer[dirlen]= '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (my_realpath(buffer, dirbuffer, MYF(0)) != 0)
|
||||||
|
{
|
||||||
|
file_lost++;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append the unresolved file name to the resolved path */
|
||||||
|
char *ptr= buffer + strlen(buffer);
|
||||||
|
char *buf_end= &buffer[sizeof(buffer)-1];
|
||||||
|
if (buf_end > ptr)
|
||||||
|
*ptr++= FN_LIBCHAR;
|
||||||
|
if (buf_end > ptr)
|
||||||
|
strncpy(ptr, safe_filename + dirlen, buf_end - ptr);
|
||||||
|
*buf_end= '\0';
|
||||||
|
|
||||||
normalized_filename= buffer;
|
normalized_filename= buffer;
|
||||||
normalized_length= strlen(normalized_filename);
|
normalized_length= strlen(normalized_filename);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user