Skip to content

Commit 825e0c4

Browse files
committed
[C++]: added appropriate length checks to fixed character arrays puts with strings.
1 parent 3a018b8 commit 825e0c4

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,17 +1298,35 @@ private CharSequence generateArrayProperty(
12981298

12991299
sb.append(String.format("\n" +
13001300
indent + " #if __cplusplus >= 201703L\n" +
1301-
indent + " %1$s &put%2$s(std::string_view str) SBE_NOEXCEPT\n" +
1301+
indent + " %1$s &put%2$s(std::string_view str)\n" +
13021302
indent + " {\n" +
1303-
indent + " size_t length = str.length() < %4$d ? str.length() : %4$d;\n" +
1303+
indent + " const size_t srcLength = str.length();\n" +
1304+
indent + " if (srcLength > %4$d)\n" +
1305+
indent + " {\n" +
1306+
indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" +
1307+
indent + " }\n\n" +
1308+
indent + " size_t length = srcLength < %4$d ? srcLength : %4$d;\n" +
13041309
indent + " std::memcpy(m_buffer + m_offset + %3$d, str.c_str(), length);\n" +
1310+
indent + " for (size_t start = srcLength; start < length; ++start)\n" +
1311+
indent + " {\n" +
1312+
indent + " m_buffer[m_offset + %3$d + start] = 0;\n" +
1313+
indent + " }\n\n" +
13051314
indent + " return *this;\n" +
13061315
indent + " }\n" +
13071316
indent + " #else\n" +
1308-
indent + " %1$s &put%2$s(const std::string& str) SBE_NOEXCEPT\n" +
1317+
indent + " %1$s &put%2$s(const std::string& str)\n" +
13091318
indent + " {\n" +
1310-
indent + " size_t length = str.length() < %4$d ? str.length() : %4$d;\n" +
1319+
indent + " const size_t srcLength = str.length();\n" +
1320+
indent + " if (srcLength > %4$d)\n" +
1321+
indent + " {\n" +
1322+
indent + " throw std::runtime_error(\"string too large for put%2$s [E106]\");\n" +
1323+
indent + " }\n\n" +
1324+
indent + " size_t length = srcLength < %4$d ? srcLength : %4$d;\n" +
13111325
indent + " std::memcpy(m_buffer + m_offset + %3$d, str.c_str(), length);\n" +
1326+
indent + " for (size_t start = srcLength; start < length; ++start)\n" +
1327+
indent + " {\n" +
1328+
indent + " m_buffer[m_offset + %3$d + start] = 0;\n" +
1329+
indent + " }\n\n" +
13121330
indent + " return *this;\n" +
13131331
indent + " }\n" +
13141332
indent + " #endif\n",

0 commit comments

Comments
 (0)