All internally used FDs are now set to O_CLOEXEC.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10715 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -7,12 +7,13 @@
|
|||||||
BDirectory implementation.
|
BDirectory implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <fs_info.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
|
#include <fs_info.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <SymLink.h>
|
#include <SymLink.h>
|
||||||
|
|
||||||
@@ -149,6 +150,7 @@ BDirectory::SetTo(const entry_ref *ref)
|
|||||||
status_t error = _SetTo(ref, true);
|
status_t error = _SetTo(ref, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// open dir
|
// open dir
|
||||||
fDirFd = _kern_open_dir_entry_ref(ref->device, ref->directory, ref->name);
|
fDirFd = _kern_open_dir_entry_ref(ref->device, ref->directory, ref->name);
|
||||||
if (fDirFd < 0) {
|
if (fDirFd < 0) {
|
||||||
@@ -156,6 +158,10 @@ BDirectory::SetTo(const entry_ref *ref)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = error);
|
return (fCStatus = error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(fDirFd, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,10 +215,12 @@ BDirectory::SetTo(const BEntry *entry)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// open node
|
// open node
|
||||||
status_t error = _SetTo(entry->fDirFd, entry->fName, true);
|
status_t error = _SetTo(entry->fDirFd, entry->fName, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// open dir
|
// open dir
|
||||||
fDirFd = _kern_open_dir(entry->fDirFd, entry->fName);
|
fDirFd = _kern_open_dir(entry->fDirFd, entry->fName);
|
||||||
if (fDirFd < 0) {
|
if (fDirFd < 0) {
|
||||||
@@ -220,6 +228,10 @@ BDirectory::SetTo(const BEntry *entry)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = error);
|
return (fCStatus = error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(fDirFd, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,6 +259,7 @@ BDirectory::SetTo(const char *path)
|
|||||||
status_t error = _SetTo(-1, path, true);
|
status_t error = _SetTo(-1, path, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// open dir
|
// open dir
|
||||||
fDirFd = _kern_open_dir(-1, path);
|
fDirFd = _kern_open_dir(-1, path);
|
||||||
if (fDirFd < 0) {
|
if (fDirFd < 0) {
|
||||||
@@ -254,6 +267,10 @@ BDirectory::SetTo(const char *path)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = error);
|
return (fCStatus = error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(fDirFd, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,10 +300,12 @@ BDirectory::SetTo(const BDirectory *dir, const char *path)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// open node
|
// open node
|
||||||
status_t error = _SetTo(dir->fDirFd, path, true);
|
status_t error = _SetTo(dir->fDirFd, path, true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// open dir
|
// open dir
|
||||||
fDirFd = _kern_open_dir(dir->fDirFd, path);
|
fDirFd = _kern_open_dir(dir->fDirFd, path);
|
||||||
if (fDirFd < 0) {
|
if (fDirFd < 0) {
|
||||||
@@ -294,6 +313,10 @@ BDirectory::SetTo(const BDirectory *dir, const char *path)
|
|||||||
Unset();
|
Unset();
|
||||||
return (fCStatus = error);
|
return (fCStatus = error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(fDirFd, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
BEntry and entry_ref implementations.
|
BEntry and entry_ref implementations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Entry.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
|
#include <Entry.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <SymLink.h>
|
#include <SymLink.h>
|
||||||
#include "storage_support.h"
|
#include "storage_support.h"
|
||||||
@@ -523,15 +523,21 @@ status_t BEntry::GetParent(BEntry *entry) const
|
|||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
// check whether we are the root directory
|
// check whether we are the root directory
|
||||||
// It is sufficient to check whether our leaf name is ".".
|
// It is sufficient to check whether our leaf name is ".".
|
||||||
if (strcmp(fName, ".") == 0)
|
if (strcmp(fName, ".") == 0)
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
// open the parent directory
|
// open the parent directory
|
||||||
char leafName[B_FILE_NAME_LENGTH];
|
char leafName[B_FILE_NAME_LENGTH];
|
||||||
int parentFD = _kern_open_parent_dir(fDirFd, leafName, B_FILE_NAME_LENGTH);
|
int parentFD = _kern_open_parent_dir(fDirFd, leafName, B_FILE_NAME_LENGTH);
|
||||||
if (parentFD < 0)
|
if (parentFD < 0)
|
||||||
return parentFD;
|
return parentFD;
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(parentFD, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
// init the entry
|
// init the entry
|
||||||
entry->Unset();
|
entry->Unset();
|
||||||
entry->fDirFd = parentFD;
|
entry->fDirFd = parentFD;
|
||||||
@@ -927,6 +933,10 @@ BEntry::set(int dirFD, const char *path, bool traverse)
|
|||||||
// next round...
|
// next round...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set close on exec flag on dir FD
|
||||||
|
fcntl(dirFD, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
// set the result
|
// set the result
|
||||||
status_t error = set_name(leafName);
|
status_t error = set_name(leafName);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
BFile implementation.
|
BFile implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
@@ -150,8 +151,12 @@ status_t
|
|||||||
BFile::SetTo(const entry_ref *ref, uint32 openMode)
|
BFile::SetTo(const entry_ref *ref, uint32 openMode)
|
||||||
{
|
{
|
||||||
Unset();
|
Unset();
|
||||||
|
|
||||||
if (!ref)
|
if (!ref)
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
|
|
||||||
|
openMode |= O_CLOEXEC;
|
||||||
|
|
||||||
int fd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
int fd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
||||||
openMode);
|
openMode);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
@@ -160,6 +165,7 @@ BFile::SetTo(const entry_ref *ref, uint32 openMode)
|
|||||||
fCStatus = B_OK;
|
fCStatus = B_OK;
|
||||||
} else
|
} else
|
||||||
fCStatus = fd;
|
fCStatus = fd;
|
||||||
|
|
||||||
return fCStatus;
|
return fCStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,17 +192,22 @@ status_t
|
|||||||
BFile::SetTo(const BEntry *entry, uint32 openMode)
|
BFile::SetTo(const BEntry *entry, uint32 openMode)
|
||||||
{
|
{
|
||||||
Unset();
|
Unset();
|
||||||
|
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
if (entry->InitCheck() != B_OK)
|
if (entry->InitCheck() != B_OK)
|
||||||
return (fCStatus = entry->InitCheck());
|
return (fCStatus = entry->InitCheck());
|
||||||
int fd = _kern_open(entry->fDirFd, entry->fName, openMode);
|
|
||||||
|
openMode |= O_CLOEXEC;
|
||||||
|
|
||||||
|
int fd = _kern_open(entry->fDirFd, entry->fName, openMode | O_CLOEXEC);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
set_fd(fd);
|
set_fd(fd);
|
||||||
fMode = openMode;
|
fMode = openMode;
|
||||||
fCStatus = B_OK;
|
fCStatus = B_OK;
|
||||||
} else
|
} else
|
||||||
fCStatus = fd;
|
fCStatus = fd;
|
||||||
|
|
||||||
return fCStatus;
|
return fCStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,8 +232,12 @@ status_t
|
|||||||
BFile::SetTo(const char *path, uint32 openMode)
|
BFile::SetTo(const char *path, uint32 openMode)
|
||||||
{
|
{
|
||||||
Unset();
|
Unset();
|
||||||
|
|
||||||
if (!path)
|
if (!path)
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
|
|
||||||
|
openMode |= O_CLOEXEC;
|
||||||
|
|
||||||
int fd = _kern_open(-1, path, openMode);
|
int fd = _kern_open(-1, path, openMode);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
set_fd(fd);
|
set_fd(fd);
|
||||||
@@ -230,6 +245,7 @@ BFile::SetTo(const char *path, uint32 openMode)
|
|||||||
fCStatus = B_OK;
|
fCStatus = B_OK;
|
||||||
} else
|
} else
|
||||||
fCStatus = fd;
|
fCStatus = fd;
|
||||||
|
|
||||||
return fCStatus;
|
return fCStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,8 +274,12 @@ status_t
|
|||||||
BFile::SetTo(const BDirectory *dir, const char *path, uint32 openMode)
|
BFile::SetTo(const BDirectory *dir, const char *path, uint32 openMode)
|
||||||
{
|
{
|
||||||
Unset();
|
Unset();
|
||||||
|
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return (fCStatus = B_BAD_VALUE);
|
return (fCStatus = B_BAD_VALUE);
|
||||||
|
|
||||||
|
openMode |= O_CLOEXEC;
|
||||||
|
|
||||||
int fd = _kern_open(dir->fDirFd, path, openMode);
|
int fd = _kern_open(dir->fDirFd, path, openMode);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
set_fd(fd);
|
set_fd(fd);
|
||||||
@@ -267,6 +287,7 @@ BFile::SetTo(const BDirectory *dir, const char *path, uint32 openMode)
|
|||||||
fCStatus = B_OK;
|
fCStatus = B_OK;
|
||||||
} else
|
} else
|
||||||
fCStatus = fd;
|
fCStatus = fd;
|
||||||
|
|
||||||
return fCStatus;
|
return fCStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <fs_attr.h> // for struct attr_info
|
#include <fs_attr.h> // for struct attr_info
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -699,10 +700,10 @@ BNode::_SetTo(int fd, const char *path, bool traverse)
|
|||||||
status_t error = (fd >= 0 || path ? B_OK : B_BAD_VALUE);
|
status_t error = (fd >= 0 || path ? B_OK : B_BAD_VALUE);
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
int traverseFlag = (traverse ? 0 : O_NOTRAVERSE);
|
int traverseFlag = (traverse ? 0 : O_NOTRAVERSE);
|
||||||
fFd = _kern_open(fd, path, O_RDWR | traverseFlag);
|
fFd = _kern_open(fd, path, O_RDWR | O_CLOEXEC | traverseFlag);
|
||||||
if (fFd < B_OK && fFd != B_ENTRY_NOT_FOUND) {
|
if (fFd < B_OK && fFd != B_ENTRY_NOT_FOUND) {
|
||||||
// opening read-write failed, re-try read-only
|
// opening read-write failed, re-try read-only
|
||||||
fFd = _kern_open(fd, path, O_RDONLY | traverseFlag);
|
fFd = _kern_open(fd, path, O_RDONLY | O_CLOEXEC | traverseFlag);
|
||||||
}
|
}
|
||||||
if (fFd < 0)
|
if (fFd < 0)
|
||||||
error = fFd;
|
error = fFd;
|
||||||
@@ -733,11 +734,11 @@ BNode::_SetTo(const entry_ref *ref, bool traverse)
|
|||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
int traverseFlag = (traverse ? 0 : O_NOTRAVERSE);
|
int traverseFlag = (traverse ? 0 : O_NOTRAVERSE);
|
||||||
fFd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
fFd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
||||||
O_RDWR | traverseFlag);
|
O_RDWR | O_CLOEXEC | traverseFlag);
|
||||||
if (fFd < B_OK && fFd != B_ENTRY_NOT_FOUND) {
|
if (fFd < B_OK && fFd != B_ENTRY_NOT_FOUND) {
|
||||||
// opening read-write failed, re-try read-only
|
// opening read-write failed, re-try read-only
|
||||||
fFd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
fFd = _kern_open_entry_ref(ref->device, ref->directory, ref->name,
|
||||||
O_RDONLY | traverseFlag);
|
O_RDONLY | O_CLOEXEC | traverseFlag);
|
||||||
}
|
}
|
||||||
if (fFd < 0)
|
if (fFd < 0)
|
||||||
error = fFd;
|
error = fFd;
|
||||||
@@ -773,6 +774,9 @@ BNode::InitAttrDir()
|
|||||||
fAttrFd = _kern_open_attr_dir(fFd, NULL);
|
fAttrFd = _kern_open_attr_dir(fFd, NULL);
|
||||||
if (fAttrFd < 0)
|
if (fAttrFd < 0)
|
||||||
return fAttrFd;
|
return fAttrFd;
|
||||||
|
|
||||||
|
// set close on exec flag
|
||||||
|
fcntl(fAttrFd, F_SETFD, FD_CLOEXEC);
|
||||||
}
|
}
|
||||||
return fCStatus;
|
return fCStatus;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,13 @@
|
|||||||
BQuery implementation.
|
BQuery implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <fs_query.h>
|
#include <fcntl.h>
|
||||||
#include <new>
|
#include <new>
|
||||||
#include <parsedate.h>
|
#include <parsedate.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
|
#include <fs_query.h>
|
||||||
#include <Query.h>
|
#include <Query.h>
|
||||||
#include <Volume.h>
|
#include <Volume.h>
|
||||||
|
|
||||||
@@ -527,6 +528,9 @@ BQuery::Fetch()
|
|||||||
if (fQueryFd < 0)
|
if (fQueryFd < 0)
|
||||||
return fQueryFd;
|
return fQueryFd;
|
||||||
|
|
||||||
|
// set close on exec flag
|
||||||
|
fcntl(fQueryFd, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user