Browse Source

Fix assertion failure when dir option of paused HTTP/FTP download is changed

When the directory is changed via aria2.changeOption RPC method, we
directly change first FileEntry's path using FileEntry::setPath().  If
there is no PREF_OUT option is given, basically file name is unknown,
so we just set empty string and let the next run determine the correct
file name and new directory is applied there.  But previous code does
not reset length property of FileEntry, so the unexpected code path is
taken when unpaused and its path expects path is not empty string.
This commit fixes this issue by setting length to 0 using
FileEntry::setLength().
Tatsuhiro Tsujikawa 11 năm trước cách đây
mục cha
commit
83f4bced07
1 tập tin đã thay đổi với 12 bổ sung3 xóa
  1. 12 3
      src/RpcMethodImpl.cc

+ 12 - 3
src/RpcMethodImpl.cc

@@ -1478,9 +1478,18 @@ void changeOption
        && !dctx->hasAttribute(CTX_ATTR_BT)
 #endif // ENABLE_BITTORRENT
        ) {
-      dctx->getFirstFileEntry()->setPath
-        (grOption->blank(PREF_OUT) ? A2STR::NIL :
-         util::applyDir(grOption->get(PREF_DIR), grOption->get(PREF_OUT)));
+
+      auto& fileEntry = dctx->getFirstFileEntry();
+
+      if(grOption->blank(PREF_OUT)) {
+        // We need to reset length to 0, so that we pretend that file
+        // name is unknown and it should be determined at next run.
+        fileEntry->setLength(0);
+        fileEntry->setPath(A2STR::NIL);
+      } else {
+        fileEntry->setPath
+          (util::applyDir(grOption->get(PREF_DIR), grOption->get(PREF_OUT)));
+      }
     }
   }
 #ifdef ENABLE_BITTORRENT