Fix error case memory bug in GetHostName() (#11544)

Summary:
Fix the error handling in `GetHostName` for non EFAULT, non EINVAL error. Current handling will cause stack overflow when non null-terminated c style string is in `name`, e.g. ENAMETOOLONG, when the `name` buffer is not big enough and the host name is truncated.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/11544

Test Plan:
```
COMPILE_WITH_ASAN=1 make all check
```

Reviewed By: pdillinger

Differential Revision: D46775799

Pulled By: jowlyzhang

fbshipit-source-id: e0fc9400c50fe38bc1fd888b4fea5fe8706165bf
oxigraph-main
Yu Zhang 2 years ago committed by Facebook GitHub Bot
parent b421a8c21b
commit 66499780b2
  1. 8
      env/env_posix.cc

8
env/env_posix.cc vendored

@ -330,12 +330,16 @@ class PosixEnv : public CompositeEnv {
} }
Status GetHostName(char* name, uint64_t len) override { Status GetHostName(char* name, uint64_t len) override {
int ret = gethostname(name, static_cast<size_t>(len)); const size_t max_len = static_cast<size_t>(len);
int ret = gethostname(name, max_len);
if (ret < 0) { if (ret < 0) {
if (errno == EFAULT || errno == EINVAL) { if (errno == EFAULT || errno == EINVAL) {
return Status::InvalidArgument(errnoStr(errno).c_str()); return Status::InvalidArgument(errnoStr(errno).c_str());
} else if (errno == ENAMETOOLONG) {
return IOError("GetHostName", std::string(name, strnlen(name, max_len)),
errno);
} else { } else {
return IOError("GetHostName", name, errno); return IOError("GetHostName", "", errno);
} }
} }
return Status::OK(); return Status::OK();

Loading…
Cancel
Save