3rdparty: update TinyCBOR to v0.6.1

[ChangeLog][Third-Party Code] The copy of TinyCBOR in Qt was updated to
0.6.1.

Manual conflict resolution for 6.9:
- worked around 34f60877bdb54786c62fd1bf5b44a81430aa411f not having
  been picked to older branches

Pick-to: 6.9.0 6.8 6.8.3 6.5 5.15
Change-Id: If5d5ef6220874ae8858efffd1712a567597b6317
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
(cherry picked from commit 7df128675a22391bc3ade2a45b558bc38eee1c67)
This commit is contained in:
Thiago Macieira 2022-09-07 10:51:15 -07:00 committed by Marc Mutz
parent 6d2421d812
commit cd395a7999
10 changed files with 126 additions and 113 deletions

View File

@ -1,79 +0,0 @@
From b6e2caf7452bf2b695583196fd7b346c1663d798 Mon Sep 17 00:00:00 2001
From: Marc Mutz <marc.mutz@qt.io>
Date: Mon, 7 Aug 2023 16:24:13 +0200
Subject: [PATCH] tst_Encoder: port away from Q_FOREACH
Qt is defaulting to QT_NO_FOREACH these days, so make sure we
integrate nicely with downstream and fix the single Q_FOREACH/foreach
user, in tst_encoder.cpp.
Unfortunately, the container's initialization code doesn't exactly
lend itself to making the container const (not even IILE
(Immediately-Invoked Lambda Expression) would help here, due to the
interdependency with `len`), so the idiomatic solution would be to use
std::as_const()/qAsConst().
The former is available from C++17, which we don't require, yet, and
the latter is not available under QT_NO_AS_CONST (the default for Qt
these days), so grab the nettle and implement a t17::as_const() that
switches between a manual implementation of std::as_const and the real
thing, depending on __cpp_lib_as_const. The `t17` here mimicks the qNN
(q20::remove_cvref_t/q23::forward_like/etc) mechanism used in Qt
itself for backports, with s/q/t/ because ... _T_inyCbor.
The t17 implementation is local to tst_encoder.cpp, but can easily be
extracted into a separate header once more users emerge.
---
tests/encoder/encoder.pro | 2 ++
tests/encoder/tst_encoder.cpp | 15 ++++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/tests/encoder/encoder.pro b/tests/encoder/encoder.pro
index 62d9b7e..180f0d7 100644
--- a/tests/encoder/encoder.pro
+++ b/tests/encoder/encoder.pro
@@ -3,6 +3,8 @@ SOURCES += tst_encoder.cpp
CONFIG += testcase parallel_test c++11
QT = core testlib
+DEFINES += QT_NO_FOREACH QT_NO_AS_CONST
+
INCLUDEPATH += ../../src
msvc: POST_TARGETDEPS = ../../lib/tinycbor.lib
else: POST_TARGETDEPS += ../../lib/libtinycbor.a
diff --git a/tests/encoder/tst_encoder.cpp b/tests/encoder/tst_encoder.cpp
index 31c2915..61ce9c9 100644
--- a/tests/encoder/tst_encoder.cpp
+++ b/tests/encoder/tst_encoder.cpp
@@ -29,6 +29,19 @@
#include <qfloat16.h>
#endif
+#include <utility>
+namespace t17 {
+#ifdef __cpp_lib_as_const
+ using std::as_const;
+#else
+ template <typename T>
+ constexpr typename std::add_const<T>::type &as_const(T &t) noexcept { return t; }
+ // prevent rvalue arguments:
+ template <typename T>
+ void as_const(const T &&) = delete;
+#endif // __cpp_lib_as_const
+} // namespace t17
+
Q_DECLARE_METATYPE(CborError)
namespace QTest {
template<> char *toString<CborError>(const CborError &err)
@@ -153,7 +166,7 @@ CborError encodeVariant(CborEncoder *encoder, const QVariant &v)
CborError err = cbor_encoder_create_array(encoder, &sub, len);
if (err && !isOomError(err))
return err;
- foreach (const QVariant &v2, list) {
+ for (const QVariant &v2 : t17::as_const(list)) {
err = static_cast<CborError>(err | encodeVariant(&sub, v2));
if (err && !isOomError(err))
return err;
--
2.25.1

View File

@ -10,9 +10,9 @@
"License": "MIT License",
"LicenseId": "MIT",
"LicenseFile": "LICENSE",
"DownloadLocation": "https://github.com/intel/tinycbor/archive/v0.6.0/tinycbor-0.6.0.tar.gz",
"DownloadLocation": "https://github.com/intel/tinycbor/archive/v0.6.1/tinycbor-0.6.1.tar.gz",
"PURL": "pkg:github/intel/tinycbor@v$<VERSION>",
"CPE": "cpe:2.3:a:tinycbor:tinycbor:$<VERSION>:*:*:*:*:*:*:*",
"Version": "0.6.0",
"Version": "0.6.1",
"Copyright": "Copyright (C) 2015-2021 Intel Corporation"
}

View File

@ -34,6 +34,10 @@
#include <string.h>
#include <stdio.h>
#ifdef CBOR_EXTERNAL_CFG
#include "cbor_cfg.h"
#endif
#include "tinycbor-version.h"
#define TINYCBOR_VERSION ((TINYCBOR_VERSION_MAJOR << 16) | (TINYCBOR_VERSION_MINOR << 8) | TINYCBOR_VERSION_PATCH)

View File

@ -31,6 +31,7 @@
#ifndef __STDC_LIMIT_MACROS
# define __STDC_LIMIT_MACROS 1
#endif
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include "cbor.h"
#include "cborinternal_p.h"
@ -101,7 +102,7 @@
* complete the encoding. At the end, you can obtain that count by calling
* cbor_encoder_get_extra_bytes_needed().
*
* \section1 Finalizing the encoding
* \section Finalizing the encoding
*
* Once all items have been appended and the containers have all been properly
* closed, the user-supplied buffer will contain the CBOR stream and may be
@ -212,6 +213,7 @@ void cbor_encoder_init_writer(CborEncoder *encoder, CborEncoderWriteFunction wri
{
#ifdef CBOR_ENCODER_WRITE_FUNCTION
(void) writer;
encoder->data.writer = CBOR_NULLPTR;
#else
encoder->data.writer = writer;
#endif
@ -544,7 +546,7 @@ CborError cbor_encoder_create_array(CborEncoder *parentEncoder, CborEncoder *arr
* when creating the map, the constant \ref CborIndefiniteLength may be passed as
* length instead, and an indefinite length map is created.
*
* \b{Implementation limitation:} TinyCBOR cannot encode more than SIZE_MAX/2
* <b>Implementation limitation:</b> TinyCBOR cannot encode more than SIZE_MAX/2
* key-value pairs in the stream. If the length \a length is larger than this
* value (and is not \ref CborIndefiniteLength), this function returns error
* CborErrorDataTooLarge.

View File

@ -25,11 +25,19 @@
#ifndef CBORINTERNAL_P_H
#define CBORINTERNAL_P_H
/* Dependent source files (*.c) must define __STDC_WANT_IEC_60559_TYPES_EXT__
* before <float.h> is (transitively) first included.
*/
#if !defined(__STDC_WANT_IEC_60559_TYPES_EXT__)
# error __STDC_WANT_IEC_60559_TYPES_EXT__ not defined
#endif
#include "compilersupport_p.h"
#ifndef CBOR_NO_FLOATING_POINT
# include <float.h>
# include <math.h>
# include <string.h>
#else
# ifndef CBOR_NO_HALF_FLOAT_TYPE
# define CBOR_NO_HALF_FLOAT_TYPE 1
@ -37,7 +45,26 @@
#endif
#ifndef CBOR_NO_HALF_FLOAT_TYPE
# if defined(__F16C__) || defined(__AVX2__)
/* Check for FLT16_MANT_DIG using integer comparison. Clang headers incorrectly
* define this macro unconditionally when __STDC_WANT_IEC_60559_TYPES_EXT__
* is defined (regardless of actual support for _Float16).
*/
# if FLT16_MANT_DIG > 0 || __FLT16_MANT_DIG__ > 0
static inline unsigned short encode_half(float x)
{
unsigned short h;
_Float16 f = (_Float16)x;
memcpy(&h, &f, 2);
return h;
}
static inline float decode_half(unsigned short x)
{
_Float16 f;
memcpy(&f, &x, 2);
return (float)f;
}
# elif defined(__F16C__) || defined(__AVX2__)
# include <immintrin.h>
static inline unsigned short encode_half(float val)
{

View File

@ -31,6 +31,7 @@
#ifndef __STDC_LIMIT_MACROS
# define __STDC_LIMIT_MACROS 1
#endif
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include "cbor.h"
#include "cborinternal_p.h"
@ -93,7 +94,7 @@
*
* The code above does not execute a range-check either: it is possible that
* the value decoded from the CBOR stream encodes a number larger than what can
* be represented in a variable of type \c{int}. If detecting that case is
* be represented in a variable of type \c int. If detecting that case is
* important, the code should call cbor_value_get_int_checked() instead.
*
* <h3 class="groupheader">Memory and parsing constraints</h3>
@ -133,12 +134,10 @@
*
* \if privatedocs
* Implementation details: the CborValue contains these fields:
* \list
* \li ptr: pointer to the actual data
* \li flags: flags from the decoder
* \li extra: partially decoded integer value (0, 1 or 2 bytes)
* \li remaining: remaining items in this collection after this item or UINT32_MAX if length is unknown
* \endlist
* - ptr: pointer to the actual data
* - flags: flags from the decoder
* - extra: partially decoded integer value (0, 1 or 2 bytes)
* - remaining: remaining items in this collection after this item or UINT32_MAX if length is unknown
* \endif
*/
@ -232,7 +231,7 @@ static CborError preparse_value(CborValue *it)
case SinglePrecisionFloat:
case DoublePrecisionFloat:
it->flags |= CborIteratorFlag_IntegerValueTooLarge;
Q_FALLTHROUGH();
CBOR_FALLTHROUGH;
case TrueValue:
case NullValue:
case UndefinedValue:
@ -428,12 +427,10 @@ CborError cbor_value_reparse(CborValue *it)
* will appear during parsing.
*
* A basic validation checks for:
* \list
* \li absence of undefined additional information bytes;
* \li well-formedness of all numbers, lengths, and simple values;
* \li string contents match reported sizes;
* \li arrays and maps contain the number of elements they are reported to have;
* \endlist
* - absence of undefined additional information bytes;
* - well-formedness of all numbers, lengths, and simple values;
* - string contents match reported sizes;
* - arrays and maps contain the number of elements they are reported to have;
*
* For further checks, see cbor_value_validate().
*
@ -744,7 +741,7 @@ CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed)
* \ref cbor_value_is_integer is recommended.
*
* Note that this function does not do range-checking: integral values that do
* not fit in a variable of type \c{int} are silently truncated to fit. Use
* not fit in a variable of type \c int are silently truncated to fit. Use
* cbor_value_get_int_checked() if that is not acceptable.
*
* \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer()
@ -759,7 +756,7 @@ CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed)
* \ref cbor_value_is_integer is recommended.
*
* Note that this function does not do range-checking: integral values that do
* not fit in a variable of type \c{int64_t} are silently truncated to fit. Use
* not fit in a variable of type \c int64_t are silently truncated to fit. Use
* cbor_value_get_int64_checked() that is not acceptable.
*
* \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer()
@ -790,7 +787,7 @@ CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed)
* If the integer is unsigned (that is, if cbor_value_is_unsigned_integer()
* returns true), then \a result will contain the actual value. If the integer
* is negative, then \a result will contain the absolute value of that integer,
* minus one. That is, \c {actual = -result - 1}. On architectures using two's
* minus one. That is, <tt>actual = -result - 1</tt>. On architectures using two's
* complement for representation of negative integers, it is equivalent to say
* that \a result will contain the bitwise negation of the actual value.
*
@ -1211,7 +1208,7 @@ static CborError iterate_string_chunks(const CborValue *value, char *buffer, siz
return CborErrorDataTooLarge;
if (*result && *buflen >= newTotal)
*result = !!func(buffer + total, (const uint8_t *)ptr, chunkLen);
*result = !!func(buffer == NULL ? buffer : buffer + total, (const uint8_t *)ptr, chunkLen);
else
*result = false;
@ -1221,7 +1218,7 @@ static CborError iterate_string_chunks(const CborValue *value, char *buffer, siz
/* is there enough room for the ending NUL byte? */
if (*result && *buflen > total) {
uint8_t nul[] = { 0 };
*result = !!func(buffer + total, nul, 1);
*result = !!func(buffer == NULL ? buffer : buffer + total, nul, 1);
}
*buflen = total;
return _cbor_value_finish_string_iteration(next);
@ -1243,10 +1240,10 @@ static CborError iterate_string_chunks(const CborValue *value, char *buffer, siz
* of the string in order to preallocate a buffer, use
* cbor_value_calculate_string_length().
*
* On success, this function sets the number of bytes copied to \c{*buflen}. If
* On success, this function sets the number of bytes copied to \c *buflen. If
* the buffer is large enough, this function will insert a null byte after the
* last copied byte, to facilitate manipulation of text strings. That byte is
* not included in the returned value of \c{*buflen}. If there was no space for
* not included in the returned value of \c *buflen. If there was no space for
* the terminating null, no error is returned, so callers must check the value
* of *buflen after the call, before relying on the '\0'; if it has not been
* changed by the call, there is no '\0'-termination on the buffer's contents.
@ -1280,10 +1277,10 @@ static CborError iterate_string_chunks(const CborValue *value, char *buffer, siz
* of the string in order to preallocate a buffer, use
* cbor_value_calculate_string_length().
*
* On success, this function sets the number of bytes copied to \c{*buflen}. If
* On success, this function sets the number of bytes copied to \c *buflen. If
* the buffer is large enough, this function will insert a null byte after the
* last copied byte, to facilitate manipulation of null-terminated strings.
* That byte is not included in the returned value of \c{*buflen}.
* That byte is not included in the returned value of \c *buflen.
*
* The \a next pointer, if not null, will be updated to point to the next item
* after this string. If \a value points to the last item, then \a next will be
@ -1520,7 +1517,7 @@ error:
* cbor_value_is_half_float is recommended.
*
* Note: since the C language does not have a standard type for half-precision
* floating point, this function takes a \c{void *} as a parameter for the
* floating point, this function takes a <tt>void *</tt> as a parameter for the
* storage area, which must be at least 16 bits wide.
*
* \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_half_float(), cbor_value_get_half_float_as_float(), cbor_value_get_float()

View File

@ -44,14 +44,28 @@
# include <stdbool.h>
#endif
#if __STDC_VERSION__ >= 201112L || (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(__cpp_static_assert) && __cpp_static_assert >= 200410)
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(__cpp_static_assert) && __cpp_static_assert >= 200410)
# define cbor_static_assert(x) static_assert(x, #x)
#elif !defined(__cplusplus) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) && (__STDC_VERSION__ > 199901L)
# define cbor_static_assert(x) _Static_assert(x, #x)
#else
# define cbor_static_assert(x) ((void)sizeof(char[2*!!(x) - 1]))
#endif
#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
#if defined(__has_cpp_attribute) // C23 and C++17
# if __has_cpp_attribute(fallthrough)
# define CBOR_FALLTHROUGH [[fallthrough]]
# endif
#endif
#ifndef CBOR_FALLTHROUGH
# ifdef __GNUC__
# define CBOR_FALLTHROUGH __attribute__((fallthrough))
# else
# define CBOR_FALLTHROUGH do { } while (0)
# endif
#endif
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus)
/* inline is a keyword */
#else
/* use the definition from cbor.h */
@ -128,6 +142,23 @@
# define cbor_htonl _byteswap_ulong
# define cbor_ntohs _byteswap_ushort
# define cbor_htons _byteswap_ushort
#elif defined(__ICCARM__)
# if __LITTLE_ENDIAN__ == 1
# include <intrinsics.h>
# define ntohll(x) ((__REV((uint32_t)(x)) * UINT64_C(0x100000000)) + (__REV((x) >> 32)))
# define htonll ntohll
# define cbor_ntohl __REV
# define cbor_htonl __REV
# define cbor_ntohs __REVSH
# define cbor_htons __REVSH
# else
# define cbor_ntohll
# define cbor_htonll
# define cbor_ntohl
# define cbor_htonl
# define cbor_ntohs
# define cbor_htons
# endif
#endif
#ifndef cbor_ntohs
# include <arpa/inet.h>
@ -156,7 +187,7 @@
(defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && BYTE_ORDER == LITTLE_ENDIAN) || \
defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__MIPSEL__) || \
defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) || defined(__amd64)
# define ntohll(x) ((ntohl((uint32_t)(x)) * UINT64_C(0x100000000)) + (ntohl((x) >> 32)))
# define ntohll(x) ((cbor_ntohl((uint32_t)(x)) * UINT64_C(0x100000000)) + (cbor_ntohl((x) >> 32)))
# define htonll ntohll
# else
# error "Unable to determine byte order!"
@ -167,9 +198,11 @@
#ifdef __cplusplus
# define CONST_CAST(t, v) const_cast<t>(v)
# define CBOR_NULLPTR nullptr
#else
/* C-style const_cast without triggering a warning with -Wcast-qual */
# define CONST_CAST(t, v) (t)(uintptr_t)(v)
# define CBOR_NULLPTR NULL
#endif
#ifdef __GNUC__
@ -201,5 +234,15 @@ static inline bool add_check_overflow(size_t v1, size_t v2, size_t *r)
#endif
}
#endif /* COMPILERSUPPORT_H */
static inline bool mul_check_overflow(size_t v1, size_t v2, size_t *r)
{
#if ((defined(__GNUC__) && (__GNUC__ >= 5)) && !defined(__INTEL_COMPILER)) || __has_builtin(__builtin_add_overflow)
return __builtin_mul_overflow(v1, v2, r);
#else
/* unsigned multiplications are well-defined */
*r = v1 * v2;
return *r > v1 && *r > v2;
#endif
}
#endif /* COMPILERSUPPORT_H */

View File

@ -106,6 +106,8 @@ private slots:
// validation & errors
void checkedIntegers_data();
void checkedIntegers();
void validationValid_data() { arrays_data(); }
void validationValid();
void validation_data();
void validation();
void strictValidation_data();
@ -256,7 +258,7 @@ CborError parseOneChunk(CborValue *it, QString *parsed)
if (text)
*parsed = '"' + QString::fromUtf8(text, len) + '"';
} else {
Q_ASSERT(false);
Q_UNREACHABLE();
}
return err;
}
@ -1337,6 +1339,21 @@ void tst_Parser::checkedIntegers()
}
}
void tst_Parser::validationValid()
{
// verify that all valid data validate properly
QFETCH(QByteArray, data);
QString decoded;
ParserWrapper w;
CborError err = w.init(data);
QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
QCOMPARE(cbor_value_validate_basic(&w.first), CborNoError);
QCOMPARE(cbor_value_validate(&w.first, CborValidateBasic), CborNoError);
QCOMPARE(cbor_value_validate(&w.first, CborValidateCompleteData), CborNoError);
}
void tst_Parser::validation_data()
{
addValidationColumns();

View File

@ -32,6 +32,7 @@ QT_WARNING_DISABLE_GCC("-Wunused-function")
QT_WARNING_DISABLE_CLANG("-Wunused-function")
QT_WARNING_DISABLE_CLANG("-Wundefined-internal")
#define CBOR_NO_HALF_FLOAT_TYPE 1
#define CBOR_NO_VALIDATION_API 1
#define CBOR_NO_PRETTY_API 1
#define CBOR_API static inline

View File

@ -1487,6 +1487,7 @@ QT_WARNING_DISABLE_CLANG("-Wunused-function")
QT_WARNING_DISABLE_CLANG("-Wundefined-internal")
QT_WARNING_DISABLE_MSVC(4334) // '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
#define CBOR_NO_HALF_FLOAT_TYPE 1
#define CBOR_ENCODER_WRITER_CONTROL 1
#define CBOR_ENCODER_WRITE_FUNCTION CborDevice::callback