If the buffer is smaller than `HOST_NAME_MAX` (64 on Linux but up to
255 bytes in POSIX, which FreeBSD, MacOS etc honor) gethostname()
might return -1 without null-terminating the buffer, causing an
out-of-bounds read.
As we look for the first '.' using `strchr()`, replacing it with a
null byte, we also have a one-byte out-of-bounds write which might
result in a crash or, albeit very unlikely, arbitrary code execution.
string namespace_name=arg()["carbon-namespace"];
string hostname=arg()["carbon-ourname"];
if(hostname.empty()) {
- char tmp[80];
+ char tmp[HOST_NAME_MAX+1];
memset(tmp, 0, sizeof(tmp));
- gethostname(tmp, sizeof(tmp));
+ if (gethostname(tmp, sizeof(tmp)) != 0) {
+ throw std::runtime_error("The carbon-ourname setting has not been set and we are unable to determine the system's hostname: " + stringerror());
+ }
char *p = strchr(tmp, '.');
if(p) *p=0;
hostname=tmp;
const std::string& namespace_name = conf.namespace_name;
std::string hostname = conf.ourname;
if(hostname.empty()) {
- char tmp[80];
+ char tmp[HOST_NAME_MAX+1];
memset(tmp, 0, sizeof(tmp));
- gethostname(tmp, sizeof(tmp));
+ if (gethostname(tmp, sizeof(tmp)) != 0) {
+ throw std::runtime_error("The 'ourname' setting in 'carbonServer()' has not been set and we are unable to determine the system's hostname: " + stringerror());
+ }
char *p = strchr(tmp, '.');
if(p) *p=0;
hostname=tmp;
namespace_name="pdns";
}
if(hostname.empty()) {
- char tmp[80];
+ char tmp[HOST_NAME_MAX+1];
memset(tmp, 0, sizeof(tmp));
- gethostname(tmp, sizeof(tmp));
+ if (gethostname(tmp, sizeof(tmp)) != 0) {
+ throw std::runtime_error("The 'carbon-ourname' setting has not been set and we are unable to determine the system's hostname: " + stringerror());
+ }
char *p = strchr(tmp, '.');
if(p) *p=0;