Set the flag O_CLOEXEC on all file handles so they don't interferes with the execution of scripts. See #100
This commit is contained in:
parent
3441b9cc45
commit
2cb1a2ac97
3 changed files with 22 additions and 10 deletions
|
@ -57,7 +57,7 @@ void Socket::connect(const std::wstring &server) {
|
||||||
struct sockaddr_un remote;
|
struct sockaddr_un remote;
|
||||||
socklen_t len;
|
socklen_t len;
|
||||||
|
|
||||||
if ((d->socket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
|
if ((d->socket = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)) == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::string name = "/tmp/" + std::string(server.begin(), server.end());
|
std::string name = "/tmp/" + std::string(server.begin(), server.end());
|
||||||
|
|
|
@ -47,7 +47,7 @@ void ConnectionListener::run() {
|
||||||
|
|
||||||
SOCKET_T serverSocket;
|
SOCKET_T serverSocket;
|
||||||
struct sockaddr_un name;
|
struct sockaddr_un name;
|
||||||
serverSocket = socket(PF_LOCAL, SOCK_STREAM, 0);
|
serverSocket = socket(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
|
||||||
if (serverSocket < 0) {
|
if (serverSocket < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ int Settings::addNode(Node type) {
|
||||||
TelldusCore::MutexLocker locker(&mutex);
|
TelldusCore::MutexLocker locker(&mutex);
|
||||||
int intNodeId = getNextNodeId(type);
|
int intNodeId = getNextNodeId(type);
|
||||||
|
|
||||||
FILE *fp = fopen(CONFIG_FILE, "w");
|
FILE *fp = fopen(CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ int Settings::getNextNodeId(Node type) const {
|
||||||
*/
|
*/
|
||||||
int Settings::removeNode(Node type, int intNodeId) {
|
int Settings::removeNode(Node type, int intNodeId) {
|
||||||
TelldusCore::MutexLocker locker(&mutex);
|
TelldusCore::MutexLocker locker(&mutex);
|
||||||
FILE *fp = fopen(CONFIG_FILE, "w");
|
FILE *fp = fopen(CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,7 @@ bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::w
|
||||||
cfg_setint(cfg_device, "state", intDeviceState);
|
cfg_setint(cfg_device, "state", intDeviceState);
|
||||||
cfg_setstr(cfg_device, "stateValue", TelldusCore::wideToString(strDeviceStateValue).c_str());
|
cfg_setstr(cfg_device, "stateValue", TelldusCore::wideToString(strDeviceStateValue).c_str());
|
||||||
|
|
||||||
FILE *fp = fopen(VAR_CONFIG_FILE, "w");
|
FILE *fp = fopen(VAR_CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if(fp == 0) {
|
if(fp == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::w
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// The device is not found in the file, we must create it manualy...
|
// The device is not found in the file, we must create it manualy...
|
||||||
FILE *fp = fopen(VAR_CONFIG_FILE, "w");
|
FILE *fp = fopen(VAR_CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if(!fp) {
|
if(!fp) {
|
||||||
fprintf(stderr, "Failed to write state to %s: %s\n",
|
fprintf(stderr, "Failed to write state to %s: %s\n",
|
||||||
VAR_CONFIG_FILE, strerror(errno));
|
VAR_CONFIG_FILE, strerror(errno));
|
||||||
|
@ -298,7 +298,7 @@ int Settings::setStringSetting(Node type, int intDeviceId, const std::wstring &n
|
||||||
return TELLSTICK_ERROR_CONFIG_SYNTAX;
|
return TELLSTICK_ERROR_CONFIG_SYNTAX;
|
||||||
}
|
}
|
||||||
cfg_setstr(p, TelldusCore::wideToString(name).c_str(), newValue.c_str());
|
cfg_setstr(p, TelldusCore::wideToString(name).c_str(), newValue.c_str());
|
||||||
FILE *fp = fopen(CONFIG_FILE, "w");
|
FILE *fp = fopen(CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -345,7 +345,7 @@ int Settings::setIntSetting(Node type, int intDeviceId, const std::wstring &name
|
||||||
} else {
|
} else {
|
||||||
cfg_setint(cfg_device, TelldusCore::wideToString(name).c_str(), value);
|
cfg_setint(cfg_device, TelldusCore::wideToString(name).c_str(), value);
|
||||||
}
|
}
|
||||||
FILE *fp = fopen(CONFIG_FILE, "w");
|
FILE *fp = fopen(CONFIG_FILE, "we"); // e for setting O_CLOEXEC on the file handle
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
return TELLSTICK_ERROR_PERMISSION_DENIED;
|
||||||
}
|
}
|
||||||
|
@ -403,12 +403,18 @@ bool readConfig(cfg_t **cfg) {
|
||||||
CFG_END()
|
CFG_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FILE *fp = fopen(CONFIG_FILE, "re"); // e for setting O_CLOEXEC on the file handle
|
||||||
|
if (!fp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
(*cfg) = cfg_init(opts, CFGF_NOCASE);
|
(*cfg) = cfg_init(opts, CFGF_NOCASE);
|
||||||
if (cfg_parse((*cfg), CONFIG_FILE) == CFG_PARSE_ERROR) {
|
if (cfg_parse_fp((*cfg), fp) == CFG_PARSE_ERROR) {
|
||||||
(*cfg) = 0;
|
(*cfg) = 0;
|
||||||
|
fclose(fp);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,11 +430,17 @@ bool readVarConfig(cfg_t **cfg) {
|
||||||
CFG_END()
|
CFG_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FILE *fp = fopen(VAR_CONFIG_FILE, "re"); // e for setting O_CLOEXEC on the file handle
|
||||||
|
if (!fp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
(*cfg) = cfg_init(opts, CFGF_NOCASE);
|
(*cfg) = cfg_init(opts, CFGF_NOCASE);
|
||||||
if (cfg_parse((*cfg), VAR_CONFIG_FILE) == CFG_PARSE_ERROR) {
|
if (cfg_parse_fp((*cfg), fp) == CFG_PARSE_ERROR) {
|
||||||
(*cfg) = 0;
|
(*cfg) = 0;
|
||||||
|
fclose(fp);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue