]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Don't allow the length argument of fr_dbuff_advance to be a signed integer
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 28 Jan 2021 15:00:00 +0000 (15:00 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 28 Jan 2021 15:00:00 +0000 (15:00 +0000)
src/lib/util/dbuff.c
src/lib/util/dbuff.h
src/lib/util/dns.c

index cf32e154abeda71b96aa8008cd9d084065495080..6af875b048a19ef5e156ed5cf8a506415737868d 100644 (file)
@@ -50,7 +50,7 @@ size_t _fr_dbuff_move_##_in_type##_to_##_out_type(fr_##_out_type##_t *out, fr_##
                if (to_copy == 0) break; \
                to_copy = _fr_dbuff_safecpy(fr_dbuff_current(out), fr_dbuff_end(out), \
                                            fr_dbuff_current(in), fr_dbuff_current(in) + to_copy); \
-               fr_dbuff_advance(out, fr_dbuff_advance(in, to_copy)); \
+               fr_dbuff_advance(out, (size_t)fr_dbuff_advance(in, to_copy)); \
                remaining -= to_copy; \
        } \
        return len - remaining; \
index 10f202057d2904cf33aa1b794a08cdb801830d9f..1aa5d2ddb0c9481800d96076bf5149c0df61f317 100644 (file)
@@ -926,12 +926,25 @@ _fr_dbuff_set(\
  *
  * @param[in] _dbuff_or_marker to advance.
  * @param[in] _len             How much to advance dbuff by.
+ *                             Must be a positive integer.
  * @return
  *     - 0     not advanced.
  *     - >0    the number of bytes the dbuff or marker was advanced by.
  *     - <0    the number of bytes required to complete the advancement
  */
-#define fr_dbuff_advance(_dbuff_or_marker, _len)  fr_dbuff_set(_dbuff_or_marker, (fr_dbuff_current(_dbuff_or_marker) + (_len)))
+#define fr_dbuff_advance(_dbuff_or_marker, _len)  \
+       fr_dbuff_set(_dbuff_or_marker, \
+                    (fr_dbuff_current(_dbuff_or_marker) + \
+                    (_Generic((_len), \
+                       uint8_t : (size_t)(_len), \
+                       uint16_t : (size_t)(_len), \
+                       uint32_t : (size_t)(_len), \
+                       uint64_t : (size_t)(_len), \
+                       int : (size_t)(_len), \
+                       long : (size_t)(_len), \
+                       long long : (size_t)(_len), \
+                       size_t : (_len) \
+                    ))))
 
 /** Advance the 'current' position in dbuff or marker by _len bytes returning if _len is out of range
  *
index eb8918224368944ff89aec49d857a71f73164d23..4d5f15029967bdd3b2620035b2bc261d5597dfb3 100644 (file)
@@ -503,7 +503,7 @@ ssize_t fr_dns_label_from_value_box_dbuff(fr_dbuff_t *dbuff, bool compression, f
 
        if (slen == 0) return -need;
 
-       fr_dbuff_advance(dbuff, slen);
+       fr_dbuff_advance(dbuff, (size_t)slen);
        return slen;
 }