Make sure errno is correctly used

This commit is contained in:
benrubson 2017-03-20 15:11:17 +01:00
parent 13ae4de830
commit f024ae86f8
5 changed files with 37 additions and 27 deletions

View File

@ -185,8 +185,9 @@ bool RenameOp::apply() {
// rename on disk..
if (::rename(last->oldCName.c_str(), last->newCName.c_str()) == -1) {
int eno = errno;
RLOG(WARNING) << "Error renaming " << last->oldCName << ": "
<< strerror(errno);
<< strerror(eno);
dn->renameNode(last->newPName.c_str(), last->oldPName.c_str(), false);
return false;
}
@ -355,7 +356,8 @@ DirTraverse DirNode::openDir(const char *plaintextPath) {
DIR *dir = ::opendir(cyName.c_str());
if (dir == NULL) {
VLOG(1) << "opendir error " << strerror(errno);
int eno = errno;
VLOG(1) << "opendir error " << strerror(eno);
return DirTraverse(shared_ptr<DIR>(), 0, std::shared_ptr<NameIO>());
} else {
std::shared_ptr<DIR> dp(dir, DirDeleter());
@ -569,8 +571,7 @@ int DirNode::rename(const char *fromPlaintext, const char *toPlaintext) {
}
if (res != 0) {
VLOG(1) << "rename failed: " << strerror(errno);
res = -errno;
VLOG(1) << "rename failed: " << strerror(-res);
}
return res;
@ -692,7 +693,7 @@ int DirNode::unlink(const char *plaintextName) {
res = ::unlink(fullName.c_str());
if (res == -1) {
res = -errno;
VLOG(1) << "unlink error: " << strerror(errno);
VLOG(1) << "unlink error: " << strerror(-res);
}
}

View File

@ -140,14 +140,16 @@ int FileNode::mknod(mode_t mode, dev_t rdev, uid_t uid, gid_t gid) {
if (uid != 0) {
olduid = setfsuid(uid);
if (olduid == -1) {
RLOG(DEBUG) << "setfsuid error: " << strerror(errno);
int eno = errno;
RLOG(DEBUG) << "setfsuid error: " << strerror(eno);
return -EPERM;
}
}
if (gid != 0) {
oldgid = setfsgid(gid);
if (oldgid == -1) {
RLOG(DEBUG) << "setfsgid error: " << strerror(errno);
int eno = errno;
RLOG(DEBUG) << "setfsgid error: " << strerror(eno);
return -EPERM;
}
}
@ -165,15 +167,15 @@ int FileNode::mknod(mode_t mode, dev_t rdev, uid_t uid, gid_t gid) {
else
res = ::mknod(_cname.c_str(), mode, rdev);
if (olduid >= 0) setfsuid(olduid);
if (oldgid >= 0) setfsgid(oldgid);
if (res == -1) {
int eno = errno;
VLOG(1) << "mknod error: " << strerror(eno);
res = -eno;
}
if (olduid >= 0) setfsuid(olduid);
if (oldgid >= 0) setfsgid(oldgid);
return res;
}

View File

@ -92,13 +92,11 @@ static int open_readonly_workaround(const char *path, int flags) {
memset(&stbuf, 0, sizeof(struct stat));
if (lstat(path, &stbuf) != -1) {
// make sure user has read/write permission..
chmod(path, stbuf.st_mode | 0600);
if (chmod(path, stbuf.st_mode | 0600) != -1) {
fd = ::open(path, flags);
chmod(path, stbuf.st_mode);
} else {
RLOG(INFO) << "can't stat file " << path;
}
}
return fd;
}
@ -131,10 +129,11 @@ int RawFileIO::open(int flags) {
#endif
int newFd = ::open(name.c_str(), finalFlags);
int eno = errno;
VLOG(1) << "open file with flags " << finalFlags << ", result = " << newFd;
if ((newFd == -1) && (errno == EACCES)) {
if ((newFd == -1) && (eno == EACCES)) {
VLOG(1) << "using readonly workaround for open";
newFd = open_readonly_workaround(name.c_str(), finalFlags);
}
@ -152,7 +151,7 @@ int RawFileIO::open(int flags) {
result = fd = newFd;
} else {
result = -errno;
RLOG(DEBUG) << "::open error: " << strerror(errno);
RLOG(DEBUG) << "::open error: " << strerror(-result);
}
}
@ -185,8 +184,9 @@ off_t RawFileIO::getSize() const {
const_cast<RawFileIO *>(this)->knownSize = true;
return fileSize;
} else {
RLOG(ERROR) << "getSize on " << name << " failed: " << strerror(errno);
return -1;
int eno = errno;
RLOG(ERROR) << "getSize on " << name << " failed: " << strerror(eno);
return -eno;
}
} else {
return fileSize;
@ -199,8 +199,9 @@ ssize_t RawFileIO::read(const IORequest &req) const {
ssize_t readSize = pread(fd, req.data, req.dataLen, req.offset);
if (readSize < 0) {
readSize = -errno;
RLOG(WARNING) << "read failed at offset " << req.offset << " for "
<< req.dataLen << " bytes: " << strerror(errno);
<< req.dataLen << " bytes: " << strerror(-readSize);
}
return readSize;
@ -254,9 +255,6 @@ int RawFileIO::truncate(off_t size) {
if (fd >= 0 && canWrite) {
res = ::ftruncate(fd, size);
#if !defined(__FreeBSD__) && !defined(__APPLE__)
::fdatasync(fd);
#endif
} else
res = ::truncate(name.c_str(), size);
@ -272,6 +270,12 @@ int RawFileIO::truncate(off_t size) {
knownSize = true;
}
#if !defined(__FreeBSD__) && !defined(__APPLE__)
if (fd >= 0 && canWrite) {
::fdatasync(fd);
}
#endif
return res;
}

View File

@ -41,7 +41,8 @@ static __inline int setfsuid(uid_t uid) {
uid_t olduid = geteuid();
if (seteuid(uid) != 0) {
VLOG(1) << "seteuid error: " << errno;
int eno = errno;
VLOG(1) << "seteuid error: " << strerror(eno);
}
return olduid;
@ -51,7 +52,8 @@ static __inline int setfsgid(gid_t gid) {
gid_t oldgid = getegid();
if (setegid(gid) != 0) {
VLOG(1) << "setfsgid error: " << errno;
int eno = errno;
VLOG(1) << "setfsgid error: " << strerror(eno);
}
return oldgid;

View File

@ -504,9 +504,10 @@ void *encfs_init(fuse_conn_info *conn) {
int res = pthread_create(&ctx->monitorThread, 0, idleMonitor, (void *)ctx);
if (res != 0) {
int eno = errno;
RLOG(ERROR) << "error starting idle monitor thread, "
"res = "
<< res << ", errno = " << errno;
<< res << ", " << strerror(eno);
}
}