diff options
author | hor911 <hor911@ydb.tech> | 2023-05-22 11:48:58 +0300 |
---|---|---|
committer | hor911 <hor911@ydb.tech> | 2023-05-22 11:48:58 +0300 |
commit | 19614fa3bc70a349c94c2a8ac3948ca85b0845fb (patch) | |
tree | 9a6e60ab48f07d3a5194f5d4fca498ff0bfc7451 | |
parent | 9e258cf4b51d43733def07bb16825edfe1245d87 (diff) | |
download | ydb-19614fa3bc70a349c94c2a8ac3948ca85b0845fb.tar.gz |
Keep tmp substring since NHttp::THeaders doesn't control its LC
NHttp::Headers не управляет временем жизни переданной в него строки, он ожидает что она будет существовать все время его жизни и строит внутри структуру из TStringBuf. Поэтому когда она создается поверх временной строки от substr() то чаще всего все ОК, но иногда строка затирается мусором. Это мог бы обнаружить ASAN, но, например, библиотека MOTO в тестах не умеет возвращать код 100, поэтому там всегда substr - это копия всей исходной строки и у нее всегда все с памятью ОК.
-rw-r--r-- | ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp b/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp index f037e526686..d953464688c 100644 --- a/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp +++ b/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp @@ -269,8 +269,9 @@ private: static void OnPartUploadFinish(TActorSystem* actorSystem, TActorId selfId, TActorId parentId, size_t size, size_t index, const TString& requestId, IHTTPGateway::TResult&& response) { if (!response.Issues) { - TString str = response.Content.Headers; - if (const NHttp::THeaders headers(str.substr(str.rfind("HTTP/"))); headers.Has("Etag")) + const auto& str = response.Content.Headers; + const auto headerStr = str.substr(str.rfind("HTTP/")); + if (const NHttp::THeaders headers(headerStr); headers.Has("Etag")) actorSystem->Send(new IEventHandle(selfId, selfId, new TEvPrivate::TEvUploadPartFinished(size, index, TString(headers.Get("Etag"))))); else { TS3Result s3Result(std::move(response.Content.Extract())); @@ -280,7 +281,7 @@ private: constexpr size_t BODY_MAX_SIZE = 1_KB; actorSystem->Send(new IEventHandle(parentId, selfId, new TEvPrivate::TEvUploadError(NYql::NDqProto::StatusIds::INTERNAL_ERROR, TStringBuilder() << "Unexpected response" - << ". Headers: " << str + << ". Headers: " << headerStr << ". Body: \"" << TStringBuf(s3Result.Body).Trunc(BODY_MAX_SIZE) << (s3Result.Body.size() > BODY_MAX_SIZE ? "\"..." : "\"") << ". Request id: [" << requestId << "]"))); |