Merge pull request #1371 from vavrusa/fix-zookeeper-stack-smashing

ZooKeeper: fixed stack smashing with tryGet()
This commit is contained in:
alexey-milovidov 2017-10-23 17:40:12 +03:00 committed by GitHub
commit 91aa0713e5

View File

@ -454,14 +454,16 @@ bool ZooKeeper::existsWatch(const std::string & path, Stat * stat_, const WatchC
int32_t ZooKeeper::getImpl(const std::string & path, std::string & res, Stat * stat_, WatchCallback watch_callback) int32_t ZooKeeper::getImpl(const std::string & path, std::string & res, Stat * stat_, WatchCallback watch_callback)
{ {
char buffer[MAX_NODE_SIZE]; std::vector<char> buffer;
buffer.resize(MAX_NODE_SIZE);
int buffer_len = MAX_NODE_SIZE; int buffer_len = MAX_NODE_SIZE;
int32_t code; int32_t code;
Stat stat; Stat stat;
watcher_fn watcher = watch_callback ? processCallback : nullptr; watcher_fn watcher = watch_callback ? processCallback : nullptr;
WatchContext * context = createContext(std::move(watch_callback)); WatchContext * context = createContext(std::move(watch_callback));
code = zoo_wget(impl, path.c_str(), watcher, context, buffer, &buffer_len, &stat); code = zoo_wget(impl, path.c_str(), watcher, context, buffer.data(), &buffer_len, &stat);
ProfileEvents::increment(ProfileEvents::ZooKeeperGet); ProfileEvents::increment(ProfileEvents::ZooKeeperGet);
ProfileEvents::increment(ProfileEvents::ZooKeeperTransactions); ProfileEvents::increment(ProfileEvents::ZooKeeperTransactions);
@ -473,7 +475,7 @@ int32_t ZooKeeper::getImpl(const std::string & path, std::string & res, Stat * s
if (buffer_len < 0) /// This can happen if the node contains NULL. Do not distinguish it from the empty string. if (buffer_len < 0) /// This can happen if the node contains NULL. Do not distinguish it from the empty string.
res.clear(); res.clear();
else else
res.assign(buffer, buffer_len); res.assign(buffer.data(), buffer_len);
} }
else else
{ {