mirror of
https://github.com/s3fs-fuse/s3fs-fuse.git
synced 2024-12-23 09:18:55 +00:00
Merge pull request #253 from s3fs-fuse/fixmkdirp
Added chacking cache dir perms at starting.
This commit is contained in:
commit
cfdfecb4d1
@ -66,7 +66,11 @@ bool CacheFileStat::MakeCacheFileStatPath(const char* path, string& sfile_path,
|
|||||||
top_path += ".stat";
|
top_path += ".stat";
|
||||||
|
|
||||||
if(is_create_dir){
|
if(is_create_dir){
|
||||||
mkdirp(top_path + mydirname(path), 0777);
|
int result;
|
||||||
|
if(0 != (result = mkdirp(top_path + mydirname(path), 0777))){
|
||||||
|
DPRNINFO("failed to create dir(%s) by errno(%d).", path, result);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!path || '\0' == path[0]){
|
if(!path || '\0' == path[0]){
|
||||||
sfile_path = top_path;
|
sfile_path = top_path;
|
||||||
@ -76,6 +80,20 @@ bool CacheFileStat::MakeCacheFileStatPath(const char* path, string& sfile_path,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CacheFileStat::CheckCacheFileStatTopDir(void)
|
||||||
|
{
|
||||||
|
if(!FdManager::IsCacheDir()){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make stat dir top path( "/<cache_dir>/.<bucket_name>.stat" )
|
||||||
|
string top_path = FdManager::GetCacheDir();
|
||||||
|
top_path += "/.";
|
||||||
|
top_path += bucket;
|
||||||
|
top_path += ".stat";
|
||||||
|
|
||||||
|
return check_exist_dir_permission(top_path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
bool CacheFileStat::DeleteCacheFileStat(const char* path)
|
bool CacheFileStat::DeleteCacheFileStat(const char* path)
|
||||||
{
|
{
|
||||||
if(!path || '\0' == path[0]){
|
if(!path || '\0' == path[0]){
|
||||||
@ -1095,7 +1113,11 @@ bool FdManager::MakeCachePath(const char* path, string& cache_path, bool is_crea
|
|||||||
}
|
}
|
||||||
string resolved_path(FdManager::cache_dir + "/" + bucket);
|
string resolved_path(FdManager::cache_dir + "/" + bucket);
|
||||||
if(is_create_dir){
|
if(is_create_dir){
|
||||||
mkdirp(resolved_path + mydirname(path), 0777);
|
int result;
|
||||||
|
if(0 != (result = mkdirp(resolved_path + mydirname(path), 0777))){
|
||||||
|
DPRNINFO("failed to create dir(%s) by errno(%d).", path, result);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!path || '\0' == path[0]){
|
if(!path || '\0' == path[0]){
|
||||||
cache_path = resolved_path;
|
cache_path = resolved_path;
|
||||||
@ -1105,6 +1127,16 @@ bool FdManager::MakeCachePath(const char* path, string& cache_path, bool is_crea
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FdManager::CheckCacheTopDir(void)
|
||||||
|
{
|
||||||
|
if(0 == FdManager::cache_dir.size()){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
string toppath(FdManager::cache_dir + "/" + bucket);
|
||||||
|
|
||||||
|
return check_exist_dir_permission(toppath.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
bool FdManager::MakeRandomTempPath(const char* path, string& tmppath)
|
bool FdManager::MakeRandomTempPath(const char* path, string& tmppath)
|
||||||
{
|
{
|
||||||
char szBuff[64];
|
char szBuff[64];
|
||||||
|
@ -34,6 +34,7 @@ class CacheFileStat
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static bool DeleteCacheFileStat(const char* path);
|
static bool DeleteCacheFileStat(const char* path);
|
||||||
|
static bool CheckCacheFileStatTopDir(void);
|
||||||
|
|
||||||
explicit CacheFileStat(const char* tpath = NULL);
|
explicit CacheFileStat(const char* tpath = NULL);
|
||||||
~CacheFileStat();
|
~CacheFileStat();
|
||||||
@ -166,6 +167,7 @@ class FdManager
|
|||||||
static size_t SetPageSize(size_t size);
|
static size_t SetPageSize(size_t size);
|
||||||
static size_t GetPageSize(void) { return FdManager::page_size; }
|
static size_t GetPageSize(void) { return FdManager::page_size; }
|
||||||
static bool MakeCachePath(const char* path, std::string& cache_path, bool is_create_dir = true);
|
static bool MakeCachePath(const char* path, std::string& cache_path, bool is_create_dir = true);
|
||||||
|
static bool CheckCacheTopDir(void);
|
||||||
static bool MakeRandomTempPath(const char* path, std::string& tmppath);
|
static bool MakeRandomTempPath(const char* path, std::string& tmppath);
|
||||||
|
|
||||||
FdEntity* GetFdEntity(const char* path, int existfd = -1);
|
FdEntity* GetFdEntity(const char* path, int existfd = -1);
|
||||||
|
@ -4622,6 +4622,13 @@ int main(int argc, char* argv[])
|
|||||||
// like checking for appropriate lengths and characters
|
// like checking for appropriate lengths and characters
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check cache dir permission
|
||||||
|
if(!FdManager::CheckCacheTopDir() || !CacheFileStat::CheckCacheFileStatTopDir()){
|
||||||
|
fprintf(stderr, "%s: could not allow cache directory permission, check permission of cache directories.\n",
|
||||||
|
program_name.c_str());
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
// There's room for more command line error checking
|
// There's room for more command line error checking
|
||||||
|
|
||||||
// Check to see if the bucket name contains periods and https (SSL) is
|
// Check to see if the bucket name contains periods and https (SSL) is
|
||||||
|
@ -546,15 +546,71 @@ string mybasename(string path)
|
|||||||
// mkdir --parents
|
// mkdir --parents
|
||||||
int mkdirp(const string& path, mode_t mode)
|
int mkdirp(const string& path, mode_t mode)
|
||||||
{
|
{
|
||||||
string base;
|
string base;
|
||||||
string component;
|
string component;
|
||||||
stringstream ss(path);
|
stringstream ss(path);
|
||||||
int result = 0;
|
|
||||||
while (getline(ss, component, '/')) {
|
while (getline(ss, component, '/')) {
|
||||||
base += "/" + component;
|
base += "/" + component;
|
||||||
result = mkdir(base.c_str(), mode);
|
|
||||||
|
struct stat st;
|
||||||
|
if(0 == stat(base.c_str(), &st)){
|
||||||
|
if(!S_ISDIR(st.st_mode)){
|
||||||
|
return EPERM;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(0 != mkdir(base.c_str(), mode)){
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool check_exist_dir_permission(const char* dirpath)
|
||||||
|
{
|
||||||
|
if(!dirpath || '\0' == dirpath[0]){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// exists
|
||||||
|
struct stat st;
|
||||||
|
if(0 != stat(dirpath, &st)){
|
||||||
|
if(ENOENT == errno){
|
||||||
|
// dir does not exitst
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(EACCES == errno){
|
||||||
|
// could not access directory
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// somthing error occured
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check type
|
||||||
|
if(!S_ISDIR(st.st_mode)){
|
||||||
|
// path is not directory
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check permission
|
||||||
|
uid_t myuid = geteuid();
|
||||||
|
if(myuid == st.st_uid){
|
||||||
|
if(S_IRWXU != (st.st_mode & S_IRWXU)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(1 == is_uid_inculde_group(myuid, st.st_gid)){
|
||||||
|
if(S_IRWXG != (st.st_mode & S_IRWXG)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(S_IRWXO != (st.st_mode & S_IRWXO)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool delete_files_in_dir(const char* dir, bool is_remove_own)
|
bool delete_files_in_dir(const char* dir, bool is_remove_own)
|
||||||
|
@ -109,6 +109,7 @@ int is_uid_inculde_group(uid_t uid, gid_t gid);
|
|||||||
std::string mydirname(std::string path);
|
std::string mydirname(std::string path);
|
||||||
std::string mybasename(std::string path);
|
std::string mybasename(std::string path);
|
||||||
int mkdirp(const std::string& path, mode_t mode);
|
int mkdirp(const std::string& path, mode_t mode);
|
||||||
|
bool check_exist_dir_permission(const char* dirpath);
|
||||||
bool delete_files_in_dir(const char* dir, bool is_remove_own);
|
bool delete_files_in_dir(const char* dir, bool is_remove_own);
|
||||||
|
|
||||||
time_t get_mtime(const char *s);
|
time_t get_mtime(const char *s);
|
||||||
|
Loading…
Reference in New Issue
Block a user