src: introduce memmove wrapper using memmove_s if available

Ticket: 6028

memmove_s is a C11 safer version adding a fourth argument which
is the total size of the destination buffer, so as to check there
is no risk of overflow
This commit is contained in:
Philippe Antoine
2026-10-03 00:34:26 +00:00
committed by Victor Julien
parent 178ff02750
commit 819c61265d
7 changed files with 33 additions and 11 deletions
+1 -1
View File
@@ -207,7 +207,7 @@
AC_FUNC_MMAP
AC_FUNC_STRTOD
AC_CHECK_FUNCS([memmem memset memchr memmove])
AC_CHECK_FUNCS([memmem memset memchr memmove memmove_s])
AC_CHECK_FUNCS([strcasecmp strchr strrchr strdup strndup strncasecmp strtol strstr strpbrk strtoull strtoumax])
AC_CHECK_FUNCS([strerror])
AC_CHECK_FUNCS([gethostname inet_ntoa uname])
+2 -2
View File
@@ -684,8 +684,8 @@ static void DNP3BufferTrim(DNP3Buffer *buffer)
DNP3BufferReset(buffer);
}
else if (buffer->offset > 0) {
memmove(buffer->buffer, buffer->buffer + buffer->offset,
buffer->len - buffer->offset);
SCMemmove(buffer->buffer, buffer->size, buffer->buffer + buffer->offset,
buffer->len - buffer->offset);
buffer->len = buffer->len - buffer->offset;
buffer->offset = 0;
}
+1 -1
View File
@@ -466,7 +466,7 @@ static DetectBytetestData *DetectBytetestParse(
end_ptr = (char *)str_ptr;
while (!(isspace((unsigned char)*end_ptr) || (*end_ptr == ',')) && (*end_ptr != '\0'))
end_ptr++;
memmove(data_offset, str_ptr, end_ptr - str_ptr);
SCMemmove(data_offset, strlen(data_offset) + 1, str_ptr, end_ptr - str_ptr);
data_offset[end_ptr-str_ptr] = '\0';
if (data_offset[0] != '-' && isalpha((unsigned char)data_offset[0])) {
*offset = SCStrdup(data_offset);
+1 -1
View File
@@ -2726,7 +2726,7 @@ static void UpdateRawDataForVLANHdr(Packet *p)
uint8_t *pstart = GET_PKT_DATA(p) - VLAN_HEADER_LEN;
uint32_t plen = GET_PKT_LEN(p) + VLAN_HEADER_LEN;
/* move ethernet addresses */
memmove(pstart, GET_PKT_DATA(p), 2 * ETH_ALEN);
SCMemmove(pstart, plen, GET_PKT_DATA(p), 2 * ETH_ALEN);
/* write vlan info */
*(uint16_t *)(pstart + 2 * ETH_ALEN) = htons(0x8100);
*(uint16_t *)(pstart + 2 * ETH_ALEN + 2) = htons(p->afp_v.vlan_tci);
+6
View File
@@ -125,6 +125,12 @@ extern "C"
#include <ctype.h>
#endif
#if HAVE_MEMMOVE_S
#ifndef __STDC_WANT_LIB_EXT1__
#define __STDC_WANT_LIB_EXT1__ 1
#endif
#endif
#if HAVE_STRING_H
#include <string.h>
#endif
+15
View File
@@ -78,4 +78,19 @@ void SCFreeAlignedFunc(void *ptr);
#endif /* CPPCHECK */
#include "util-validate.h"
static inline void SCMemmove(void *dest, size_t dest_size, const void *src, size_t len)
{
#if HAVE_MEMMOVE_S
memmove_s(dest, dest_size, src, len);
#else
if (len > dest_size) {
DEBUG_VALIDATE_BUG_ON(1);
len = dest_size;
}
memmove(dest, src, len);
#endif
}
#endif /* SURICATA_UTIL_MEM_H */
+7 -6
View File
@@ -926,7 +926,8 @@ static inline void StreamingBufferSlideToOffsetWithRegions(
// pre-grow: [nextnextnext]
// post-grow [nextnextnextXXX]
// post-move [XXXnextnextnext]
memmove(next->buf + next_data_offset, next->buf, prev_buf_size);
SCMemmove(next->buf + next_data_offset, next->buf_size - next_data_offset,
next->buf, prev_buf_size);
// move portion of "start" into "next"
//
@@ -966,7 +967,7 @@ static inline void StreamingBufferSlideToOffsetWithRegions(
// pre: [xxxxxxxAAA]
// post: [AAAxxxxxxx]
SCLogDebug("s %u new_data_size %u", s, new_data_size);
memmove(start->buf, start->buf + s, new_data_size);
SCMemmove(start->buf, start->buf_size, start->buf + s, new_data_size);
// copy in "next"
// pre: [AAAxxxxxxx]
@@ -990,7 +991,7 @@ static inline void StreamingBufferSlideToOffsetWithRegions(
just_main:
SCLogDebug("s %u new_data_size %u", s, new_data_size);
memmove(to_shift->buf, to_shift->buf + s, new_data_size);
SCMemmove(to_shift->buf, to_shift->buf_size, to_shift->buf + s, new_data_size);
/* shrink memory region. If this fails we keep the old */
void *ptr = REALLOC(cfg, to_shift->buf, to_shift->buf_size, new_mem_size);
if (ptr != NULL) {
@@ -1051,7 +1052,7 @@ void StreamingBufferSlideToOffset(
const uint32_t size = sb->region.buf_size - slide;
SCLogDebug("sliding %u forward, size of original buffer left after slide %u", slide,
size);
memmove(sb->region.buf, sb->region.buf + slide, size);
SCMemmove(sb->region.buf, sb->region.buf_size, sb->region.buf + slide, size);
if (sb->region.buf_offset > slide) {
sb->region.buf_offset -= slide;
} else {
@@ -1067,7 +1068,7 @@ void StreamingBufferSlideToOffset(
const uint32_t size = sb->region.buf_offset - slide;
SCLogDebug("sliding %u forward, size of original buffer left after slide %u", slide,
size);
memmove(sb->region.buf, sb->region.buf + slide, size);
SCMemmove(sb->region.buf, sb->region.buf_size, sb->region.buf + slide, size);
sb->region.stream_offset = offset;
sb->region.buf_offset = size;
} else {
@@ -1299,7 +1300,7 @@ static StreamingBufferRegion *BufferInsertAtRegionConsolidate(StreamingBuffer *s
/* validate that the size is exactly what we asked for */
DEBUG_VALIDATE_BUG_ON(dst_size != dst->buf_size);
if (dst_copy_offset != 0)
memmove(dst->buf + dst_copy_offset, dst->buf, old_size);
SCMemmove(dst->buf + dst_copy_offset, dst->buf_size - dst_copy_offset, dst->buf, old_size);
if (dst_offset != dst->stream_offset) {
dst->stream_offset = dst_offset;
// buf_offset no longer valid, reset.