calc: on editing invalidation of view with different zoom is wrong
[LibreOffice.git] / external / liborcus / overrun.patch.0
blobde2097e32328c929cb10f96a06655f00a2b58d81
1 --- src/parser/sax_token_parser.cpp
2 +++ src/parser/sax_token_parser.cpp
3 @@ -10,6 +10,7 @@
4  
5  #include <mdds/sorted_string_map.hpp>
6  #include <cctype>
7 +#include <limits>
8  
9  namespace orcus {
11 @@ -329,6 +330,28 @@
12      m_elem.raw_name = elem.name;
13  }
15 +static uint8_t readUint8(char const * begin, char const * end, char const ** endptr) {
16 +    unsigned n = 0;
17 +    char const * p = begin;
18 +    for (; p != end; ++p) {
19 +        char const c = *p;
20 +        if (c < '0' || c > '9') {
21 +            break;
22 +        }
23 +        n = 10 * n + (c - '0');
24 +        if (n > std::numeric_limits<uint8_t>::max()) {
25 +            *endptr = nullptr;
26 +            return 0;
27 +        }
28 +    }
29 +    if (p == begin) {
30 +        *endptr = nullptr;
31 +        return 0;
32 +    }
33 +    *endptr = p;
34 +    return n;
37  void sax_token_handler_wrapper_base::attribute(std::string_view name, std::string_view val)
38  {
39      decl_attr_type dat = decl_attr::get().find(name.data(), name.size());
40 @@ -340,18 +362,18 @@
41              const char* p = val.data();
42              const char* p_end = p + val.size();
44 -            char* endptr = nullptr;
45 -            long v = std::strtol(p, &endptr, 10);
46 +            const char* endptr = nullptr;
47 +            uint8_t v = readUint8(p, p_end, &endptr);
49 -            if (!endptr || endptr >= p_end || *endptr != '.')
50 +            if (!endptr || endptr == p_end || *endptr != '.')
51                  break;
53              m_declaration.version_major = v;
54              p = endptr + 1;
56 -            v = std::strtol(p, &endptr, 10);
57 +            v = readUint8(p, p_end, &endptr);
59 -            if (!endptr || endptr > p_end)
60 +            if (!endptr)
61                  break;
63              m_declaration.version_minor = v;