diff options
| -rw-r--r-- | dist/changes-5.14.2 | 117 | ||||
| -rw-r--r-- | mkspecs/features/qt_helper_lib.prf | 2 | ||||
| -rw-r--r-- | src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch | 203 | ||||
| -rw-r--r-- | src/3rdparty/sqlite/sqlite3.c | 31 | ||||
| -rw-r--r-- | src/corelib/global/qlibraryinfo.cpp | 14 | ||||
| -rw-r--r-- | src/network/ssl/qsslsocket_openssl_symbols.cpp | 18 | ||||
| -rw-r--r-- | src/platformsupport/glxconvenience/qglxconvenience.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp | 1 | ||||
| -rw-r--r-- | src/tools/androiddeployqt/main.cpp | 5 | ||||
| -rw-r--r-- | src/widgets/kernel/qtooltip.cpp | 8 | ||||
| -rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 2 | 
11 files changed, 377 insertions, 26 deletions
diff --git a/dist/changes-5.14.2 b/dist/changes-5.14.2 new file mode 100644 index 00000000000..df3cabe3bf5 --- /dev/null +++ b/dist/changes-5.14.2 @@ -0,0 +1,117 @@ +Qt 5.14.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.14.0 through 5.14.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +*                                  QtCore                                  * +**************************************************************************** + + - QCollator: +   * QTBUG-81673: Fixed a regression introduced in 5.14.0 that caused +     QCollator not to operate with default-constructed QStrings and print a +     warning on Windows. + + - QString, codecs: +   * QTBUG-62011: ZWNBS is no longer discarded (mistaken for a BOM despite +     not being at the start) when converting UCS4 to QString's UCS2. + + - QLocale: +   * QTBUG-80459: Skip digit-grouping if the system locale is configured to +     use an empty group separator. +   * QTBUG-81530: Use "+" if MS reports empty for the system locale's plus +     sign, as documented in MS's API for the relevant query. + + - QLockFile: +   * Suppressed the warning on QNX that said 'setNativeLocks failed: +     "Function not implemented"'. There is no difference in behavior: Qt +     will continue not to be able to apply an OS- level file lock, which +     means the lock could be accidentally stolen by buggy software. Correct +     software using QLockFile should not be affected. + + - QObject: +   * For the purposes of QT_NO_NARROWING_CONVERSIONS_IN_CONNECT, pointer +     (incl. pointer-to-member) to bool conversions are now considered +     narrowing. This matches the resolution of a defect report in C++ +     itself. + + - QStorageInfo: +   * Improved discovery of device nodes on Linux if the /dev entry was +     renamed after the filesystem was mounted and udev is in use. + +**************************************************************************** +*                                  QtGui                                   * +**************************************************************************** + + - QTextMarkdownImporter: +   * Text in Markdown format is assumed to be UTF-8. +   * The "title" in a Markdown hyperlink is now used as the tooltip, +     not the anchor name. +   * Fixed vulnerability oss-fuzz-20450 (invalid input resulted in an +     attempt to insert items into a list that no longer exists). + +**************************************************************************** +*                                QtWidgets                                 * +**************************************************************************** + + - QLineEdit: +   * the inputMask property has allowed any Letter or Number category +     character for the respective mask characters, not just ASCII. The +     documentation has been updated accordingly. + +**************************************************************************** +*                                  qmake                                   * +**************************************************************************** + + - To remove the NDEBUG define that is added by default in MSVC mkspecs, +   write DEFINES_RELEASE -= NDEBUG in your .pro file. + - Install/uninstall rules are now generated for target.targets on Windows. +   This mirrors the behavior on Unix. + +**************************************************************************** +*                             Third-Party Code                             * +**************************************************************************** + + - md4c was updated to 0.4.3. This fixes vulnerability oss-fuzz-20580. + + - QtSQL, sqlite: +   * Updated to v3.31.1 +   * [QTBUG-82533] Fixed CVE-2020-9327 + +**************************************************************************** +*                                  CMake                                   * +**************************************************************************** + + - Windows: +   * Fixed linking with Qt static build + +**************************************************************************** +*                                   MSVC                                   * +**************************************************************************** + + - Fixed a compatibility issue found when linking code compiled with +   version 16.6 to a Qt compiled with 16.5. + +**************************************************************************** +*                                   MinGW                                  * +**************************************************************************** + + - Fixed build regressions. + - The -debug-and-release configuration has been fixed. In this +   configuration, Qt libraries again have a 'd' suffix. + - In the -debug configuration, libraries do not have a 'd' suffix, similar +   to Unix platforms. diff --git a/mkspecs/features/qt_helper_lib.prf b/mkspecs/features/qt_helper_lib.prf index 8a9672e6036..2bb01515be8 100644 --- a/mkspecs/features/qt_helper_lib.prf +++ b/mkspecs/features/qt_helper_lib.prf @@ -60,7 +60,7 @@ win32|CONFIG(static, static|shared) {          "QMAKE_DEFINES_$${ucmodule} = $$val_escape(MODULE_DEFINES)"      android {          MODULE_PRI_CONT += "QMAKE_LIBS_$${ucmodule} =" -    } else: qtConfig(debug_and_release): { +    } else: if(msvc|qtConfig(debug_and_release)): {          win32: \              MODULE_DEBUG_LIBS = $$DESTDIR/$$prefix$${TARGET}d.$$suffix          else: darwin: \ diff --git a/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch b/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch new file mode 100644 index 00000000000..4fbb2ee3397 --- /dev/null +++ b/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch @@ -0,0 +1,203 @@ +From 63566d1fff2665b777650594eec6eefd3587e177 Mon Sep 17 00:00:00 2001 +From: Andy Shaw <[email protected]> +Date: Wed, 4 Mar 2020 07:44:22 +0100 +Subject: [PATCH] Fix CVE-2020-9327 in SQLite + +This was taken from abc473fb8fb99900 in SQLite, ref: +https://www.sqlite.org/cgi/src/info/abc473fb8fb99900 + +Fixes: QTBUG-82533 +Change-Id: I9840e29f19a0b861229987f5b59d8585ba2e55dc +--- + .../0001-Fix-CVE-2020-9327-in-SQLite.patch    | 96 +++++++++++++++++++ + src/3rdparty/sqlite/sqlite3.c                 | 31 ++++-- + 2 files changed, 118 insertions(+), 9 deletions(-) + create mode 100644 src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch + +diff --git a/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch b/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch +new file mode 100644 +index 0000000000..e0e8206db5 +--- /dev/null ++++ b/src/3rdparty/sqlite/patches/0001-Fix-CVE-2020-9327-in-SQLite.patch +@@ -0,0 +1,96 @@ ++From f79860e0fe251e3267a3cd5558dce98f918e0caa Mon Sep 17 00:00:00 2001 ++From: Andy Shaw <[email protected]> ++Date: Wed, 4 Mar 2020 07:44:22 +0100 ++Subject: [PATCH] Fix CVE-2020-9327 in SQLite ++ ++Fixes: QTBUG-82533 ++Change-Id: I9840e29f19a0b861229987f5b59d8585ba2e55dc ++--- ++ src/3rdparty/sqlite/sqlite3.c | 31 ++++++++++++++++++++++--------- ++ 1 file changed, 22 insertions(+), 9 deletions(-) ++ ++diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c ++index 55dc686ee0..dfe5323a59 100644 ++--- a/src/3rdparty/sqlite/sqlite3.c +++++ b/src/3rdparty/sqlite/sqlite3.c ++@@ -17428,8 +17428,11 @@ struct Table { ++ */ ++ #ifndef SQLITE_OMIT_VIRTUALTABLE ++ #  define IsVirtual(X)      ((X)->nModuleArg) +++#  define ExprIsVtab(X)  \ +++              ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg) ++ #else ++ #  define IsVirtual(X)      0 +++#  define ExprIsVtab(X)     0 ++ #endif ++  ++ /* ++@@ -104133,19 +104136,25 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ++     case TK_LT: ++     case TK_LE: ++     case TK_GT: ++-    case TK_GE: +++    case TK_GE: { +++      Expr *pLeft = pExpr->pLeft; +++      Expr *pRight = pExpr->pRight; ++       testcase( pExpr->op==TK_EQ ); ++       testcase( pExpr->op==TK_NE ); ++       testcase( pExpr->op==TK_LT ); ++       testcase( pExpr->op==TK_LE ); ++       testcase( pExpr->op==TK_GT ); ++       testcase( pExpr->op==TK_GE ); ++-      if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) ++-       || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) +++      /* The y.pTab=0 assignment in wherecode.c always happens after the +++      ** impliesNotNullRow() test */ +++      if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) +++                               && IsVirtual(pLeft->y.pTab)) +++       || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) +++                               && IsVirtual(pRight->y.pTab)) ++       ){ ++-       return WRC_Prune; +++        return WRC_Prune; ++       } ++- +++    } ++     default: ++       return WRC_Continue; ++   } ++@@ -142591,7 +142600,8 @@ static int isAuxiliaryVtabOperator( ++     **       MATCH(expression,vtab_column) ++     */ ++     pCol = pList->a[1].pExpr; ++-    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ +++    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); +++    if( ExprIsVtab(pCol) ){ ++       for(i=0; i<ArraySize(aOp); i++){ ++         if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){ ++           *peOp2 = aOp[i].eOp2; ++@@ -142613,7 +142623,8 @@ static int isAuxiliaryVtabOperator( ++     ** with function names in an arbitrary case. ++     */ ++     pCol = pList->a[0].pExpr; ++-    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ +++    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); +++    if( ExprIsVtab(pCol) ){ ++       sqlite3_vtab *pVtab; ++       sqlite3_module *pMod; ++       void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); ++@@ -142636,10 +142647,12 @@ static int isAuxiliaryVtabOperator( ++     int res = 0; ++     Expr *pLeft = pExpr->pLeft; ++     Expr *pRight = pExpr->pRight; ++-    if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){ +++    testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); +++    if( ExprIsVtab(pLeft) ){ ++       res++; ++     } ++-    if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){ +++    testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); +++    if( pRight && ExprIsVtab(pRight) ){ ++       res++; ++       SWAP(Expr*, pLeft, pRight); ++     } ++--  ++2.21.0 (Apple Git-122.2) ++ +diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c +index 55dc686ee0..dfe5323a59 100644 +--- a/src/3rdparty/sqlite/sqlite3.c ++++ b/src/3rdparty/sqlite/sqlite3.c +@@ -17428,8 +17428,11 @@ struct Table { + */ + #ifndef SQLITE_OMIT_VIRTUALTABLE + #  define IsVirtual(X)      ((X)->nModuleArg) ++#  define ExprIsVtab(X)  \ ++              ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg) + #else + #  define IsVirtual(X)      0 ++#  define ExprIsVtab(X)     0 + #endif +  + /* +@@ -104133,19 +104136,25 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ +     case TK_LT: +     case TK_LE: +     case TK_GT: +-    case TK_GE: ++    case TK_GE: { ++      Expr *pLeft = pExpr->pLeft; ++      Expr *pRight = pExpr->pRight; +       testcase( pExpr->op==TK_EQ ); +       testcase( pExpr->op==TK_NE ); +       testcase( pExpr->op==TK_LT ); +       testcase( pExpr->op==TK_LE ); +       testcase( pExpr->op==TK_GT ); +       testcase( pExpr->op==TK_GE ); +-      if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) +-       || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) ++      /* The y.pTab=0 assignment in wherecode.c always happens after the ++      ** impliesNotNullRow() test */ ++      if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) ++                               && IsVirtual(pLeft->y.pTab)) ++       || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) ++                               && IsVirtual(pRight->y.pTab)) +       ){ +-       return WRC_Prune; ++        return WRC_Prune; +       } +- ++    } +     default: +       return WRC_Continue; +   } +@@ -142591,7 +142600,8 @@ static int isAuxiliaryVtabOperator( +     **       MATCH(expression,vtab_column) +     */ +     pCol = pList->a[1].pExpr; +-    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ ++    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); ++    if( ExprIsVtab(pCol) ){ +       for(i=0; i<ArraySize(aOp); i++){ +         if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){ +           *peOp2 = aOp[i].eOp2; +@@ -142613,7 +142623,8 @@ static int isAuxiliaryVtabOperator( +     ** with function names in an arbitrary case. +     */ +     pCol = pList->a[0].pExpr; +-    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ ++    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); ++    if( ExprIsVtab(pCol) ){ +       sqlite3_vtab *pVtab; +       sqlite3_module *pMod; +       void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); +@@ -142636,10 +142647,12 @@ static int isAuxiliaryVtabOperator( +     int res = 0; +     Expr *pLeft = pExpr->pLeft; +     Expr *pRight = pExpr->pRight; +-    if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){ ++    testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); ++    if( ExprIsVtab(pLeft) ){ +       res++; +     } +-    if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){ ++    testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); ++    if( pRight && ExprIsVtab(pRight) ){ +       res++; +       SWAP(Expr*, pLeft, pRight); +     } +--  +2.21.0 (Apple Git-122.2) + diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c index 55dc686ee06..dfe5323a594 100644 --- a/src/3rdparty/sqlite/sqlite3.c +++ b/src/3rdparty/sqlite/sqlite3.c @@ -17428,8 +17428,11 @@ struct Table {  */  #ifndef SQLITE_OMIT_VIRTUALTABLE  #  define IsVirtual(X)      ((X)->nModuleArg) +#  define ExprIsVtab(X)  \ +              ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg)  #else  #  define IsVirtual(X)      0 +#  define ExprIsVtab(X)     0  #endif  /* @@ -104133,19 +104136,25 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){      case TK_LT:      case TK_LE:      case TK_GT: -    case TK_GE: +    case TK_GE: { +      Expr *pLeft = pExpr->pLeft; +      Expr *pRight = pExpr->pRight;        testcase( pExpr->op==TK_EQ );        testcase( pExpr->op==TK_NE );        testcase( pExpr->op==TK_LT );        testcase( pExpr->op==TK_LE );        testcase( pExpr->op==TK_GT );        testcase( pExpr->op==TK_GE ); -      if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) -       || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) +      /* The y.pTab=0 assignment in wherecode.c always happens after the +      ** impliesNotNullRow() test */ +      if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) +                               && IsVirtual(pLeft->y.pTab)) +       || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) +                               && IsVirtual(pRight->y.pTab))        ){ -       return WRC_Prune; +        return WRC_Prune;        } - +    }      default:        return WRC_Continue;    } @@ -142591,7 +142600,8 @@ static int isAuxiliaryVtabOperator(      **       MATCH(expression,vtab_column)      */      pCol = pList->a[1].pExpr; -    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ +    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); +    if( ExprIsVtab(pCol) ){        for(i=0; i<ArraySize(aOp); i++){          if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){            *peOp2 = aOp[i].eOp2; @@ -142613,7 +142623,8 @@ static int isAuxiliaryVtabOperator(      ** with function names in an arbitrary case.      */      pCol = pList->a[0].pExpr; -    if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ +    testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 ); +    if( ExprIsVtab(pCol) ){        sqlite3_vtab *pVtab;        sqlite3_module *pMod;        void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); @@ -142636,10 +142647,12 @@ static int isAuxiliaryVtabOperator(      int res = 0;      Expr *pLeft = pExpr->pLeft;      Expr *pRight = pExpr->pRight; -    if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){ +    testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 ); +    if( ExprIsVtab(pLeft) ){        res++;      } -    if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){ +    testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 ); +    if( pRight && ExprIsVtab(pRight) ){        res++;        SWAP(Expr*, pLeft, pRight);      } diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 835fea0c77f..f1d7832e468 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -661,7 +661,7 @@ static QString getHostPrefixFromHostBinDir()  #endif  #ifndef QT_BUILD_QMAKE_BOOTSTRAP -static const char *getPrefix( +static QString getPrefix(  #ifdef QT_BUILD_QMAKE          QLibraryInfo::PathGroup group  #endif @@ -670,15 +670,13 @@ static const char *getPrefix(  #if defined(QT_BUILD_QMAKE)  #  if QT_CONFIGURE_CROSSBUILD      if (group == QLibraryInfo::DevicePaths) -        return QT_CONFIGURE_PREFIX_PATH; +        return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);  #  endif -    static QByteArray extPrefixPath = getExtPrefixFromHostBinDir().toLatin1(); -    return extPrefixPath.constData(); +    return getExtPrefixFromHostBinDir();  #elif QT_CONFIG(relocatable) -    static QByteArray prefixPath = getRelocatablePrefix().toLatin1(); -    return prefixPath.constData(); +    return getRelocatablePrefix();  #else -    return QT_CONFIGURE_PREFIX_PATH; +    return QString::fromLocal8Bit(QT_CONFIGURE_PREFIX_PATH);  #endif  }  #endif // QT_BUILD_QMAKE_BOOTSTRAP @@ -799,7 +797,7 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)          // strlen is meaningless.          const char * volatile path = nullptr;          if (loc == PrefixPath) { -            path = getPrefix( +            ret = getPrefix(  #ifdef QT_BUILD_QMAKE                          group  #endif diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index 84422e9c8f3..6fe602a79ec 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -1187,6 +1187,9 @@ QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime)  {      size_t lTimeLength = aTime->length;      char *pString = (char *) aTime->data; +    auto isValidPointer = [pString, lTimeLength](const char *const probe){ +        return size_t(probe - pString) < lTimeLength; +    };      if (aTime->type == V_ASN1_UTCTIME) { @@ -1205,12 +1208,21 @@ QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime)              *pBuffer++ = '0';          } else {              *pBuffer++ = *pString++; +            if (!isValidPointer(pString)) // Nah. +                return {};              *pBuffer++ = *pString++; +            if (!isValidPointer(pString)) // Nah. +                return {};              // Skip any fractional seconds...              if (*pString == '.') {                  pString++; -                while ((*pString >= '0') && (*pString <= '9')) +                if (!isValidPointer(pString)) // Oh no, cannot dereference (see below). +                    return {}; +                while ((*pString >= '0') && (*pString <= '9')) {                      pString++; +                    if (!isValidPointer(pString)) // No and no. +                        return {}; +                }              }          } @@ -1224,6 +1236,10 @@ QDateTime q_getTimeFromASN1(const ASN1_TIME *aTime)              if ((*pString != '+') && (*pString != '-'))                  return QDateTime(); +            if (!isValidPointer(pString + 4)) { +                // What kind of input parameters we were provided with? To hell with them! +                return {}; +            }              lSecondsFromUCT = ((pString[1] - '0') * 10 + (pString[2] - '0')) * 60;              lSecondsFromUCT += (pString[3] - '0') * 10 + (pString[4] - '0');              lSecondsFromUCT *= 60; diff --git a/src/platformsupport/glxconvenience/qglxconvenience.cpp b/src/platformsupport/glxconvenience/qglxconvenience.cpp index 5387214e8c7..823adf52ea5 100644 --- a/src/platformsupport/glxconvenience/qglxconvenience.cpp +++ b/src/platformsupport/glxconvenience/qglxconvenience.cpp @@ -224,6 +224,8 @@ GLXFBConfig qglx_findConfig(Display *display, int screen , QSurfaceFormat format              }              QXlibPointer<XVisualInfo> visual(glXGetVisualFromFBConfig(display, candidate)); +            if (!visual) +                continue;              int actualRed;              int actualGreen;              int actualBlue; diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp index 32a57473ad0..fef5346eafe 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp @@ -105,6 +105,7 @@ static QString alertSound(const QObject *object)          case Critical:              return QStringLiteral("SystemHand");          } +        return QString();      }      return QStringLiteral("SystemAsterisk");  } diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 2799f97fe8f..24a7cf37198 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -2301,14 +2301,15 @@ static bool mergeGradleProperties(const QString &path, GradleProperties properti  bool buildAndroidProject(const Options &options)  {      GradleProperties localProperties; -    localProperties["sdk.dir"] = options.sdkPath.toUtf8(); -    localProperties["ndk.dir"] = options.ndkPath.toUtf8(); +    localProperties["sdk.dir"] = QDir::fromNativeSeparators(options.sdkPath).toUtf8(); +    localProperties["ndk.dir"] = QDir::fromNativeSeparators(options.ndkPath).toUtf8();      if (!mergeGradleProperties(options.outputDirectory + QLatin1String("local.properties"), localProperties))          return false;      QString gradlePropertiesPath = options.outputDirectory + QLatin1String("gradle.properties");      GradleProperties gradleProperties = readGradleProperties(gradlePropertiesPath); +    gradleProperties["android.bundle.enableUncompressedNativeLibs"] = "false";      gradleProperties["buildDir"] = "build";      gradleProperties["qt5AndroidDir"] = (options.qtInstallDirectory + QLatin1String("/src/android/java")).toUtf8();      gradleProperties["androidCompileSdkVersion"] = options.androidPlatform.split(QLatin1Char('-')).last().toLocal8Bit(); diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp index 33dd3e59b67..661568dcadf 100644 --- a/src/widgets/kernel/qtooltip.cpp +++ b/src/widgets/kernel/qtooltip.cpp @@ -402,10 +402,10 @@ void QTipLabel::placeTip(const QPoint &pos, QWidget *w)  #endif //QT_NO_STYLE_STYLESHEET      QPoint p = pos; -    int screenNumber = getTipScreen(pos, w); -    QScreen *screen = QGuiApplication::screens().at(screenNumber); -    if (screen) { -        const QPlatformScreen *platformScreen = screen->handle(); +    const QScreen *screen = QGuiApplication::screens().value(getTipScreen(pos, w), +                                                             QGuiApplication::primaryScreen()); +    // a QScreen's handle *should* never be null, so this is a bit paranoid +    if (const QPlatformScreen *platformScreen = screen ? screen->handle() : nullptr) {          const QSize cursorSize = QHighDpi::fromNativePixels(platformScreen->cursor()->size(),                                                              platformScreen);          QPoint offset(2, cursorSize.height()); diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 7e391384737..5a24995cafc 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -1267,7 +1267,7 @@ void tst_QMenu::QTBUG47515_widgetActionEnterLeave()      if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))          QSKIP("Window activation is not supported");      if (QGuiApplication::platformName() == QLatin1String("cocoa")) -        QSKIP("See QTBUG-63031"); +        QSKIP("This test is meaningless on macOS, for additional info see QTBUG-63031");      const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry();      QRect geometry(QPoint(), availableGeometry.size() / 3);  | 
