From 517c3e1d4c418e70312ce74efba7c3e0ef558470 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:02:41 +0100 Subject: [PATCH] fix: exif gps parsing of malformed data (#23551) * fix: exif gps parsing of malformed data * chore: e2e test --- e2e/src/api/specs/asset.e2e-spec.ts | 10 ++++++++++ e2e/test-assets | 2 +- server/src/services/metadata.service.ts | 14 ++++++-------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/e2e/src/api/specs/asset.e2e-spec.ts b/e2e/src/api/specs/asset.e2e-spec.ts index 5c30ff5cbe..90d51e7fef 100644 --- a/e2e/src/api/specs/asset.e2e-spec.ts +++ b/e2e/src/api/specs/asset.e2e-spec.ts @@ -1140,6 +1140,16 @@ describe('/asset', () => { }, }, }, + { + input: 'metadata/gps-position/empty_gps.jpg', + expected: { + type: AssetTypeEnum.Image, + exifInfo: { + latitude: null, + longitude: null, + }, + }, + }, ]; it.each(tests)(`should upload and generate a thumbnail for different file types`, async ({ input, expected }) => { diff --git a/e2e/test-assets b/e2e/test-assets index 37f60ea537..68e8b5853c 160000 --- a/e2e/test-assets +++ b/e2e/test-assets @@ -1 +1 @@ -Subproject commit 37f60ea537c0228f5f92e4f42dc42f0bb39a6d7f +Subproject commit 68e8b5853cdc2d76c5e6f18a6d1773793728c491 diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index b73a9b6bf0..e76b335c90 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -236,8 +236,8 @@ export class MetadataService extends BaseService { latitude: number | null = null, longitude: number | null = null; if (this.hasGeo(exifTags)) { - latitude = exifTags.GPSLatitude; - longitude = exifTags.GPSLongitude; + latitude = Number(exifTags.GPSLatitude); + longitude = Number(exifTags.GPSLongitude); if (reverseGeocoding.enabled) { geo = await this.mapRepository.reverseGeocode({ latitude, longitude }); } @@ -894,12 +894,10 @@ export class MetadataService extends BaseService { }; } - private hasGeo(tags: ImmichTags): tags is ImmichTags & { GPSLatitude: number; GPSLongitude: number } { - return ( - tags.GPSLatitude !== undefined && - tags.GPSLongitude !== undefined && - (tags.GPSLatitude !== 0 || tags.GPSLatitude !== 0) - ); + private hasGeo(tags: ImmichTags) { + const lat = Number(tags.GPSLatitude); + const lng = Number(tags.GPSLongitude); + return !Number.isNaN(lat) && !Number.isNaN(lng) && (lat !== 0 || lng !== 0); } private getAutoStackId(tags: ImmichTags | null): string | null {