浏览代码

Cap infoHashLength in .aria2 file

Cap infoHashLength in .aria2 file, and save an extra allocation.
Tatsuhiro Tsujikawa 1 年之前
父节点
当前提交
3330110caf
共有 1 个文件被更改,包括 7 次插入6 次删除
  1. 7 6
      src/DefaultBtProgressInfoFile.cc

+ 7 - 6
src/DefaultBtProgressInfoFile.cc

@@ -36,6 +36,7 @@
 
 #include <cstring>
 #include <cstdio>
+#include <array>
 
 #include "PieceStorage.h"
 #include "Piece.h"
@@ -263,21 +264,21 @@ void DefaultBtProgressInfoFile::load()
   if (version >= 1) {
     infoHashLength = ntohl(infoHashLength);
   }
-  if (infoHashLength == 0 && infoHashCheckEnabled) {
+  if (infoHashLength > INFO_HASH_LENGTH ||
+      (infoHashLength != INFO_HASH_LENGTH && infoHashCheckEnabled)) {
     throw DL_ABORT_EX(fmt("Invalid info hash length: %d", infoHashLength));
   }
   if (infoHashLength > 0) {
-    auto savedInfoHash = make_unique<unsigned char[]>((size_t)infoHashLength);
-    READ_CHECK(fp, savedInfoHash.get(), infoHashLength);
+    std::array<unsigned char, INFO_HASH_LENGTH> savedInfoHash;
+    READ_CHECK(fp, savedInfoHash.data(), infoHashLength);
 #ifdef ENABLE_BITTORRENT
     if (infoHashCheckEnabled) {
       const unsigned char* infoHash = bittorrent::getInfoHash(dctx_);
-      if (infoHashLength != INFO_HASH_LENGTH ||
-          memcmp(savedInfoHash.get(), infoHash, INFO_HASH_LENGTH) != 0) {
+      if (memcmp(savedInfoHash.data(), infoHash, INFO_HASH_LENGTH) != 0) {
         throw DL_ABORT_EX(
             fmt("info hash mismatch. expected: %s, actual: %s",
                 util::toHex(infoHash, INFO_HASH_LENGTH).c_str(),
-                util::toHex(savedInfoHash.get(), infoHashLength).c_str()));
+                util::toHex(savedInfoHash.data(), infoHashLength).c_str()));
       }
     }
 #endif // ENABLE_BITTORRENT