[llvm] r250117 - Fixed bugs in llvm-obdump while parsing Mach-O files from malformed archives

Rafael Espíndola via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 13 10:59:11 PDT 2015


Hi Kevin,

Instead of adding a second function, please change
ArchiveMemberHeader::getSize() to return ErrorOr<uint32_t>.

Thanks,
Rafael


On 12 October 2015 at 18:04, Kevin Enderby via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: enderby
> Date: Mon Oct 12 17:04:54 2015
> New Revision: 250117
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250117&view=rev
> Log:
> Fixed bugs in llvm-obdump while parsing Mach-O files from malformed archives
> that caused aborts.  This was because of the characters of the ‘Size’ field in
> the archive header did not contain decimal characters.
>
> rdar://22983603
>
> Added:
>     llvm/trunk/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a   (with props)
> Modified:
>     llvm/trunk/include/llvm/Object/Archive.h
>     llvm/trunk/lib/Object/Archive.cpp
>     llvm/trunk/test/tools/llvm-objdump/X86/malformed-machos.test
>
> Modified: llvm/trunk/include/llvm/Object/Archive.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Archive.h?rev=250117&r1=250116&r2=250117&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/Archive.h (original)
> +++ llvm/trunk/include/llvm/Object/Archive.h Mon Oct 12 17:04:54 2015
> @@ -38,6 +38,7 @@ struct ArchiveMemberHeader {
>
>    /// Members are not larger than 4GB.
>    uint32_t getSize() const;
> +  bool isSizeValid() const;
>
>    sys::fs::perms getAccessMode() const;
>    sys::TimeValue getLastModified() const;
>
> Modified: llvm/trunk/lib/Object/Archive.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=250117&r1=250116&r2=250117&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/Archive.cpp (original)
> +++ llvm/trunk/lib/Object/Archive.cpp Mon Oct 12 17:04:54 2015
> @@ -50,6 +50,13 @@ uint32_t ArchiveMemberHeader::getSize()
>    return Ret;
>  }
>
> +bool ArchiveMemberHeader::isSizeValid() const {
> +  uint32_t Ret;
> +  if (llvm::StringRef(Size, sizeof(Size)).rtrim(" ").getAsInteger(10, Ret))
> +    return false;
> +  return true;
> +}
> +
>  sys::fs::perms ArchiveMemberHeader::getAccessMode() const {
>    unsigned Ret;
>    if (StringRef(AccessMode, sizeof(AccessMode)).rtrim(" ").getAsInteger(8, Ret))
> @@ -89,6 +96,11 @@ Archive::Child::Child(const Archive *Par
>
>    uint64_t Size = sizeof(ArchiveMemberHeader);
>    Data = StringRef(Start, Size);
> +  // Check to make sure the size is valid.
> +  const ArchiveMemberHeader *Header =
> +    reinterpret_cast<const ArchiveMemberHeader *>(Data.data());
> +  if (!Header->isSizeValid())
> +    return;
>    if (!isThinMember()) {
>      Size += getRawSize();
>      Data = StringRef(Start, Size);
>
> Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a?rev=250117&view=auto
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/malformed-machos/00000031.a
> ------------------------------------------------------------------------------
>     svn:mime-type = application/octet-stream
>
> Modified: llvm/trunk/test/tools/llvm-objdump/X86/malformed-machos.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/malformed-machos.test?rev=250117&r1=250116&r2=250117&view=diff
> ==============================================================================
> --- llvm/trunk/test/tools/llvm-objdump/X86/malformed-machos.test (original)
> +++ llvm/trunk/test/tools/llvm-objdump/X86/malformed-machos.test Mon Oct 12 17:04:54 2015
> @@ -39,3 +39,9 @@
>  # RUN:   | FileCheck -check-prefix=m0337 %s
>
>  # m0337: subq  $16, %rsp
> +
> +# RUN: llvm-objdump -macho -disassemble \
> +# RUN:   %p/Inputs/malformed-machos/00000031.a \
> +# RUN:   | FileCheck -check-prefix=0031a %s
> +
> +# 0031a: Archive
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list