LibIPC: Move most of DeprecatedString's encoder to StringView's encoder

This was a footgun waiting to happen. The StringView encoder is only
used internally within IPC::Encoder to encode DeprecatedString. It does
not encode its null state nor its length. If someone were to innocently
use the StringView encoder as it is, and then decode a DeprecatedString
on the remote end, the decoding would be corrupt.

This changes the StringView encoder to do the work the DeprecatedString
encoder is currently doing, and the latter now just forwards to it.
This commit is contained in:
Timothy Flynn 2023-01-04 11:01:41 -05:00 committed by Linus Groh
parent 7c6b5ed161
commit 0ae2cef8b4
Notes: sideshowbarker 2024-07-17 02:29:45 +09:00

View file

@ -44,6 +44,11 @@ ErrorOr<void> encode(Encoder& encoder, double const& value)
template<>
ErrorOr<void> encode(Encoder& encoder, StringView const& value)
{
// NOTE: Do not change this encoding without also updating LibC/netdb.cpp.
if (value.is_null())
return encoder.encode(NumericLimits<u32>::max());
TRY(encoder.encode_size(value.length()));
TRY(encoder.append(reinterpret_cast<u8 const*>(value.characters_without_null_termination()), value.length()));
return {};
}
@ -51,13 +56,7 @@ ErrorOr<void> encode(Encoder& encoder, StringView const& value)
template<>
ErrorOr<void> encode(Encoder& encoder, DeprecatedString const& value)
{
// NOTE: Do not change this encoding without also updating LibC/netdb.cpp.
if (value.is_null())
return encoder.encode(NumericLimits<u32>::max());
TRY(encoder.encode_size(value.length()));
TRY(encoder.encode(value.view()));
return {};
return encoder.encode(value.view());
}
template<>