Commit 1bf26071 authored by Tom Schuster's avatar Tom Schuster
Browse files

Bug 1799156 - Filter unknown DataTransferItem flavors. r=nika, a=RyanVM

parent 8dc597ab
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -7600,9 +7600,27 @@ void nsContentUtils::SetKeyboardIndicatorsOnRemoteChildren(
  });
}

bool nsContentUtils::IPCDataTransferItemHasKnownFlavor(
    const IPCDataTransferItem& aItem) {
  // Unknown types are converted to kCustomTypesMime.
  // FIXME(bug 1776879) text/plain is converted to text/unicode still.
  if (aItem.flavor().EqualsASCII(kCustomTypesMime) ||
      aItem.flavor().EqualsASCII(kUnicodeMime)) {
    return true;
  }

  for (const char* format : DataTransfer::kKnownFormats) {
    if (aItem.flavor().EqualsASCII(format)) {
      return true;
    }
  }

  return false;
}

nsresult nsContentUtils::IPCTransferableToTransferable(
    const IPCDataTransfer& aDataTransfer, bool aAddDataFlavor,
    nsITransferable* aTransferable, IShmemAllocator* aAllocator) {
    nsITransferable* aTransferable, IShmemAllocator* aAllocator, bool aFilterUnknownFlavors) {
  auto release = MakeScopeExit([&] {
    const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items();
    for (const auto& item : items) {
@@ -7615,6 +7633,13 @@ nsresult nsContentUtils::IPCTransferableToTransferable(
  nsresult rv;
  const nsTArray<IPCDataTransferItem>& items = aDataTransfer.items();
  for (const auto& item : items) {
    if (aFilterUnknownFlavors && !IPCDataTransferItemHasKnownFlavor(item)) {
      NS_WARNING(
          "Ignoring unknown flavor in "
          "nsContentUtils::IPCTransferableToTransferable");
      continue;
    }

    if (aAddDataFlavor) {
      aTransferable->AddDataFlavor(item.flavor().get());
    }
@@ -7691,11 +7716,11 @@ nsresult nsContentUtils::IPCTransferableToTransferable(
    const IPCDataTransfer& aDataTransfer, const bool& aIsPrivateData,
    nsIPrincipal* aRequestingPrincipal,
    const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor,
    nsITransferable* aTransferable, IShmemAllocator* aAllocator) {
    nsITransferable* aTransferable, IShmemAllocator* aAllocator, bool aFilterUnknownFlavors) {
  aTransferable->SetIsPrivateData(aIsPrivateData);

  nsresult rv = IPCTransferableToTransferable(aDataTransfer, aAddDataFlavor,
                                              aTransferable, aAllocator);
                                              aTransferable, aAllocator, aFilterUnknownFlavors);
  NS_ENSURE_SUCCESS(rv, rv);

  aTransferable->SetRequestingPrincipal(aRequestingPrincipal);
+5 −2
Original line number Diff line number Diff line
@@ -2884,17 +2884,20 @@ class nsContentUtils {
   */
  static bool IsFlavorImage(const nsACString& aFlavor);

  static bool IPCDataTransferItemHasKnownFlavor(
      const mozilla::dom::IPCDataTransferItem& aItem);

  static nsresult IPCTransferableToTransferable(
      const mozilla::dom::IPCDataTransfer& aDataTransfer, bool aAddDataFlavor,
      nsITransferable* aTransferable,
      mozilla::ipc::IShmemAllocator* aAllocator);
      mozilla::ipc::IShmemAllocator* aAllocator, bool aFilterUnknownFlavors);

  static nsresult IPCTransferableToTransferable(
      const mozilla::dom::IPCDataTransfer& aDataTransfer,
      const bool& aIsPrivateData, nsIPrincipal* aRequestingPrincipal,
      const nsContentPolicyType& aContentPolicyType, bool aAddDataFlavor,
      nsITransferable* aTransferable,
      mozilla::ipc::IShmemAllocator* aAllocator);
      mozilla::ipc::IShmemAllocator* aAllocator, bool aFilterUnknownFlavors);

  static nsresult IPCTransferableItemToVariant(
      const mozilla::dom::IPCDataTransferItem& aDataTransferItem,
+2 −23
Original line number Diff line number Diff line
@@ -888,27 +888,6 @@ already_AddRefed<nsITransferable> DataTransfer::GetTransferable(
  const uint32_t baseLength = sizeof(uint32_t) + 1;
  uint32_t totalCustomLength = baseLength;

  const char* knownFormats[] = {kTextMime,
                                kHTMLMime,
                                kNativeHTMLMime,
                                kRTFMime,
                                kURLMime,
                                kURLDataMime,
                                kURLDescriptionMime,
                                kURLPrivateMime,
                                kPNGImageMime,
                                kJPEGImageMime,
                                kGIFImageMime,
                                kNativeImageMime,
                                kFileMime,
                                kFilePromiseMime,
                                kFilePromiseURLMime,
                                kFilePromiseDestFilename,
                                kFilePromiseDirectoryMime,
                                kMozTextInternal,
                                kHTMLContext,
                                kHTMLInfo,
                                kImageRequestMime};

  /*
   * Two passes are made here to iterate over all of the types. First, look for
@@ -945,8 +924,8 @@ already_AddRefed<nsITransferable> DataTransfer::GetTransferable(

      // If the data is of one of the well-known formats, use it directly.
      bool isCustomFormat = true;
      for (uint32_t f = 0; f < ArrayLength(knownFormats); f++) {
        if (type.EqualsASCII(knownFormats[f])) {
      for (const char* format : kKnownFormats) {
        if (type.EqualsASCII(format)) {
          isCustomFormat = false;
          break;
        }
+23 −0
Original line number Diff line number Diff line
@@ -393,6 +393,29 @@ class DataTransfer final : public nsISupports, public nsWrapperCache {
                                             bool aPlainTextOnly,
                                             nsTArray<nsCString>* aResult);

  // Formats that are "known" and won't be converted to the kCustomTypesMime.
  static inline const char* const kKnownFormats[] = {kTextMime,
                                                     kHTMLMime,
                                                     kNativeHTMLMime,
                                                     kRTFMime,
                                                     kURLMime,
                                                     kURLDataMime,
                                                     kURLDescriptionMime,
                                                     kURLPrivateMime,
                                                     kPNGImageMime,
                                                     kJPEGImageMime,
                                                     kGIFImageMime,
                                                     kNativeImageMime,
                                                     kFileMime,
                                                     kFilePromiseMime,
                                                     kFilePromiseURLMime,
                                                     kFilePromiseDestFilename,
                                                     kFilePromiseDirectoryMime,
                                                     kMozTextInternal,
                                                     kHTMLContext,
                                                     kHTMLInfo,
                                                     kImageRequestMime};

 protected:
  // Non-text items are ignored.
  //
+7 −0
Original line number Diff line number Diff line
@@ -43,6 +43,13 @@ void RemoteDragStartData::AddInitialDnDDataTo(
  for (uint32_t i = 0; i < mDataTransfer.Length(); ++i) {
    nsTArray<IPCDataTransferItem>& itemArray = mDataTransfer[i].items();
    for (auto& item : itemArray) {
      if (!nsContentUtils::IPCDataTransferItemHasKnownFlavor(item)) {
        NS_WARNING(
            "Ignoring unknown flavor in "
            "RemoteDragStartData::AddInitialDnDDataTo");
        continue;
      }

      RefPtr<nsVariantCC> variant = new nsVariantCC();
      // Special case kFilePromiseMime so that we get the right
      // nsIFlavorDataProvider for it.
Loading