Skip to content

Commit bb9799d

Browse files
committed
check actingVersion when decoding groups in C++ OTF
1 parent 97a26fe commit bb9799d

File tree

1 file changed

+25
-7
lines changed

1 file changed

+25
-7
lines changed

sbe-tool/src/main/cpp/otf/OtfMessageDecoder.h

+25-7
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ std::size_t decodeData(
250250
std::shared_ptr<std::vector<Token>> tokens,
251251
std::size_t tokenIndex,
252252
const std::size_t numTokens,
253+
std::uint64_t actingVersion,
253254
TokenListener& listener)
254255
{
255256
while (tokenIndex < numTokens)
@@ -260,6 +261,8 @@ std::size_t decodeData(
260261
break;
261262
}
262263

264+
const bool isPresent = token.tokenVersion() <= static_cast<std::int32_t>(actingVersion);
265+
263266
Token& lengthToken = tokens->at(tokenIndex + 2);
264267
Token& dataToken = tokens->at(tokenIndex + 3);
265268

@@ -269,9 +272,14 @@ std::size_t decodeData(
269272
}
270273

271274
// TODO: is length always unsigned according to spec?
272-
std::uint64_t dataLength = lengthToken.encoding().getAsUInt(buffer + bufferIndex + lengthToken.offset());
275+
std::uint64_t dataLength = isPresent ?
276+
lengthToken.encoding().getAsUInt(buffer + bufferIndex + lengthToken.offset())
277+
: 0;
273278

274-
bufferIndex += dataToken.offset();
279+
if (isPresent)
280+
{
281+
bufferIndex += dataToken.offset();
282+
}
275283

276284
if ((bufferIndex + dataLength) > length)
277285
{
@@ -306,6 +314,8 @@ std::pair<size_t, size_t> decodeGroups(
306314
break;
307315
}
308316

317+
const bool isPresent = token.tokenVersion() <= static_cast<std::int32_t>(actingVersion);
318+
309319
Token& dimensionsTypeComposite = tokens->at(tokenIndex + 1);
310320
std::size_t dimensionsLength = static_cast<std::size_t>(dimensionsTypeComposite.encodedLength());
311321

@@ -317,10 +327,17 @@ std::pair<size_t, size_t> decodeGroups(
317327
Token& blockLengthToken = tokens->at(tokenIndex + 2);
318328
Token& numInGroupToken = tokens->at(tokenIndex + 3);
319329

320-
std::uint64_t blockLength = blockLengthToken.encoding().getAsUInt(buffer + bufferIndex + blockLengthToken.offset());
321-
std::uint64_t numInGroup = numInGroupToken.encoding().getAsUInt(buffer + bufferIndex + numInGroupToken.offset());
330+
std::uint64_t blockLength = isPresent ?
331+
blockLengthToken.encoding().getAsUInt(buffer + bufferIndex + blockLengthToken.offset())
332+
: 0;
333+
std::uint64_t numInGroup = isPresent ?
334+
numInGroupToken.encoding().getAsUInt(buffer + bufferIndex + numInGroupToken.offset())
335+
: 0;
322336

323-
bufferIndex += dimensionsLength;
337+
if (isPresent)
338+
{
339+
bufferIndex += dimensionsLength;
340+
}
324341

325342
size_t beginFieldsIndex = tokenIndex + dimensionsTypeComposite.componentTokenCount() + 1;
326343

@@ -342,7 +359,8 @@ std::pair<size_t, size_t> decodeGroups(
342359
std::pair<size_t, size_t> groupsResult =
343360
decodeGroups(buffer, bufferIndex, length, actingVersion, tokens, afterFieldsIndex, numTokens, listener);
344361

345-
bufferIndex = decodeData(buffer, groupsResult.first, length, tokens, groupsResult.second, numTokens, listener);
362+
bufferIndex =
363+
decodeData(buffer, groupsResult.first, length, tokens, groupsResult.second, numTokens, actingVersion, listener);
346364

347365
listener.onEndGroup(token, i, numInGroup);
348366
}
@@ -381,7 +399,7 @@ std::size_t decode(
381399
decodeGroups(buffer, bufferIndex, length, actingVersion, msgTokens, tokenIndex, numTokens, listener);
382400

383401
bufferIndex =
384-
decodeData(buffer, groupResult.first, length, msgTokens, groupResult.second, numTokens, listener);
402+
decodeData(buffer, groupResult.first, length, msgTokens, groupResult.second, numTokens, actingVersion, listener);
385403

386404
listener.onEndMessage(msgTokens->at(numTokens - 1));
387405

0 commit comments

Comments
 (0)