]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
time deltas are signed
authorAlan T. DeKok <aland@freeradius.org>
Wed, 1 Sep 2021 13:45:51 +0000 (09:45 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 1 Sep 2021 13:49:24 +0000 (09:49 -0400)
so we need to unpack them as signed values, too

src/lib/util/dbuff.h
src/lib/util/value.c

index 782cf94e6a0b9ef34d7b72031ecd39727aea3b2d..336b5b2d6beaae17216b689274a312392cef337e 100644 (file)
@@ -1783,6 +1783,43 @@ static inline ssize_t _fr_dbuff_out_uint64v(uint64_t *num, uint8_t **pos_p, fr_d
  */
 #define FR_DBUFF_OUT_UINT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_uint64v, _num, _dbuff_or_marker, _len)
 
+/** Internal function - do not call directly
+ * @private
+ */
+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;
+
+       fr_assert(length > 0 && length <= sizeof(uint64_t));
+
+       *num = 0;
+       slen = _fr_dbuff_out_memcpy(((uint8_t *) num) + (8 - length), pos_p, dbuff, length);
+       if (slen <= 0) return slen;
+
+       *num = fr_net_to_int64((uint8_t const *)num);
+       return length;
+}
+
+/** Read bytes from a dbuff or marker and interpret them as a network order signed integer
+ * @param[in] _num             points to an int64_t to store the integer in
+ * @param[in] _dbuff_or_marker data to copy bytes from
+ * @param[in] _len             number of bytes to read (must be positive and less than eight)
+ *
+ * @return
+ *     - 0     no data read.
+ *     - >0    the number of bytes read.
+ *     - <0    the number of bytes we would have needed
+ *             to complete the read operation.
+ */
+#define fr_dbuff_out_int64v(_num, _dbuff_or_marker, _len) \
+       _fr_dbuff_out_int64v(_num, _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), _len)
+
+/** Read bytes from a dbuff or marker and interpret them as a network order unsigned integer
+ *
+ * @copydetails fr_dbuff_out_int64v
+ */
+#define FR_DBUFF_OUT_INT64V_RETURN(_num, _dbuff_or_marker, _len) FR_DBUFF_RETURN(fr_dbuff_out_int64v, _num, _dbuff_or_marker, _len)
+
 /** @} */
 
 #ifdef __cplusplus
index f3921612e90db1bde4048768b931fc7061f5ffe3..5871ba0edcea116c9c4001e55d28a18652da37cf 100644 (file)
@@ -1739,7 +1739,7 @@ ssize_t fr_value_box_from_network_dbuff(TALLOC_CTX *ctx,
        {
                size_t length = 4;
                fr_time_res_t precision = FR_TIME_RES_SEC;
-               uint64_t date;
+               int64_t date;
 
                if (enumv) {
                        length = enumv->flags.length;