]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Don't use memcpy when grabbing single bytes from the buffer
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 10 Nov 2024 14:27:55 +0000 (08:27 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 10 Nov 2024 14:46:22 +0000 (08:46 -0600)
src/lib/util/dbuff.h

index 37b0db35900dffe502bcceed0cee3b7b04d71022..45bf2305e438851584302b6cd365368a536b2513 100644 (file)
@@ -1770,6 +1770,18 @@ FR_DBUFF_OUT_DEF(uint64)
 FR_DBUFF_OUT_DEF(int16)
 FR_DBUFF_OUT_DEF(int32)
 FR_DBUFF_OUT_DEF(int64)
+
+#define FR_DBUFF_OUT_DEF_NO_SWAP(_type) \
+static inline ssize_t _fr_dbuff_out_##_type(_type##_t *out, uint8_t **pos_p, fr_dbuff_t *in) \
+{ \
+       fr_assert(out); \
+       FR_DBUFF_EXTEND_LOWAT_OR_RETURN(in, sizeof(_type##_t)); \
+       *out = **pos_p; \
+       return _fr_dbuff_set(pos_p, in, (*pos_p) + sizeof(_type##_t)); \
+}
+
+FR_DBUFF_OUT_DEF_NO_SWAP(uint8)
+FR_DBUFF_OUT_DEF_NO_SWAP(int8)
 /** @endcond */
 
 /** Copy data from a dbuff or marker to a fixed sized C type
@@ -1786,11 +1798,11 @@ FR_DBUFF_OUT_DEF(int64)
  */
 #define fr_dbuff_out(_out, _dbuff_or_marker) \
        _Generic((_out), \
-               uint8_t *       : _fr_dbuff_out_memcpy((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), 1), \
+               uint8_t *       : _fr_dbuff_out_uint8((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                uint16_t *      : _fr_dbuff_out_uint16((uint16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                uint32_t *      : _fr_dbuff_out_uint32((uint32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                uint64_t *      : _fr_dbuff_out_uint64((uint64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
-               int8_t *        : _fr_dbuff_out_memcpy((uint8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker), 1), \
+               int8_t *        : _fr_dbuff_out_int8((int8_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                int16_t *       : _fr_dbuff_out_int16((int16_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                int32_t *       : _fr_dbuff_out_int32((int32_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \
                int64_t *       : _fr_dbuff_out_int64((int64_t *)(_out), _fr_dbuff_current_ptr(_dbuff_or_marker), fr_dbuff_ptr(_dbuff_or_marker)), \