Procházet zdrojové kódy

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.
Timothy Flynn před 2 roky
rodič
revize
0ae2cef8b4
1 změnil soubory, kde provedl 6 přidání a 7 odebrání
  1. 6 7
      Userland/Libraries/LibIPC/Encoder.cpp

+ 6 - 7
Userland/Libraries/LibIPC/Encoder.cpp

@@ -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<>