libcpr/cpr

Multiple Invocations of cpr::MultiPerform Segfault

COM8 opened this issue · 0 comments

COM8 commented

Description

Invoking any cpr::MultiPerform request e.g. cpr::MultiPerform::Get(); multiple times on the same object leads to a crash (SegFault) during the second invocation.

This leads to cpr::MultiPerform to being reusable.

Example/How to Reproduce

Here is an example test case:

TEST(MultiperformGetTests, MultiperformSingleSessionMultiGetTest) {
    Url url{server->GetBaseUrl() + "/hello.html"};
    std::shared_ptr<Session> session = std::make_shared<Session>();
    session->SetUrl(url);
    MultiPerform multiperform;
    multiperform.AddSession(session);
    std::vector<Response> responses = multiperform.Get();

    EXPECT_EQ(responses.size(), 1);
    std::string expected_text{"Hello world!"};
    EXPECT_EQ(expected_text, responses.at(0).text);
    EXPECT_EQ(url, responses.at(0).url);
    EXPECT_EQ(std::string{"text/html"}, responses.at(0).header["content-type"]);
    EXPECT_EQ(200, responses.at(0).status_code);
    EXPECT_EQ(ErrorCode::OK, responses.at(0).error.code);

    // Invoke for the second time
    responses = multiperform.Get(); // Fails here
    EXPECT_EQ(responses.size(), 1);
    EXPECT_EQ(expected_text, responses.at(0).text);
    EXPECT_EQ(url, responses.at(0).url);
    EXPECT_EQ(std::string{"text/html"}, responses.at(0).header["content-type"]);
    EXPECT_EQ(200, responses.at(0).status_code);
    EXPECT_EQ(ErrorCode::OK, responses.at(0).error.code);
}

Possible Fix

No response

Where did you get it from?

GitHub (branch e.g. master)

Additional Context/Your Environment

  • OS: Fedora 39
  • Version: Master as of 28.04.2024 - bed704f