tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ByteBufUtils.h (2106B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 /* A type that can be sent without needing to make a copy during
      8 * serialization. In addition the receiver can take ownership of the
      9 * data to avoid having to make an additional copy. */
     10 
     11 #ifndef mozilla_ipc_ByteBufUtils_h
     12 #define mozilla_ipc_ByteBufUtils_h
     13 
     14 #include "mozilla/ipc/ByteBuf.h"
     15 #include "mozilla/CheckedInt.h"
     16 #include "mozilla/mozalloc_oom.h"
     17 #include "ipc/IPCMessageUtils.h"
     18 
     19 namespace IPC {
     20 
     21 template <>
     22 struct ParamTraits<mozilla::ipc::ByteBuf> {
     23  typedef mozilla::ipc::ByteBuf paramType;
     24 
     25  // this is where we transfer the memory from the ByteBuf to IPDL, avoiding a
     26  // copy
     27  static void Write(MessageWriter* aWriter, paramType&& aParam) {
     28    // We need to send the length as a 32-bit value, not a size_t, because on
     29    // ARM64 Windows we end up with a 32-bit GMP process sending a ByteBuf to
     30    // a 64-bit parent process. WriteBytesZeroCopy takes a uint32_t as an
     31    // argument, so it would end up getting truncated anyways. See bug 1757534.
     32    mozilla::CheckedInt<uint32_t> length = aParam.mLen;
     33    MOZ_RELEASE_ASSERT(length.isValid());
     34    WriteParam(aWriter, length.value());
     35    // hand over ownership of the buffer to the Message
     36    aWriter->WriteBytesZeroCopy(aParam.mData, length.value(), aParam.mCapacity);
     37    aParam.mData = nullptr;
     38    aParam.mCapacity = 0;
     39    aParam.mLen = 0;
     40  }
     41 
     42  static bool Read(MessageReader* aReader, paramType* aResult) {
     43    // We make a copy from the BufferList so that we get a contigous result.
     44    uint32_t length;
     45    if (!ReadParam(aReader, &length)) return false;
     46    if (!aResult->Allocate(length)) {
     47      mozalloc_handle_oom(length);
     48      return false;
     49    }
     50    return aReader->ReadBytesInto(aResult->mData, length);
     51  }
     52 };
     53 
     54 }  // namespace IPC
     55 
     56 #endif  // ifndef mozilla_ipc_ByteBufUtils_h