OSDN Git Service

[CodeView] Validate the vftable offset
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 4 Jun 2016 15:40:29 +0000 (15:40 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 4 Jun 2016 15:40:29 +0000 (15:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271791 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/CodeView/TypeRecord.h

index c2f1343..b47d542 100644 (file)
@@ -1061,8 +1061,12 @@ public:
     MethodOptions Options = L->Attrs.getFlags();
     MethodKind MethKind = L->Attrs.getMethodKind();
     MemberAccess Access = L->Attrs.getAccess();
-    return OneMethodRecord(L->Type, MethKind, Options, Access, VFTableOffset,
+    OneMethodRecord Method(L->Type, MethKind, Options, Access, VFTableOffset,
                            Name);
+    // Validate the vftable offset.
+    if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0)
+      return std::make_error_code(std::errc::illegal_byte_sequence);
+    return Method;
   }
 
   TypeIndex getType() const { return Type; }
@@ -1122,6 +1126,11 @@ public:
 
       Methods.emplace_back(L->Type, MethKind, Options, Access, VFTableOffset,
                            StringRef());
+
+      // Validate the vftable offset.
+      auto &Method = Methods.back();
+      if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0)
+        return std::make_error_code(std::errc::illegal_byte_sequence);
     }
     return MethodOverloadListRecord(Methods);
   }