]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
fix fr_nbo_to_int64v()
authorAlan T. DeKok <aland@freeradius.org>
Mon, 9 Mar 2026 00:57:48 +0000 (20:57 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 9 Mar 2026 00:57:48 +0000 (20:57 -0400)
use / return int64_t, not uint64_t

set the high bits to zero starting at 0, not part-way through

src/lib/util/nbo.h

index 627eef671c7cfdd0e2cd2a68446f63a52d19df78..323282e8d503b360c7ff74dc8715b1e5928a71c7 100644 (file)
@@ -198,33 +198,39 @@ static inline uint64_t fr_nbo_to_uint64v(uint8_t const *data, size_t data_len)
        uint64_t num = 0;
        uint64_t nbo;
 
-       if (unlikely(data_len > sizeof(uint64_t))) return 0;
+       if (unlikely(data_len > sizeof(nbo))) return 0;
 
        /*
         *      Copy at an offset into memory
         *      allocated for the uin64_t
         */
-       memcpy(((uint8_t *)&num) + (sizeof(uint64_t) - data_len), data, data_len);      /* aligned */
+       memcpy(((uint8_t *)&num) + (sizeof(nbo) - data_len), data, data_len);   /* aligned */
        fr_nbo_from_uint64((uint8_t *)&nbo, num);
 
        return nbo;
 }
 
-static inline uint64_t fr_nbo_to_int64v(uint8_t const *data, size_t data_len)
+/** Read a signed 64bit integer from wire format (big endian) with a variable length encoding
+ *
+ * @param[in] data     Buffer containing the number.
+ * @param[in] data_len Length of number.
+ * @return a 64 bit signed integer of native endianness.
+ */
+static inline int64_t fr_nbo_to_int64v(uint8_t const *data, size_t data_len)
 {
        int64_t num = 0;
-       uint64_t nbo;
+       int64_t nbo;
 
-       if (unlikely(data_len > sizeof(uint64_t))) return 0;
+       if (unlikely(data_len > sizeof(nbo))) return 0;
 
        /*
         *      Copy at an offset into memory
         *      allocated for the uin64_t
         */
-       memcpy(((uint8_t *)&num) + (sizeof(uint64_t) - data_len), data, data_len);      /* aligned */
-       if (*data & 0x80) memset(((uint8_t *)&num) + data_len, 0xff, sizeof(num) - data_len);
+       memcpy(((uint8_t *)&num) + (sizeof(nbo) - data_len), data, data_len);   /* aligned */
+       if (*data & 0x80) memset(((uint8_t *)&num), 0xff, sizeof(num) - data_len);
 
-       fr_nbo_from_uint64((uint8_t *)&nbo, num);
+       fr_nbo_from_int64((uint8_t *)&nbo, num);
 
        return nbo;
 }