diff options
author | Jason Molenda <jmolenda@apple.com> | 2018-06-25 23:45:39 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2018-06-25 23:45:39 +0000 |
commit | 32a914256e6a8e8d1b2c78c71def1d9cb7042371 (patch) | |
tree | 182b7c046073865d939b799ef0c09be6f42086ed /lldb/source/Plugins | |
parent | f74ef4b1e634f094654de3b7b3567fa747c7e8a8 (diff) | |
download | bcm5719-llvm-32a914256e6a8e8d1b2c78c71def1d9cb7042371.tar.gz bcm5719-llvm-32a914256e6a8e8d1b2c78c71def1d9cb7042371.zip |
A little cleanup in ObjectFileMachO::GetSDKVersion.
This method does one of two things:
1. finds a minimum os deployment version # in a Mach-O load
command and saves the three parts in the m_sdk_version, or
2. finds no valid min os version # load command, pushes a
sentinel value on the m_sdk_version vector so we don't search
the same load commands multiple times.
There was a little bug when we found a load command with
a version of 0.0.0 - the method would not add anything to
the m_sdk_version vector but would declare that a success.
It would not push the sentinel value to the vector.
There was code later in the method which assumed that
the vector always had a sentinel value, at least, and that
code could crash when this method was called back when
evaluating a Swift expression. (these version #'s are
fetched lazily so it wouldn't happen when the object file
was parsed, only when doing an expression that needed
the version #).
<rdar://problem/41372699>
llvm-svn: 335556
Diffstat (limited to 'lldb/source/Plugins')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 0aa0fc91e40..882cd1a9398 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -5757,20 +5757,29 @@ uint32_t ObjectFileMachO::GetSDKVersion(uint32_t *versions, m_sdk_versions.push_back(xxxx); m_sdk_versions.push_back(yy); m_sdk_versions.push_back(zz); + success = true; + } else { + GetModule()->ReportWarning( + "minimum OS version load command with invalid (0) version found."); } - success = true; } } offset = load_cmd_offset + lc.cmdsize; } if (success == false) { - // Push an invalid value so we don't keep trying to + // Push an invalid value so we don't try to find + // the version # again on the next call to this + // method. m_sdk_versions.push_back(UINT32_MAX); } } - if (m_sdk_versions.size() > 1 || m_sdk_versions[0] != UINT32_MAX) { + // Legitimate version numbers will have 3 entries pushed + // on to m_sdk_versions. If we only have one value, it's + // the sentinel value indicating that this object file + // does not have a valid minimum os version #. + if (m_sdk_versions.size() > 1) { if (versions != NULL && num_versions > 0) { for (size_t i = 0; i < num_versions; ++i) { if (i < m_sdk_versions.size()) |