diff --git a/src/command_dynamic.cc b/src/command_dynamic.cc index bdfead2f..edbc3278 100644 --- a/src/command_dynamic.cc +++ b/src/command_dynamic.cc @@ -157,7 +157,7 @@ system_method_insert_object(const torrent::Object::list_type& args, int flags) { torrent::Object valueList = torrent::Object::create_list(); torrent::Object::list_type& valueListType = valueList.as_list(); - if ((itrArgs)->is_list()) + if (itrArgs != args.end() && (itrArgs)->is_list()) valueListType = (itrArgs)->as_list(); control->object_storage()->insert_str(raw_key, valueList, flags); diff --git a/test/src/test_command_dynamic.cc b/test/src/test_command_dynamic.cc index 445b0533..f81fc274 100644 --- a/test/src/test_command_dynamic.cc +++ b/test/src/test_command_dynamic.cc @@ -61,3 +61,24 @@ TestCommandDynamic::test_old_style() { rpc::commands.call_command("method.insert", rpc::create_object_list("test_old_style.4", "simple", "cat=test.3")); CPPUNIT_ASSERT(rpc::commands.call_command("test_old_style.4", torrent::Object()).as_string() == "test.3"); } + +void +TestCommandDynamic::test_insert_list() { + torrent::Object key_only = torrent::Object::create_list(); + key_only.as_list().push_back("test_insert_list.1"); + + rpc::commands.call_command("method.insert.list", key_only); + + torrent::Object result = rpc::commands.call_command("test_insert_list.1", torrent::Object()); + + CPPUNIT_ASSERT(result.is_list()); + CPPUNIT_ASSERT(result.as_list().empty()); + + rpc::commands.call_command("method.insert.list", + rpc::create_object_list("test_insert_list.2", rpc::create_object_list("a", "b"))); + + torrent::Object filled = rpc::commands.call_command("test_insert_list.2", torrent::Object()); + + CPPUNIT_ASSERT(filled.is_list()); + CPPUNIT_ASSERT_EQUAL((size_t)2, filled.as_list().size()); +} diff --git a/test/src/test_command_dynamic.h b/test/src/test_command_dynamic.h index 2214d64c..11e9b06b 100644 --- a/test/src/test_command_dynamic.h +++ b/test/src/test_command_dynamic.h @@ -7,6 +7,7 @@ class TestCommandDynamic : public test_fixture { CPPUNIT_TEST(test_basics); CPPUNIT_TEST(test_get_set); CPPUNIT_TEST(test_old_style); + CPPUNIT_TEST(test_insert_list); CPPUNIT_TEST_SUITE_END(); @@ -18,6 +19,7 @@ public: void test_get_set(); void test_old_style(); + void test_insert_list(); private: std::unique_ptr m_test_main_thread;