Page MenuHomePhabricator

Fix invalid quad key crashes
Closed, ResolvedPublic

Description

Unable to repro this, so there aren't repro steps, but the crash log is indicative of an out of range value being passed to the UInt32 initializer

1	WMF	function signature specialization <Arg[1] = Dead> of (extension in WMF):Swift.UInt32.init (longitude : Swift.Double) -> Swift.UInt32 (QuadKey.swift:112)
2	WMF	function signature specialization <Arg[0] = Owned To Guaranteed> of (extension in WMF):__ObjC.WMFArticle.update (withSummary : [Swift.String : Any]) -> () (SummaryExtensions.swift:0)
3	WMF	@objc (extension in WMF):__ObjC.WMFArticle.update (withSummary : [Swift.String : Any]) -> () (SummaryExtensions.swift:0)
4	WMF	function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed, Arg[2] = Owned To Guaranteed> of (extension in WMF):__ObjC.NSManagedObjectContext.(updateOrCreateArticleSummariesForArticles (withURLs : [Foundation.URL], completion : ([__ObjC.WMFArticle]) -> ()) -> ()).(closure #2).(closure #1) (SummaryExtensions.swift:96)
5	WMF	partial apply forwarder for (extension in WMF):__ObjC.NSManagedObjectContext.(updateOrCreateArticleSummariesForArticles (withURLs : [Foundation.URL], completion : ([__ObjC.WMFArticle]) -> ()) -> ()).(closure #2).(closure #1) (SummaryExtensions.swift:0)

Which could happen if there are somehow bogus or slightly out of range latitude and longitude coordinates on an article:

var invalidKey = QuadKey(latitude: Double.nan, longitude: Double.nan)
XCTAssertEqual(invalidKey.latitude, -90)
XCTAssertEqual(invalidKey.longitude, -180)

invalidKey = QuadKey(latitude: Double.signalingNaN, longitude: Double.signalingNaN)
XCTAssertEqual(invalidKey.latitude, -90)
XCTAssertEqual(invalidKey.longitude, -180)

invalidKey = QuadKey(latitude: Double.infinity, longitude: Double.infinity)
XCTAssertEqual(invalidKey.latitude, -90)
XCTAssertEqual(invalidKey.longitude, -180)

invalidKey = QuadKey(latitude: 90.00001, longitude: 180.00001)
XCTAssertEqual(invalidKey.longitude, 180)
XCTAssertEqual(invalidKey.latitude, 90)

invalidKey = QuadKey(latitude: -90.01, longitude: -180.01)
XCTAssertEqual(invalidKey.longitude, -180)
XCTAssertEqual(invalidKey.latitude, -90)

Testing Criteria:
Ensure Places continues to work as expected. Test loading articles with strange coordinates (Antartica article, Null Island, Northern Hemisphere, etc) and ensure they don't crash the app. Keep in mind the map view will still not show some of these articles correctly (Antartica, for example), but that's expected for now. The important part is that the app doesn't crash.