Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package qt6-positioning for openSUSE:Factory
checked in at 2026-08-21 16:50:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/qt6-positioning (Old)
and /work/SRC/openSUSE:Factory/.qt6-positioning.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qt6-positioning"
Fri Aug 21 16:50:57 2026 rev:37 rq:1372251 version:6.11.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/qt6-positioning/qt6-positioning.changes
2026-05-28 17:25:42.712670876 +0200
+++
/work/SRC/openSUSE:Factory/.qt6-positioning.new.1258/qt6-positioning.changes
2026-08-21 16:51:54.129943155 +0200
@@ -1,0 +2,6 @@
+Tue Aug 18 11:48:57 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 6.11.2
+ https://www.qt.io/blog/qt-6.11.2-released
+
+-------------------------------------------------------------------
Old:
----
qtpositioning-everywhere-src-6.11.1.tar.xz
New:
----
qtpositioning-everywhere-src-6.11.2.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ qt6-positioning.spec ++++++
--- /var/tmp/diff_new_pack.yFwgJc/_old 2026-08-21 16:51:55.343986324 +0200
+++ /var/tmp/diff_new_pack.yFwgJc/_new 2026-08-21 16:51:55.350986573 +0200
@@ -16,7 +16,7 @@
#
-%define real_version 6.11.1
+%define real_version 6.11.2
%define short_version 6.11
%define tar_name qtpositioning-everywhere-src
%define tar_suffix %{nil}
@@ -30,7 +30,7 @@
%global __requires_exclude qt6qmlimport\\(SatelliteInformation\\)
#
Name: qt6-positioning%{?pkg_suffix}
-Version: 6.11.1
+Version: 6.11.2
Release: 0
Summary: Qt 6 Positioning plugins and libraries
License: GPL-3.0-or-later
++++++ qtpositioning-everywhere-src-6.11.1.tar.xz ->
qtpositioning-everywhere-src-6.11.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtpositioning-everywhere-src-6.11.1/.cmake.conf
new/qtpositioning-everywhere-src-6.11.2/.cmake.conf
--- old/qtpositioning-everywhere-src-6.11.1/.cmake.conf 2026-05-08
03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/.cmake.conf 2026-08-12
03:33:50.000000000 +0200
@@ -1,4 +1,4 @@
-set(QT_REPO_MODULE_VERSION "6.11.1")
+set(QT_REPO_MODULE_VERSION "6.11.2")
set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
set(QT_EXTRA_INTERNAL_TARGET_DEFINES
@@ -6,5 +6,6 @@
"QT_NO_CONTEXTLESS_CONNECT=1"
"QT_NO_FOREACH=1"
"QT_NO_QASCONST=1"
+ "QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD=1"
"QT_NO_URL_CAST_FROM_STRING=1"
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtpositioning-everywhere-src-6.11.1/.tag
new/qtpositioning-everywhere-src-6.11.2/.tag
--- old/qtpositioning-everywhere-src-6.11.1/.tag 2026-05-08
03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/.tag 2026-08-12
03:33:50.000000000 +0200
@@ -1 +1 @@
-7ea5b529ea34b7baaeea5edfe0a1a6410bd14536
+f68ed52ba071c8c7030810ee91fdd186b7d9d9f7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/dependencies.yaml
new/qtpositioning-everywhere-src-6.11.2/dependencies.yaml
--- old/qtpositioning-everywhere-src-6.11.1/dependencies.yaml 2026-05-08
03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/dependencies.yaml 2026-08-12
03:33:50.000000000 +0200
@@ -1,10 +1,10 @@
dependencies:
../qtbase:
- ref: 59c81a3c2247b821b9b84b4eb8d939b77e07e276
+ ref: ef55f427f2c8b410d34f8a7681020a3000cf6866
required: true
../qtdeclarative:
- ref: a02bed441965ee1f18f856352c7d5ee5ba35d795
+ ref: 4e3399c26ec57246c08de019cfcbda8d23604cfa
required: false
../qtserialport:
- ref: 0bede6c85f1e504aa99844e9898289e0f13b7492
+ ref: 1bc5803a397f1f22b7b305a751f78ad1c6997cc4
required: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/CMakeLists.txt
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/CMakeLists.txt
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/CMakeLists.txt
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/CMakeLists.txt
2026-08-12 03:33:50.000000000 +0200
@@ -41,15 +41,13 @@
endif()
if (APPLE)
- # Using absolute path for shared plist files is a Ninja bug workaround
- get_filename_component(SHARED_PLIST_DIR
${CMAKE_CURRENT_SOURCE_DIR}/../shared ABSOLUTE)
if (IOS)
set_target_properties(satelliteinfo PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.ios.plist"
+ MACOSX_BUNDLE_INFO_PLIST
"${CMAKE_CURRENT_SOURCE_DIR}/Info.cmake.ios.plist"
)
else()
set_target_properties(satelliteinfo PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST
"${SHARED_PLIST_DIR}/Info.cmake.macos.plist"
+ MACOSX_BUNDLE_INFO_PLIST
"${CMAKE_CURRENT_SOURCE_DIR}/Info.cmake.macos.plist"
)
endif()
endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.cmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.cmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.cmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.cmake.ios.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleIdentifier</key>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleVersion</key>
+ <string>0.0.1</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.0.1</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>NSHumanReadableCopyright</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>Qt positioning example wants to access your location</string>
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.cmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.cmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.cmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.cmake.macos.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleName</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleVersion</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
+ <key>CFBundleIconFile</key>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>NSSupportsAutomaticGraphicsSwitching</key>
+ <true/>
+ <key>NSLocationUsageDescription</key>
+ <string>For Qt example demonstration purposes</string>
+
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.qmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.qmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.qmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.qmake.ios.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleIdentifier</key>
+ <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleVersion</key>
+ <string>0.0.1</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.0.1</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>NSHumanReadableCopyright</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>Qt positioning example wants to access your location</string>
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.qmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.qmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/Info.qmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/Info.qmake.macos.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+ <key>CFBundleName</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
+ <key>NSSupportsAutomaticGraphicsSwitching</key>
+ <true/>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleAllowMixedLocalizations</key>
+ <true/>
+ <key>NSLocationUsageDescription</key>
+ <string>For Qt example demonstrative purposes</string>
+ </dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/satelliteinfo.pro
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/satelliteinfo.pro
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/satelliteinfo/satelliteinfo.pro
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/satelliteinfo/satelliteinfo.pro
2026-08-12 03:33:50.000000000 +0200
@@ -74,8 +74,8 @@
RESOURCES += data_resources
-ios: QMAKE_INFO_PLIST = ../shared/Info.qmake.ios.plist
-macos: QMAKE_INFO_PLIST = ../shared/Info.qmake.macos.plist
+ios: QMAKE_INFO_PLIST = Info.qmake.ios.plist
+macos: QMAKE_INFO_PLIST = Info.qmake.macos.plist
android {
# explicitly link with serialport in order to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.cmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.cmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.cmake.ios.plist
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.cmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleIdentifier</key>
- <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
- <key>CFBundleExecutable</key>
- <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
- <key>CFBundleVersion</key>
- <string>0.0.1</string>
- <key>CFBundleShortVersionString</key>
- <string>0.0.1</string>
- <key>CFBundleGetInfoString</key>
- <string></string>
- <key>NSHumanReadableCopyright</key>
- <string></string>
- <key>CFBundleIconFile</key>
- <string>${MACOSX_BUNDLE_ICON_FILE}</string>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>LSRequiresIPhoneOS</key>
- <true/>
- <key>UILaunchStoryboardName</key>
- <string>LaunchScreen</string>
- <key>UISupportedInterfaceOrientations</key>
- <array>
- <string>UIInterfaceOrientationPortrait</string>
- <string>UIInterfaceOrientationPortraitUpsideDown</string>
- <string>UIInterfaceOrientationLandscapeLeft</string>
- <string>UIInterfaceOrientationLandscapeRight</string>
- </array>
- <key>NSLocationWhenInUseUsageDescription</key>
- <string>Qt positioning example wants to access your location</string>
-</dict>
-</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.cmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.cmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.cmake.macos.plist
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.cmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleName</key>
- <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
- <key>CFBundleExecutable</key>
- <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
- <key>CFBundleVersion</key>
- <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
- <key>CFBundleShortVersionString</key>
- <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
- <key>LSMinimumSystemVersion</key>
- <string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
- <key>NSHumanReadableCopyright</key>
- <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
- <key>CFBundleIconFile</key>
- <string>${MACOSX_BUNDLE_ICON_FILE}</string>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>NSSupportsAutomaticGraphicsSwitching</key>
- <true/>
- <key>NSLocationUsageDescription</key>
- <string>For Qt example demonstration purposes</string>
-
-</dict>
-</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.qmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.qmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.qmake.ios.plist
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.qmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleIdentifier</key>
- <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
- <key>CFBundleExecutable</key>
- <string>$(EXECUTABLE_NAME)</string>
- <key>CFBundleVersion</key>
- <string>0.0.1</string>
- <key>CFBundleShortVersionString</key>
- <string>0.0.1</string>
- <key>CFBundleGetInfoString</key>
- <string></string>
- <key>NSHumanReadableCopyright</key>
- <string></string>
- <key>CFBundleIconFile</key>
- <string></string>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>LSRequiresIPhoneOS</key>
- <true/>
- <key>UILaunchStoryboardName</key>
- <string>LaunchScreen</string>
- <key>UISupportedInterfaceOrientations</key>
- <array>
- <string>UIInterfaceOrientationPortrait</string>
- <string>UIInterfaceOrientationPortraitUpsideDown</string>
- <string>UIInterfaceOrientationLandscapeLeft</string>
- <string>UIInterfaceOrientationLandscapeRight</string>
- </array>
- <key>NSLocationWhenInUseUsageDescription</key>
- <string>Qt positioning example wants to access your location</string>
-</dict>
-</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.qmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.qmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/shared/Info.qmake.macos.plist
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/shared/Info.qmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIconFile</key>
- <string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
- <key>CFBundleName</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>LSMinimumSystemVersion</key>
- <string>${MACOSX_DEPLOYMENT_TARGET}</string>
- <key>NSPrincipalClass</key>
- <string>NSApplication</string>
- <key>CFBundleDevelopmentRegion</key>
- <string>$(DEVELOPMENT_LANGUAGE)</string>
- <key>NSSupportsAutomaticGraphicsSwitching</key>
- <true/>
- <key>CFBundleDevelopmentRegion</key>
- <string>en</string>
- <key>CFBundleAllowMixedLocalizations</key>
- <true/>
- <key>NSLocationUsageDescription</key>
- <string>For Qt example demonstrative purposes</string>
- </dict>
-</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/CMakeLists.txt
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/CMakeLists.txt
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/CMakeLists.txt
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/CMakeLists.txt
2026-08-12 03:33:50.000000000 +0200
@@ -34,15 +34,13 @@
)
if (APPLE)
- # Using absolute path for shared plist files is a Ninja bug workaround
- get_filename_component(SHARED_PLIST_DIR
${CMAKE_CURRENT_SOURCE_DIR}/../shared ABSOLUTE)
if (IOS)
set_target_properties(weatherinfo PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.ios.plist"
+ MACOSX_BUNDLE_INFO_PLIST
"${CMAKE_CURRENT_SOURCE_DIR}/Info.cmake.ios.plist"
)
else()
set_target_properties(weatherinfo PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST
"${SHARED_PLIST_DIR}/Info.cmake.macos.plist"
+ MACOSX_BUNDLE_INFO_PLIST
"${CMAKE_CURRENT_SOURCE_DIR}/Info.cmake.macos.plist"
)
endif()
endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.cmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.cmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.cmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.cmake.ios.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleIdentifier</key>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleVersion</key>
+ <string>0.0.1</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.0.1</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>NSHumanReadableCopyright</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>Qt positioning example wants to access your location</string>
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.cmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.cmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.cmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.cmake.macos.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleName</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleVersion</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
+ <key>CFBundleIconFile</key>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>NSSupportsAutomaticGraphicsSwitching</key>
+ <true/>
+ <key>NSLocationUsageDescription</key>
+ <string>For Qt example demonstration purposes</string>
+
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.qmake.ios.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.qmake.ios.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.qmake.ios.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.qmake.ios.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleIdentifier</key>
+ <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleVersion</key>
+ <string>0.0.1</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.0.1</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>NSHumanReadableCopyright</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>NSLocationWhenInUseUsageDescription</key>
+ <string>Qt positioning example wants to access your location</string>
+</dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.qmake.macos.plist
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.qmake.macos.plist
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/Info.qmake.macos.plist
1970-01-01 01:00:00.000000000 +0100
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/Info.qmake.macos.plist
2026-08-12 03:33:50.000000000 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+ <key>CFBundleName</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>$(DEVELOPMENT_LANGUAGE)</string>
+ <key>NSSupportsAutomaticGraphicsSwitching</key>
+ <true/>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleAllowMixedLocalizations</key>
+ <true/>
+ <key>NSLocationUsageDescription</key>
+ <string>For Qt example demonstrative purposes</string>
+ </dict>
+</plist>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/weatherinfo.pro
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/weatherinfo.pro
---
old/qtpositioning-everywhere-src-6.11.1/examples/positioning/weatherinfo/weatherinfo.pro
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/examples/positioning/weatherinfo/weatherinfo.pro
2026-08-12 03:33:50.000000000 +0200
@@ -48,8 +48,8 @@
RESOURCES += qml_resources
-ios: QMAKE_INFO_PLIST = ../shared/Info.qmake.ios.plist
-macos: QMAKE_INFO_PLIST = ../shared/Info.qmake.macos.plist
+ios: QMAKE_INFO_PLIST = Info.qmake.ios.plist
+macos: QMAKE_INFO_PLIST = Info.qmake.macos.plist
target.path = $$[QT_INSTALL_EXAMPLES]/positioning/weatherinfo
INSTALLS += target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/doc/src/plugins/nmea.qdoc
new/qtpositioning-everywhere-src-6.11.2/src/positioning/doc/src/plugins/nmea.qdoc
---
old/qtpositioning-everywhere-src-6.11.1/src/positioning/doc/src/plugins/nmea.qdoc
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/src/positioning/doc/src/plugins/nmea.qdoc
2026-08-12 03:33:50.000000000 +0200
@@ -93,6 +93,9 @@
locate one of the well-known serial devices (as if \c {nmea.source = serial:}
was specified).
+\warning The \c {socket://} scheme supports only unencrypted connection.
+Therefore it is only suitable for use within a host or over a trusted network.
+
\section1 Position source usage example
The following examples show how to create a \b nmea PositionSource
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopath.cpp
new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopath.cpp
--- old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopath.cpp
2026-05-08 03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopath.cpp
2026-08-12 03:33:50.000000000 +0200
@@ -11,7 +11,11 @@
#include "qwebmercator_p.h"
#include "qdoublevector2d_p.h"
-#include "qdoublevector3d_p.h"
+
+#include <QtCore/qmutex.h>
+
+#include <mutex>
+
QT_BEGIN_NAMESPACE
QT_IMPL_METATYPE_EXTERN(QGeoPath)
@@ -340,6 +344,8 @@
*
*******************************************************************************/
+Q_CONSTINIT static QBasicMutex globalPathMutex;
+
QGeoPathPrivateBase::QGeoPathPrivateBase()
: QGeoShapePrivate(QGeoShape::PathType)
{
@@ -351,6 +357,15 @@
setPath(path);
}
+QGeoPathPrivateBase::QGeoPathPrivateBase(const QGeoPathPrivateBase &other)
+ : QGeoShapePrivate(other),
+ m_path(other.m_path)
+{
+ // Do not copy cached members: they would need mutex locked!
+ // m_dirty is set to true by default, so that it'll properly trigger
+ // re-evaluation when needed.
+}
+
QGeoPathPrivateBase::~QGeoPathPrivateBase()
{
}
@@ -381,8 +396,7 @@
QGeoRectangle QGeoPathPrivateBase::boundingGeoRectangle() const
{
- if (m_bboxDirty)
- const_cast<QGeoPathPrivateBase *>(this)->computeBoundingBox();
+ ensureBoundingBoxUpdated();
return m_bbox;
}
@@ -437,7 +451,6 @@
// Need min/maxLati, so update bbox
QList<double> deltaXs;
double minX, maxX, minLati, maxLati;
- m_bboxDirty = false;
computeBBox(m_path, deltaXs, minX, maxX, minLati, maxLati, m_bbox);
if (degreesLatitude > 0.0)
@@ -449,7 +462,8 @@
p.setLongitude(QLocationUtils::wrapLong(p.longitude() +
degreesLongitude));
}
m_bbox.translate(degreesLatitude, degreesLongitude);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
+
+ m_bboxDirty.store(false, std::memory_order_release);
}
void QGeoPathPrivateBase::setPath(const QList<QGeoCoordinate> &path)
@@ -506,22 +520,25 @@
markDirty();
}
-void QGeoPathPrivateBase::computeBoundingBox()
+void QGeoPathPrivateBase::markDirty()
{
- QList<double> deltaXs;
- double minX, maxX, minLati, maxLati;
- m_bboxDirty = false;
- computeBBox(m_path, deltaXs, minX, maxX, minLati, maxLati, m_bbox);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
+ m_bboxDirty.store(true, std::memory_order_release);
}
-void QGeoPathPrivateBase::markDirty()
+void QGeoPathPrivateBase::ensureBoundingBoxUpdated() const
{
- m_bboxDirty = true;
+ if (m_bboxDirty.load(std::memory_order_acquire)) {
+ const std::scoped_lock lock(globalPathMutex);
+ if (m_bboxDirty.load(std::memory_order_acquire)) {
+ QList<double> deltaXs;
+ double minX, maxX, minLati, maxLati;
+ computeBBox(m_path, deltaXs, minX, maxX, minLati, maxLati, m_bbox);
+ m_bboxDirty.store(false, std::memory_order_release);
+ }
+ }
}
-
QGeoPathPrivate::QGeoPathPrivate()
: QGeoPathPrivateBase()
{
@@ -569,8 +586,7 @@
// possible, try that other wrap-position for it in a second pass.
// Should be redundant now, unless other functions rely on this one's
side-effect:
- if (m_bboxDirty)
- const_cast<QGeoPathPrivate &>(*this).computeBoundingBox();
+ ensureBoundingBoxUpdated();
double lineRadius = qMax(width() * 0.5, 0.2); // minimum radius: 20cm
@@ -670,13 +686,20 @@
QGeoPathPrivateEager::QGeoPathPrivateEager()
: QGeoPathPrivate()
{
- m_bboxDirty = false; // never dirty on the eager version
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
}
QGeoPathPrivateEager::QGeoPathPrivateEager(const QList<QGeoCoordinate> &path,
const qreal width)
: QGeoPathPrivate(path, width)
{
- m_bboxDirty = false; // never dirty on the eager version
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
+ markDirty(); // calculate the cached values
+}
+
+QGeoPathPrivateEager::QGeoPathPrivateEager(const QGeoPathPrivateEager &other)
+ : QGeoPathPrivate(other)
+{
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
markDirty(); // calculate the cached values
}
@@ -694,7 +717,6 @@
{
// do the calculations directly
computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati,
m_bbox);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
}
void QGeoPathPrivateEager::translate(double degreesLatitude, double
degreesLongitude)
@@ -710,7 +732,6 @@
m_bbox.translate(degreesLatitude, degreesLongitude);
m_minLati += degreesLatitude;
m_maxLati += degreesLatitude;
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
}
void QGeoPathPrivateEager::addCoordinate(const QGeoCoordinate &coordinate)
@@ -722,15 +743,9 @@
updateBoundingBox();
}
-void QGeoPathPrivateEager::QGeoPathPrivateEager::computeBoundingBox()
-{
- Q_UNREACHABLE();
-}
-
void QGeoPathPrivateEager::QGeoPathPrivateEager::updateBoundingBox()
{
updateBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati,
m_bbox);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
}
QGeoPathEager::QGeoPathEager() : QGeoPath()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopath_p.h
new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopath_p.h
--- old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopath_p.h
2026-05-08 03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopath_p.h
2026-08-12 03:33:50.000000000 +0200
@@ -142,6 +142,7 @@
public:
QGeoPathPrivateBase();
QGeoPathPrivateBase(const QList<QGeoCoordinate> &path);
+ QGeoPathPrivateBase(const QGeoPathPrivateBase &other);
~QGeoPathPrivateBase() override;
// QGeoShape API
@@ -166,14 +167,14 @@
virtual void replaceCoordinate(qsizetype index, const QGeoCoordinate
&coordinate);
virtual void removeCoordinate(const QGeoCoordinate &coordinate);
virtual void removeCoordinate(qsizetype index);
- virtual void computeBoundingBox();
virtual void markDirty();
+ void ensureBoundingBoxUpdated() const;
+
// data members
QList<QGeoCoordinate> m_path;
- QGeoRectangle m_bbox; // cached
- double m_leftBoundWrapped; // cached
- bool m_bboxDirty = false;
+ mutable QGeoRectangle m_bbox; // cached
+ mutable std::atomic<bool> m_bboxDirty = true; // default is dirty!
};
// Lazy by default. Eager, within the module, used only in
MapItems/MapObjectsQSG
@@ -206,6 +207,7 @@
public:
QGeoPathPrivateEager();
QGeoPathPrivateEager(const QList<QGeoCoordinate> &path, const qreal width
= 0.0);
+ QGeoPathPrivateEager(const QGeoPathPrivateEager &other);
~QGeoPathPrivateEager();
// QGeoShapePrivate API
@@ -215,7 +217,6 @@
void translate(double degreesLatitude, double degreesLongitude) override;
void markDirty() override;
void addCoordinate(const QGeoCoordinate &coordinate) override;
- void computeBoundingBox() override;
// *Eager API
void updateBoundingBox();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopolygon.cpp
new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopolygon.cpp
--- old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopolygon.cpp
2026-05-08 03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopolygon.cpp
2026-08-12 03:33:50.000000000 +0200
@@ -15,6 +15,10 @@
#include "qdoublevector3d_p.h"
#include "qwebmercator_p.h"
+#include <QtCore/qmutex.h>
+
+#include <mutex>
+
QT_BEGIN_NAMESPACE
QT_IMPL_METATYPE_EXTERN(QGeoPolygon)
@@ -420,6 +424,8 @@
*
*******************************************************************************/
+Q_CONSTINIT static QBasicMutex globalPolygonMutex;
+
QGeoPolygonPrivate::QGeoPolygonPrivate()
: QGeoPathPrivateBase()
{
@@ -432,6 +438,16 @@
type = QGeoShape::PolygonType;
}
+QGeoPolygonPrivate::QGeoPolygonPrivate(const QGeoPolygonPrivate &other)
+ : QGeoPathPrivateBase(other),
+ m_holesList(other.m_holesList)
+{
+ type = QGeoShape::PolygonType;
+ // Do not copy cached members: they would need mutex locked!
+ // m_clipperDirty is set to true by default, so that it'll properly trigger
+ // re-evaluation when needed.
+}
+
QGeoPolygonPrivate::~QGeoPolygonPrivate() {}
QGeoShapePrivate *QGeoPolygonPrivate::clone() const
@@ -481,11 +497,10 @@
// Need min/maxLati, so update bbox
QList<double> m_deltaXs;
double m_minX, m_maxX, m_minLati, m_maxLati;
- m_bboxDirty = false; // Updated in translatePoly
computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati,
m_bbox);
translatePoly(m_path, m_holesList, m_bbox, degreesLatitude,
degreesLongitude, m_maxLati, m_minLati);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
- m_clipperDirty = true;
+ m_bboxDirty.store(false, std::memory_order_release);
+ m_clipperDirty.store(true, std::memory_order_release);
}
bool QGeoPolygonPrivate::operator==(const QGeoShapePrivate &other) const
@@ -535,8 +550,7 @@
bool QGeoPolygonPrivate::polygonContains(const QGeoCoordinate &coordinate)
const
{
- if (m_clipperDirty)
- const_cast<QGeoPolygonPrivate *>(this)->updateClipperPath(); // this
one updates bbox too if needed
+ ensureClipperPathUpdated(); // this one updates bbox too if needed
QDoubleVector2D coord = QWebMercator::coordToMercator(coordinate);
@@ -559,34 +573,47 @@
void QGeoPolygonPrivate::markDirty()
{
- m_bboxDirty = m_clipperDirty = true;
+ QGeoPathPrivateBase::markDirty();
+ m_clipperDirty.store(true, std::memory_order_release);
}
-void QGeoPolygonPrivate::updateClipperPath()
+void QGeoPolygonPrivate::ensureClipperPathUpdated() const
{
- if (m_bboxDirty)
- computeBoundingBox();
- m_clipperDirty = false;
-
- QList<QDoubleVector2D> preservedPath;
- preservedPath.reserve(m_path.size());
- for (const QGeoCoordinate &c : std::as_const(m_path)) {
- QDoubleVector2D crd = QWebMercator::coordToMercator(c);
- if (crd.x() < m_leftBoundWrapped)
- crd.setX(crd.x() + 1.0);
- preservedPath << crd;
+ ensureBoundingBoxUpdated();
+ if (m_clipperDirty.load(std::memory_order_acquire)) {
+ const std::scoped_lock lock(globalPolygonMutex);
+ if (m_clipperDirty.load(std::memory_order_acquire)) {
+ m_leftBoundWrapped =
QWebMercator::coordToMercator(m_bbox.topLeft()).x();
+ QList<QDoubleVector2D> preservedPath;
+ preservedPath.reserve(m_path.size());
+ for (const QGeoCoordinate &c : std::as_const(m_path)) {
+ QDoubleVector2D crd = QWebMercator::coordToMercator(c);
+ if (crd.x() < m_leftBoundWrapped)
+ crd.setX(crd.x() + 1.0);
+ preservedPath << crd;
+ }
+ m_clipperWrapper.setPolygon(preservedPath);
+
+ m_clipperDirty.store(false, std::memory_order_release);
+ }
}
- m_clipperWrapper.setPolygon(preservedPath);
}
QGeoPolygonPrivateEager::QGeoPolygonPrivateEager() : QGeoPolygonPrivate()
{
- m_bboxDirty = false; // never dirty on the eager version
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
}
QGeoPolygonPrivateEager::QGeoPolygonPrivateEager(const QList<QGeoCoordinate>
&path) : QGeoPolygonPrivate(path)
{
- m_bboxDirty = false; // never dirty on the eager version
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
+ markDirty(); // calculate the cached values
+}
+
+QGeoPolygonPrivateEager::QGeoPolygonPrivateEager(const QGeoPolygonPrivateEager
&other)
+ : QGeoPolygonPrivate(other)
+{
+ m_bboxDirty.store(false, std::memory_order_relaxed); // never dirty on the
eager version
markDirty(); // calculate the cached values
}
@@ -603,16 +630,14 @@
void QGeoPolygonPrivateEager::translate(double degreesLatitude, double
degreesLongitude)
{
translatePoly(m_path, m_holesList, m_bbox, degreesLatitude,
degreesLongitude, m_maxLati, m_minLati);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
- m_clipperDirty = true;
+ m_clipperDirty.store(true, std::memory_order_release);
}
void QGeoPolygonPrivateEager::markDirty()
{
- m_clipperDirty = true;
+ m_clipperDirty.store(true, std::memory_order_release);
// do the calculations directly
computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati,
m_bbox);
- m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x();
}
void QGeoPolygonPrivateEager::addCoordinate(const QGeoCoordinate &coordinate)
@@ -620,15 +645,10 @@
if (!coordinate.isValid())
return;
m_path.append(coordinate);
- m_clipperDirty = true;
+ m_clipperDirty.store(true, std::memory_order_release);
updateBoundingBox(); // do not markDirty as it uses computeBoundingBox
instead
}
-void QGeoPolygonPrivateEager::computeBoundingBox()
-{
- Q_UNREACHABLE();
-}
-
void QGeoPolygonPrivateEager::updateBoundingBox()
{
updateBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati,
m_bbox);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopolygon_p.h
new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopolygon_p.h
--- old/qtpositioning-everywhere-src-6.11.1/src/positioning/qgeopolygon_p.h
2026-05-08 03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/src/positioning/qgeopolygon_p.h
2026-08-12 03:33:50.000000000 +0200
@@ -26,6 +26,7 @@
public:
QGeoPolygonPrivate();
QGeoPolygonPrivate(const QList<QGeoCoordinate> &path);
+ QGeoPolygonPrivate(const QGeoPolygonPrivate &other);
~QGeoPolygonPrivate();
// QGeoShape API
@@ -46,12 +47,13 @@
void addHole(const QList<QGeoCoordinate> &holePath);
void removeHole(qsizetype index);
- void updateClipperPath();
+ void ensureClipperPathUpdated() const;
// data members
- bool m_clipperDirty = true;
QList<QList<QGeoCoordinate>> m_holesList;
- QClipperUtils m_clipperWrapper;
+ mutable QClipperUtils m_clipperWrapper; // cached
+ mutable double m_leftBoundWrapped = 0.0; // cached
+ mutable std::atomic<bool> m_clipperDirty = true;
};
class Q_POSITIONING_EXPORT QGeoPolygonPrivateEager final : public
QGeoPolygonPrivate
@@ -59,6 +61,7 @@
public:
QGeoPolygonPrivateEager();
QGeoPolygonPrivateEager(const QList<QGeoCoordinate> &path);
+ QGeoPolygonPrivateEager(const QGeoPolygonPrivateEager &other);
~QGeoPolygonPrivateEager();
// QGeoShape API
@@ -68,7 +71,6 @@
// QGeoPath API
void markDirty() override;
void addCoordinate(const QGeoCoordinate &coordinate) override;
- void computeBoundingBox() override;
// QGeoPolygonPrivate API
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/src/positioning/qlocationutils.cpp
new/qtpositioning-everywhere-src-6.11.2/src/positioning/qlocationutils.cpp
--- old/qtpositioning-everywhere-src-6.11.1/src/positioning/qlocationutils.cpp
2026-05-08 03:19:03.000000000 +0200
+++ new/qtpositioning-everywhere-src-6.11.2/src/positioning/qlocationutils.cpp
2026-08-12 03:33:50.000000000 +0200
@@ -387,20 +387,26 @@
infos.clear();
return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
}
+
+ // The hard max limit for the number of sentences in one message is used
+ // to prevent malicious messages. The protocol does not seem to define any
+ // maximum, but this value provides an upper limit that is more than enough
+ // in practice.
+ static constexpr quint32 MaxTotalSentences = 250;
bool ok;
- const int totalSentences = parts.at(1).toInt(&ok);
- if (!ok) {
+ const quint32 totalSentences = parts.at(1).toUInt(&ok);
+ if (!ok || totalSentences > MaxTotalSentences) {
infos.clear();
return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
}
- const int sentence = parts.at(2).toInt(&ok);
- if (!ok) {
+ const quint32 sentence = parts.at(2).toUInt(&ok);
+ if (!ok || sentence > totalSentences) {
infos.clear();
return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
}
- const int totalSats = parts.at(3).toInt(&ok);
+ const quint32 totalSats = parts.at(3).toUInt(&ok);
if (!ok) {
infos.clear();
return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
@@ -408,15 +414,25 @@
if (sentence == 1)
infos.clear();
+ else if (infos.isEmpty()) // sentences out of order or DDoS spotted earlier
+ return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
+
+ static constexpr qsizetype MaxTotalSatellites = 1000;
+ const auto currentSatsSize = infos.size();
+ if (currentSatsSize > qint64(totalSats) || currentSatsSize >
MaxTotalSatellites) {
+ // Maybe DDoS: otherwise, probably something is wrong; reject, either
way.
+ infos.clear();
+ return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
+ }
- const int numSatInSentence = qMin(sentence * 4, totalSats) - (sentence -
1) * 4;
+ const qint64 numSatInSentence = qMin(sentence * 4, totalSats) - (sentence
- 1) * 4;
if (parts.size() < (4 + numSatInSentence * 4)) {
infos.clear();
return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence.
}
int field = 4;
- for (int i = 0; i < numSatInSentence; ++i) {
+ for (qint64 i = 0; i < numSatInSentence; ++i) {
QGeoSatelliteInfo info;
info.setSatelliteSystem(system);
int prn = parts.at(field++).toInt(&ok);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp
---
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp
2026-08-12 03:33:50.000000000 +0200
@@ -10,6 +10,8 @@
#include <QtCore/QElapsedTimer>
#include <QtCore/QtNumeric>
+using namespace Qt::StringLiterals;
+
#ifdef Q_OS_WIN
// Windows seems to require longer timeouts and step length
@@ -588,3 +590,295 @@
QTest::newRow("startUpdates(), bad second sentence") << bytes
<< (QList<QDateTime>() << firstDateTime << lastDateTime) <<
StartUpdatesMethod;
}
+
+void tst_QNmeaPositionInfoSource::getPositionInfoFromNmea_data()
+{
+ QTest::addColumn<QByteArray>("bytes");
+ QTest::addColumn<bool>("expectedResult");
+ QTest::addColumn<QGeoPositionInfo>("expectedPosInfo");
+
+ // Invalid common cases
+
+ const QTime tm(9, 9, 24);
+
+ QByteArray msg = QLocationTestUtils::createGgaSentence(tm).toLatin1();
+ msg.replace("$GPGGA", "$GPGXX");
+ QTest::addRow("unknown_type") << msg << false << QGeoPositionInfo();
+
+ msg = QLocationTestUtils::createGgaSentence(tm).toLatin1();
+ char &crc = msg[msg.size() - 3];
+ crc ^= 0xFF; // XOR the CRC byte
+ QTest::addRow("wrong_CRC") << msg << false << QGeoPositionInfo();
+
+ msg = QLocationTestUtils::createGgaSentence(tm).toLatin1();
+ msg.replace("$GPGGA", "$GGA");
+ QTest::addRow("missing_talker_id") << msg << false << QGeoPositionInfo();
+
+ msg = QLocationTestUtils::createGgaSentence(tm).toLatin1();
+ msg.removeFirst();
+ QTest::addRow("invalid_start") << msg << false << QGeoPositionInfo();
+
+ msg = QLocationTestUtils::createGgaSentence(tm).toLatin1().chopped(4);
+ QTest::addRow("no_checksum") << msg << false << QGeoPositionInfo();
+
+ // Malformed data in GGA
+
+ QGeoPositionInfo info;
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+ QTest::addRow("GGA_wrong_lat_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,2734.76859,X,15305.99361,E,1,04,,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+ QTest::addRow("GGA_wrong_lon_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,2734.76859,S,15305.99361,X,1,04,,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+ QTest::addRow("GGA_malformed_lat")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,abc76859,S,15305.99361,E,1,04,,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+ QTest::addRow("GGA_malformed_lon")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,2734.76859,S,15305.def,E,1,04,,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime());
+ info.setCoordinate(QGeoCoordinate(-27.5794765, 153.0998935, 49.4));
+ QTest::addRow("GGA_malformed_time")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,1234time,2734.76859,S,15305.99361,E,1,04,,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+ QTest::addRow("GGA_malformed_hdop")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,2734.76859,S,15305.99361,E,1,04,hdop,49.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setCoordinate(QGeoCoordinate(-27.5794765, 153.0998935)); // no alt
+ QTest::addRow("GGA_malformed_alt")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGGA,090924.000,2734.76859,S,15305.99361,E,1,04,,4b.4,M,,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ // Malformed data in GSA
+
+ info = QGeoPositionInfo();
+
+ QTest::addRow("GSA_malformed_hdop")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPGSA,A,3,,,,,,,,,,,,,3.0,foo,*"_L1).toLatin1()
+ << true
+ << info;
+
+ info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, 2.0);
+ QTest::addRow("GSA_malformed_vdop")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPGSA,A,3,,,,,,,,,,,,,3.0,1.0,foo,*"_L1).toLatin1()
+ << true
+ << info;
+
+ // Malformed data in GLL
+
+ info = QGeoPositionInfo();
+ info.setCoordinate(QGeoCoordinate(-27.5794765, 153.0998935));
+
+ QTest::addRow("GLL_malformed_timestamp")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GNGLL,2734.76859,S,15305.99361,E,09092,A,D*"_L1).toLatin1()
+ << true
+ << info;
+
+ info.setCoordinate(QGeoCoordinate());
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+
+ QTest::addRow("GLL_wrong_lat_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GNGLL,2734.76859,W,15305.99361,E,090924,A,D*"_L1).toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("GLL_wrong_lon_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GNGLL,2734.76859,S,15305.99361,N,090924,A,D*"_L1).toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("GLL_malformed_lat")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GNGLL,27a4.7b8c9,S,15305.99361,E,090924,A,D*"_L1).toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("GLL_malformed_lon")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GNGLL,2734.76859,S,15d0e.f9361,E,090924,A,D*"_L1).toLatin1()
+ << true
+ << info;
+
+ // Malformed data in RMC
+
+ info = QGeoPositionInfo();
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+
+ QTest::addRow("RMC_malformed_short_date")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPRMC,090924.000,A,,,,,,,12345,,,*"_L1).toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime(QDate(2025, 5, 4), QTime(), QTimeZone::UTC));
+
+ QTest::addRow("RMC_malformed_time")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPRMC,abcdef.xyz,A,,,,,,,040525,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime(QDate(2025, 5, 4), tm, QTimeZone::UTC));
+
+ QTest::addRow("RMC_wrong_lat_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,X,15305.99361,E,,,040525,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("RMC_wrong_lon_dir")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,S,15305.99361,X,,,040525,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("RMC_malformed_lat")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,abcde.fghij,S,15305.99361,E,,,040525,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("RMC_malformed_lon")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,S,abcde.fghij,E,,,040525,,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setCoordinate(QGeoCoordinate(-27.5794765, 153.0998935));
+ info.setAttribute(QGeoPositionInfo::Direction, 45.0);
+
+ QTest::addRow("RMC_malformed_speed")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,S,15305.99361,E,abc,45.0,040525,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.removeAttribute(QGeoPositionInfo::Direction);
+ info.setAttribute(QGeoPositionInfo::GroundSpeed, qreal(0.7 * 1.852 / 3.6));
+
+ QTest::addRow("RMC_malformed_bearing")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,S,15305.99361,E,0.7,abc,040525,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.removeAttribute(QGeoPositionInfo::GroundSpeed);
+
+ QTest::addRow("RMC_malformed_mag_var")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPRMC,090924.000,A,2734.76859,S,15305.99361,E,,,040525,abc,E*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ // Malformed data in VTG
+
+ info = QGeoPositionInfo();
+ info.setAttribute(QGeoPositionInfo::Direction, 8.4);
+
+ QTest::addRow("VTG_malformed_speed")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GNVTG,8.4,T,,M,1.3,N,abc,K,D*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info = QGeoPositionInfo();
+ info.setAttribute(QGeoPositionInfo::GroundSpeed, 5.7 / 3.6);
+
+ QTest::addRow("VTG_malformed_direction")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GNVTG,abc,T,,M,1.3,N,5.7,K,D*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ // Malformed data in ZDA
+
+ info = QGeoPositionInfo();
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+
+ QTest::addRow("ZDA_short_year")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPZDA,090924.000,04,05,25,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime(QDate(2025, 5, 4), QTime(), QTimeZone::UTC));
+
+ QTest::addRow("ZDA_invalid_time")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPZDA,abc,04,05,2025,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ info.setTimestamp(QDateTime(QDate(), tm, QTimeZone::UTC));
+
+ QTest::addRow("ZDA_malformed_day")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPZDA,090924.000,abc,05,2025,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+
+ QTest::addRow("ZDA_malformed_month")
+ << QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPZDA,090924.000,04,abc,2025,,*"_L1)
+ .toLatin1()
+ << true
+ << info;
+}
+
+void tst_QNmeaPositionInfoSource::getPositionInfoFromNmea()
+{
+ QFETCH(const QByteArray, bytes);
+ QFETCH(const bool, expectedResult);
+ QFETCH(const QGeoPositionInfo, expectedPosInfo);
+
+ QGeoPositionInfo info;
+ TestNmeaPosInfoSource source(m_mode);
+ const bool res = source.getPosInfoFromNmea(bytes, info);
+
+ QCOMPARE_EQ(res, expectedResult);
+ QCOMPARE_EQ(info, expectedPosInfo);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h
---
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h
2026-08-12 03:33:50.000000000 +0200
@@ -89,6 +89,9 @@
void testWithBadNmea();
void testWithBadNmea_data();
+ void getPositionInfoFromNmea_data();
+ void getPositionInfoFromNmea();
+
private:
QNmeaPositionInfoSource::UpdateMode m_mode;
};
@@ -155,3 +158,23 @@
return 1024 + QIODevice::bytesAvailable();
}
};
+
+//---------------------------------------------------
+
+class TestNmeaPosInfoSource : public QNmeaPositionInfoSource
+{
+ Q_OBJECT
+
+public:
+ TestNmeaPosInfoSource(UpdateMode mode) : QNmeaPositionInfoSource(mode)
+ {
+ setUserEquivalentRangeError(1.0);
+ }
+ ~TestNmeaPosInfoSource() override = default;
+
+ bool getPosInfoFromNmea(QByteArrayView bytes, QGeoPositionInfo &info)
+ {
+ bool hasFix = false;
+ return parsePosInfoFromNmeaData(bytes, &info, &hasFix);
+ }
+};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp
---
old/qtpositioning-everywhere-src-6.11.1/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp
2026-05-08 03:19:03.000000000 +0200
+++
new/qtpositioning-everywhere-src-6.11.2/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp
2026-08-12 03:33:50.000000000 +0200
@@ -151,6 +151,8 @@
QFETCH(QList<QGeoSatelliteInfo>, desiredInUse);
QNmeaSatelliteInfoSource source(mode);
+ if (mode == QNmeaSatelliteInfoSource::UpdateMode::SimulationMode)
+
QVERIFY(source.setBackendProperty(QNmeaSatelliteInfoSource::SimulationUpdateInterval,
10));
auto feeder = new DataFeeder(&source);
source.setDevice(feeder);
@@ -161,15 +163,18 @@
source.startUpdates();
feeder->setMessages(messages);
- QTRY_VERIFY_WITH_TIMEOUT(messageSentSpy.size() == messages.size(), 2000);
- QVERIFY(!inViewSpy.isEmpty());
- QVERIFY(!inUseSpy.isEmpty());
+ QTRY_VERIFY_WITH_TIMEOUT(messageSentSpy.size() == messages.size(), 10000);
- const auto inView =
inViewSpy.back().at(0).value<QList<QGeoSatelliteInfo>>();
- QCOMPARE(inView, desiredInView);
-
- const auto inUse = inUseSpy.back().at(0).value<QList<QGeoSatelliteInfo>>();
- QCOMPARE(inUse, desiredInUse);
+ if (!desiredInView.isEmpty()) {
+ QVERIFY(!inViewSpy.isEmpty());
+ const auto inView =
inViewSpy.back().at(0).value<QList<QGeoSatelliteInfo>>();
+ QCOMPARE(inView, desiredInView);
+ }
+ if (!desiredInUse.isEmpty()) {
+ QVERIFY(!inUseSpy.isEmpty());
+ const auto inUse =
inUseSpy.back().at(0).value<QList<QGeoSatelliteInfo>>();
+ QCOMPARE(inUse, desiredInUse);
+ }
}
void tst_QNmeaSatelliteInfoSource::parseDataStream_data()
@@ -511,6 +516,94 @@
gnComplexGlnsGsaMessage,
gnComplexBduGsaMessage,
complexGpsGsvMessage1,
complexGpsGsvMessage2 }
<< complexGpsGlnsBduInView << complexGpsGlnsBduInUse;
+
+ // Malformed input data
+
+ struct ModeInfo {
+ QNmeaSatelliteInfoSource::UpdateMode mode;
+ QByteArray name;
+ };
+
+ const std::array<ModeInfo, 2> modes = {
+ ModeInfo{ QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode,
"realtime" },
+ ModeInfo{ QNmeaSatelliteInfoSource::UpdateMode::SimulationMode,
"simulation" },
+ };
+
+ for (const auto &mode : modes) {
+ const auto gpsGsvNegativeTotalNumMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,-1,1,4,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+ const auto emptyGpsGsaMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+ "$GPGSA,A,1,,,,,,,,,,,,,50.95,50.94,1.00*").toLatin1();
+
+ QTest::addRow("%s GPS negative total messages", mode.name.data())
+ << mode.mode
+ << QList<QByteArray>{ gpsGsvNegativeTotalNumMessage,
emptyGpsGsaMessage }
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+
+ const auto gpsGsvFirstMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,10,1,8,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+ const auto gpsGsvNegativeSentenceNumMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,10,-1,8,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+
+ QTest::addRow("%s GPS negative sentence num", mode.name.data())
+ << mode.mode
+ << QList<QByteArray>{ gpsGsvFirstMessage,
+ gpsGsvNegativeSentenceNumMessage,
+ emptyGpsGsaMessage }
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+
+ const auto gpsGsvNegativeTotalSatMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,10,1,-4,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+ QTest::addRow("%s GPS negative total satellite num", mode.name.data())
+ << mode.mode
+ << QList<QByteArray>{ gpsGsvNegativeTotalSatMessage,
+ emptyGpsGsaMessage }
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+
+ const auto gpsGsvSentenceGreaterThanTotalMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,10,11,8,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+
+ QTest::addRow("%s GPS sentence num greater than total num",
mode.name.data())
+ << mode.mode
+ << QList<QByteArray>{ gpsGsvFirstMessage,
+ gpsGsvSentenceGreaterThanTotalMessage,
+ emptyGpsGsaMessage }
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+
+ const auto gpsGsvTooLargeTotalNumMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,1001,1,4,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+ QTest::addRow("%s GPS total messages too large", mode.name.data())
+ << mode.mode
+ << QList<QByteArray>{ gpsGsvTooLargeTotalNumMessage,
+ emptyGpsGsaMessage }
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+
+ const auto gpsGsvSecondMessage =
+ QLocationTestUtils::addNmeaChecksumAndBreaks(
+
"$GPGSV,10,2,2000,05,,,25,07,,,,08,,,,13,,,36*").toLatin1();
+
+ // Craft a message that repeatedly sends the second sentence, thus
+ // potentially triggering an OOM condition by endlessly accumulating
+ // the list of parsed satellites. In this test we send only 300
+ // sentences, that represents 1200 satellites.
+ // We should stop after 1000 accumulated satellites, clear the list and
+ // discard all follow-up messages.
+ QList<QByteArray> repeatedSecondMessage = { gpsGsvFirstMessage };
+ repeatedSecondMessage.append(QList<QByteArray>(300,
gpsGsvSecondMessage));
+ repeatedSecondMessage.append(emptyGpsGsaMessage);
+
+ QTest::addRow("%s GPS repeated sentence DDoS", mode.name.data())
+ << mode.mode
+ << repeatedSecondMessage
+ << QList<QGeoSatelliteInfo>() << QList<QGeoSatelliteInfo>();
+ }
}
QGeoSatelliteInfo