Browse Source

Don't abuse the stack for buffers

Jonas Pflanzer 5 năm trước cách đây
mục cha
commit
b40d725b41
3 tập tin đã thay đổi với 63 bổ sung35 xóa
  1. 30 15
      cli/src/base64.cpp
  2. 3 5
      daemon/src/FileManager.cpp
  3. 30 15
      daemon/src/base64.cpp

+ 30 - 15
cli/src/base64.cpp

@@ -3,32 +3,47 @@
 #include <boost/beast.hpp>
 
 std::string base64::decode(const std::string &val) {
-  char buf[boost::beast::detail::base64::decoded_size(val.size())];
-  int read =
-      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::decoded_size(val.size()));
 
-  return std::string(buf, read);
+  std::size_t read = boost::beast::detail::base64::decode(
+                         &ret.front(), val.c_str(), val.size())
+                         .first;
+
+  ret.resize(read);
+  return ret;
 }
 
 std::vector<char> base64::decodeVector(const std::string &val) {
-  char buf[boost::beast::detail::base64::decoded_size(val.size())];
-  int read =
-      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+  std::vector<char> ret;
+  ret.resize(boost::beast::detail::base64::decoded_size(val.size()));
+
+  std::size_t read =
+      boost::beast::detail::base64::decode(ret.data(), val.c_str(), val.size())
+          .first;
 
-  std::vector<char> ret(buf, buf + read);
-  return std::vector<char>(buf, buf + read);
+  ret.resize(read);
+  return ret;
 }
 
 std::string base64::encode(const std::string &val) {
-  char buf[boost::beast::detail::base64::encoded_size(val.size())];
-  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::encoded_size(val.size()));
 
-  return std::string(buf, read);
+  std::size_t read = boost::beast::detail::base64::encode(
+      &ret.front(), val.data(), val.size());
+
+  ret.resize(read);
+  return ret;
 }
 
 std::string base64::encodeVector(const std::vector<char> &val) {
-  char buf[boost::beast::detail::base64::encoded_size(val.size())];
-  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::encoded_size(val.size()));
+
+  std::size_t read = boost::beast::detail::base64::encode(
+      &ret.front(), val.data(), val.size());
 
-  return std::string(buf, read);
+  ret.resize(read);
+  return ret;
 }

+ 3 - 5
daemon/src/FileManager.cpp

@@ -75,8 +75,6 @@ void FileManager::writePut(const std::vector<char> &data) {
 }
 
 std::vector<char> FileManager::readGet() {
-  char fileBuffer[max_data_length];
-
   // store position before read
   std::streamoff read = this->getFile.tellg();
   if (read + max_data_length > this->getFileSize) {
@@ -85,10 +83,10 @@ std::vector<char> FileManager::readGet() {
     read = max_data_length;
   }
 
-  this->getFile.read(fileBuffer, read);
-
   std::vector<char> data;
-  data.assign(fileBuffer, fileBuffer + read);
+  data.resize(read);
+
+  this->getFile.read(data.data(), read);
 
   return data;
 }

+ 30 - 15
daemon/src/base64.cpp

@@ -3,32 +3,47 @@
 #include <boost/beast.hpp>
 
 std::string base64::decode(const std::string &val) {
-  char buf[boost::beast::detail::base64::decoded_size(val.size())];
-  int read =
-      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::decoded_size(val.size()));
 
-  return std::string(buf, read);
+  std::size_t read = boost::beast::detail::base64::decode(
+                         &ret.front(), val.c_str(), val.size())
+                         .first;
+
+  ret.resize(read);
+  return ret;
 }
 
 std::vector<char> base64::decodeVector(const std::string &val) {
-  char buf[boost::beast::detail::base64::decoded_size(val.size())];
-  int read =
-      boost::beast::detail::base64::decode(buf, val.c_str(), val.size()).first;
+  std::vector<char> ret;
+  ret.resize(boost::beast::detail::base64::decoded_size(val.size()));
+
+  std::size_t read =
+      boost::beast::detail::base64::decode(ret.data(), val.c_str(), val.size())
+          .first;
 
-  std::vector<char> ret(buf, buf + read);
-  return std::vector<char>(buf, buf + read);
+  ret.resize(read);
+  return ret;
 }
 
 std::string base64::encode(const std::string &val) {
-  char buf[boost::beast::detail::base64::encoded_size(val.size())];
-  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::encoded_size(val.size()));
 
-  return std::string(buf, read);
+  std::size_t read = boost::beast::detail::base64::encode(
+      &ret.front(), val.data(), val.size());
+
+  ret.resize(read);
+  return ret;
 }
 
 std::string base64::encodeVector(const std::vector<char> &val) {
-  char buf[boost::beast::detail::base64::encoded_size(val.size())];
-  int read = boost::beast::detail::base64::encode(buf, val.data(), val.size());
+  std::string ret;
+  ret.resize(boost::beast::detail::base64::encoded_size(val.size()));
+
+  std::size_t read = boost::beast::detail::base64::encode(
+      &ret.front(), val.data(), val.size());
 
-  return std::string(buf, read);
+  ret.resize(read);
+  return ret;
 }