X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/665b5651a8ac6a10de9cacbdb1af51134abcdb97..refs/pull/433/head:/cpack.c?ds=sidebyside diff --git a/cpack.c b/cpack.c index d2e765d4..16bfd151 100644 --- a/cpack.c +++ b/cpack.c @@ -27,18 +27,20 @@ * OF SUCH DAMAGE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include +#include #include #include "cpack.h" #include "extract.h" -static u_int8_t * -cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment) +uint8_t * +cpack_next_boundary(uint8_t *buf, uint8_t *p, size_t alignment) { size_t misalignment = (size_t)(p - buf) % alignment; @@ -52,10 +54,10 @@ cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment) * wordsize bytes remain in the buffer after the boundary. Otherwise, * return a pointer to the boundary. */ -static u_int8_t * +uint8_t * cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize) { - u_int8_t *next; + uint8_t *next; /* Ensure alignment. */ next = cpack_next_boundary(cs->c_buf, cs->c_next, wordsize); @@ -67,8 +69,19 @@ cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize) return next; } +/* Advance by N bytes without returning them. */ int -cpack_init(struct cpack_state *cs, u_int8_t *buf, size_t buflen) +cpack_advance(struct cpack_state *cs, const size_t toskip) +{ + /* No space left? */ + if (cs->c_next - cs->c_buf + toskip > cs->c_len) + return -1; + cs->c_next += toskip; + return 0; +} + +int +cpack_init(struct cpack_state *cs, uint8_t *buf, size_t buflen) { memset(cs, 0, sizeof(*cs)); @@ -81,63 +94,63 @@ cpack_init(struct cpack_state *cs, u_int8_t *buf, size_t buflen) /* Unpack a 64-bit unsigned integer. */ int -cpack_uint64(struct cpack_state *cs, u_int64_t *u) +cpack_uint64(struct cpack_state *cs, uint64_t *u) { - u_int8_t *next; + uint8_t *next; if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; *u = EXTRACT_LE_64BITS(next); - /* Move pointer past the u_int64_t. */ + /* Move pointer past the uint64_t. */ cs->c_next = next + sizeof(*u); return 0; } /* Unpack a 32-bit unsigned integer. */ int -cpack_uint32(struct cpack_state *cs, u_int32_t *u) +cpack_uint32(struct cpack_state *cs, uint32_t *u) { - u_int8_t *next; + uint8_t *next; if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; *u = EXTRACT_LE_32BITS(next); - /* Move pointer past the u_int32_t. */ + /* Move pointer past the uint32_t. */ cs->c_next = next + sizeof(*u); return 0; } /* Unpack a 16-bit unsigned integer. */ int -cpack_uint16(struct cpack_state *cs, u_int16_t *u) +cpack_uint16(struct cpack_state *cs, uint16_t *u) { - u_int8_t *next; + uint8_t *next; if ((next = cpack_align_and_reserve(cs, sizeof(*u))) == NULL) return -1; *u = EXTRACT_LE_16BITS(next); - /* Move pointer past the u_int16_t. */ + /* Move pointer past the uint16_t. */ cs->c_next = next + sizeof(*u); return 0; } /* Unpack an 8-bit unsigned integer. */ int -cpack_uint8(struct cpack_state *cs, u_int8_t *u) +cpack_uint8(struct cpack_state *cs, uint8_t *u) { /* No space left? */ - if (cs->c_next - cs->c_buf >= cs->c_len) + if ((size_t)(cs->c_next - cs->c_buf) >= cs->c_len) return -1; *u = *cs->c_next; - /* Move pointer past the u_int8_t. */ + /* Move pointer past the uint8_t. */ cs->c_next++; return 0; }