Commit c3d37c2b authored by unknown's avatar unknown

Bug#18474 Unlistable directories yield no info from information_schema, part2

 - Improved solution by adding an else stetment so that do find next is avoided if erorr occurs, but we still return zero files found instaed of an error


mysys/my_lib.c:
  Add else statment so that if a directory can't be read because of access denied it will be skipped and zero files returned.
  Use strnmov instead of strmov to avoid writing after end of buffer
parent 3b1a0c87
......@@ -384,11 +384,10 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
DBUG_PRINT("my",("path: '%s' stat: %d MyFlags: %d",path,MyFlags));
/* Put LIB-CHAR as last path-character if not there */
tmp_file=tmp_path;
if (!*path)
*tmp_file++ ='.'; /* From current dir */
tmp_file= strmov(tmp_file,path);
tmp_file= strnmov(tmp_file, path, FN_REFLEN-5);
if (tmp_file[-1] == FN_DEVCHAR)
*tmp_file++= '.'; /* From current dev-dir */
if (tmp_file[-1] != FN_LIBCHAR)
......@@ -424,7 +423,7 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
if ((handle=_findfirst(tmp_path,&find)) == -1L)
#endif
{
DBUG_PRINT("info", ("find_first returned error"));
DBUG_PRINT("info", ("findfirst returned error, errno: %d", errno));
if (errno != EINVAL)
goto error;
/*
......@@ -433,6 +432,8 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
continue and return zero files in dir
*/
}
else
{
do
{
......@@ -467,16 +468,16 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
#else
finfo.mystat->st_size=find.size;
#endif
mode=MY_S_IREAD;
mode= MY_S_IREAD;
if (!(attrib & _A_RDONLY))
mode|=MY_S_IWRITE;
mode|= MY_S_IWRITE;
if (attrib & _A_SUBDIR)
mode|=MY_S_IFDIR;
finfo.mystat->st_mode=mode;
mode|= MY_S_IFDIR;
finfo.mystat->st_mode= mode;
#ifdef __BORLANDC__
finfo.mystat->st_mtime=((uint32) find.ff_ftime);
finfo.mystat->st_mtime= ((uint32) find.ff_ftime);
#else
finfo.mystat->st_mtime=((uint32) find.time_write);
finfo.mystat->st_mtime= ((uint32) find.time_write);
#endif
}
else
......@@ -484,14 +485,15 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
if (push_dynamic(dir_entries_storage, (gptr)&finfo))
goto error;
}
#ifdef __BORLANDC__
} while (findnext(&find) == 0);
while (findnext(&find) == 0);
#else
} while (_findnext(handle,&find) == 0);
while (_findnext(handle,&find) == 0);
_findclose(handle);
#endif
}
result->dir_entry= (FILEINFO *)dir_entries_storage->buffer;
result->number_off_files= dir_entries_storage->elements;
......@@ -499,6 +501,7 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
if (!(MyFlags & MY_DONT_SORT))
qsort((void *) result->dir_entry, result->number_off_files,
sizeof(FILEINFO), (qsort_cmp) comp_names);
DBUG_PRINT(exit, ("found %d files", result->number_off_files));
DBUG_RETURN(result);
error:
my_errno=errno;
......
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