]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix signed integer promotion in a less elegant, but more functional way.
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 15 Sep 2021 15:01:36 +0000 (10:01 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 15 Sep 2021 15:01:36 +0000 (10:01 -0500)
src/lib/util/dbuff.h
src/lib/util/net.h

index d0fc622e9dbb56a329850220512da0d1326a037c..cdb8bc2f89e5f82803c88e0f9e4c19915962df64 100644 (file)
@@ -1789,18 +1789,16 @@ static inline ssize_t _fr_dbuff_out_uint64v(uint64_t *num, uint8_t **pos_p, fr_d
 static inline ssize_t _fr_dbuff_out_int64v(int64_t *num, uint8_t **pos_p, fr_dbuff_t *dbuff, size_t length)
 {
        ssize_t         slen;
-       bool            negative;
+       uint8_t         msb = **pos_p;
 
        fr_assert(length > 0 && length <= sizeof(uint64_t));
 
-       negative = *fr_dbuff_current(dbuff) & 0x80;
-
        *num = 0;
        slen = _fr_dbuff_out_memcpy(((uint8_t *) num) + (8 - length), pos_p, dbuff, length);
        if (slen <= 0) return slen;
 
+       if (msb & 0x80) memset(((uint8_t *)num), 0xff, sizeof(*num) - length);
        *num = fr_net_to_int64((uint8_t const *)num);
-       if (negative) *num = -*num;
 
        return length;
 }
index 5493846004b79b50bf87f7b6864cec67fb819870..e548f61104160ee17b9456595328d022fb72c81c 100644 (file)
@@ -319,6 +319,23 @@ static inline uint64_t fr_net_to_uint64v(uint8_t const *data, size_t data_len)
        return ntohll(num);
 }
 
+static inline uint64_t fr_net_to_int64v(uint8_t const *data, size_t data_len)
+{
+       int64_t num = 0;
+
+       if (unlikely(data_len > sizeof(uint64_t))) 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);
+
+       return ntohll(num);
+}
+
 /** Convert bits (as in prefix length) to bytes, rounding up.
  *
  * @param bits number of bits in the prefix