aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhor911 <hor911@ydb.tech>2023-05-22 11:48:58 +0300
committerhor911 <hor911@ydb.tech>2023-05-22 11:48:58 +0300
commit19614fa3bc70a349c94c2a8ac3948ca85b0845fb (patch)
tree9a6e60ab48f07d3a5194f5d4fca498ff0bfc7451
parent9e258cf4b51d43733def07bb16825edfe1245d87 (diff)
downloadydb-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.cpp7
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 << "]")));