summaryrefslogtreecommitdiff
path: root/include/fud_format.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/fud_format.hpp')
-rw-r--r--include/fud_format.hpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/include/fud_format.hpp b/include/fud_format.hpp
index e80d96e..0dff3c1 100644
--- a/include/fud_format.hpp
+++ b/include/fud_format.hpp
@@ -261,6 +261,9 @@ struct FormatArguments {
template <typename... Args>
static auto makeFormatArguments(Args&&... args) -> FormatArguments
{
+ static_assert(Size == sizeof...(Args));
+ constexpr size_t MaxStackFormatArgSize = 2048U;
+ static_assert(sizeof(FormatArguments) < MaxStackFormatArgSize);
return FormatArguments{Array<FormatArgument, Size>{{FormatArgument{std::forward<Args>(args)}...}}};
}
};
@@ -440,6 +443,10 @@ FormatResult vFormat(Sink& sink, FormatCharMode formatMode, FormatString fmt, co
}
formatArgIndex = formatSpec.position;
}
+ if (formatArgIndex >= Size) {
+ result.status = FudStatus::FormatInvalid;
+ return result;
+ }
auto argResult{std::visit(
[&](const auto& arg) -> FormatResult { return format(sink, formatMode, formatSpec, arg); },
args[formatArgIndex])};
@@ -451,7 +458,6 @@ FormatResult vFormat(Sink& sink, FormatCharMode formatMode, FormatString fmt, co
if (!formatSpec.takesPosition()) {
argIndex++;
argIndex += static_cast<uint8_t>(formatSpec.takesWidth);
- argIndex += static_cast<uint8_t>(formatSpec.takesPrecision);
}
}