llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: NotPppp1116

<details>
<summary>Changes</summary>

## What

Validate that generic iOS-derived `VersionMap` entries are JSON objects before 
parsing them.

## Why

Malformed `SDKSettings.json` data such as `"iOS_tvOS": "invalid"` made 
`getAsObject()` return null and was immediately dereferenced, crashing while 
loading the SDK metadata.

## Impact

Non-object derived-version mappings are ignored consistently with other 
unparseable generic mappings. Valid mappings are unchanged.

## Checks

- built `BasicTests`
- `DarwinSDKInfoTest.*` and `DarwinSDKInfo.*`: 9/9 passed
- focused ReturnGuard rescan reports no unchecked nullable dereference


---
Full diff: https://github.com/llvm/llvm-project/pull/209481.diff


2 Files Affected:

- (modified) clang/lib/Basic/DarwinSDKInfo.cpp (+4-1) 
- (modified) clang/unittests/Basic/DarwinSDKInfoTest.cpp (+18) 


``````````diff
diff --git a/clang/lib/Basic/DarwinSDKInfo.cpp 
b/clang/lib/Basic/DarwinSDKInfo.cpp
index 4e44da8febc3e..0b4e623e8fbf2 100644
--- a/clang/lib/Basic/DarwinSDKInfo.cpp
+++ b/clang/lib/Basic/DarwinSDKInfo.cpp
@@ -286,8 +286,11 @@ DarwinSDKInfo::parseDarwinSDKSettingsJSON(std::string 
FilePath,
       if (Pair.first.compare_insensitive("ios") == 0) {
         llvm::Triple TT(llvm::Twine("--") + Pair.second.lower());
         if (TT.getOS() != llvm::Triple::UnknownOS) {
+          const auto *MappingObject = KV.getSecond().getAsObject();
+          if (!MappingObject)
+            continue;
           auto Mapping = RelatedTargetVersionMapping::parseJSON(
-              *KV.getSecond().getAsObject(), *MaximumDeploymentVersion);
+              *MappingObject, *MaximumDeploymentVersion);
           if (Mapping)
             VersionMappings[OSEnvPair(llvm::Triple::IOS,
                                       llvm::Triple::UnknownEnvironment,
diff --git a/clang/unittests/Basic/DarwinSDKInfoTest.cpp 
b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
index 33d817c456403..2317b299b3f1b 100644
--- a/clang/unittests/Basic/DarwinSDKInfoTest.cpp
+++ b/clang/unittests/Basic/DarwinSDKInfoTest.cpp
@@ -223,6 +223,24 @@ TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
       VersionTuple(15, 0, 99));
 }
 
+TEST(DarwinSDKInfoTest, IgnoreNonObjectIOSDerivedMapping) {
+  llvm::json::Object Obj;
+  Obj["CanonicalName"] = "appletvos15.0";
+  Obj["Version"] = "15.0";
+  Obj["MaximumDeploymentTarget"] = "15.0.99";
+  llvm::json::Object IOSToTvOS;
+  IOSToTvOS["iOS_tvOS"] = "not a mapping object";
+  Obj["VersionMap"] = std::move(IOSToTvOS);
+
+  auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj);
+  ASSERT_TRUE(SDKInfo);
+  EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(15, 0));
+  EXPECT_EQ(SDKInfo->getVersionMapping(DarwinSDKInfo::OSEnvPair(
+                llvm::Triple::IOS, llvm::Triple::UnknownEnvironment,
+                llvm::Triple::TvOS, llvm::Triple::UnknownEnvironment)),
+            nullptr);
+}
+
 TEST(DarwinSDKInfoTest, MissingKeys) {
   llvm::json::Object Obj;
   ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON("", &Obj));

``````````

</details>


https://github.com/llvm/llvm-project/pull/209481
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to