it's all just kinda clicking into place

This commit is contained in:
XANTRONIX Development 2019-01-23 21:42:16 -06:00
parent 188bc92972
commit c7be44cd1c
3 changed files with 25 additions and 19 deletions

View file

@ -23,7 +23,7 @@ static void usage(int argc, char **argv, const char *message, ...) {
exit(1); exit(1);
} }
static int handle_block(int fd, uint32_t type, size_t len, int *error) { static ssize_t handle_block(int fd, uint32_t type, size_t len, int *error) {
hexagram_pcapng_packet header; hexagram_pcapng_packet header;
uint8_t packet[65535]; uint8_t packet[65535];

View file

@ -18,7 +18,8 @@ typedef struct _hexagram_pcapng_option {
typedef ssize_t (hexagram_pcapng_option_handler)(int fd, typedef ssize_t (hexagram_pcapng_option_handler)(int fd,
uint16_t code, uint16_t code,
uint16_t length); uint16_t length,
int *error);
ssize_t hexagram_pcapng_option_read(int fd, ssize_t hexagram_pcapng_option_read(int fd,
hexagram_pcapng_option_handler *handler, hexagram_pcapng_option_handler *handler,

View file

@ -23,7 +23,6 @@ ssize_t hexagram_pcapng_option_read(int fd,
ssize_t total = 0; ssize_t total = 0;
while (total < len) { while (total < len) {
size_t expected;
ssize_t readlen; ssize_t readlen;
if ((readlen = read(fd, &header, sizeof(header))) < 0) { if ((readlen = read(fd, &header, sizeof(header))) < 0) {
@ -34,20 +33,23 @@ ssize_t hexagram_pcapng_option_read(int fd,
total += readlen; total += readlen;
} }
expected = header.length + (header.length % sizeof(uint32_t)); if ((readlen = handler(fd, header.code, header.length, error)) < 0) {
if ((readlen = handler(fd, header.code, expected, error)) < 0) {
goto error_io; goto error_io;
} else if (readlen < expected) { } else if (readlen < header.length) {
*error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED; *error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED;
goto error_io; goto error_io;
} else { } else {
total += readlen; total += readlen;
} }
if ((readlen = lseek(fd, header.length % sizeof(uint32_t), SEEK_CUR)) < 0) {
goto error_io;
} else {
total += readlen;
}
} }
done:
*error = HEXAGRAM_PCAPNG_ERROR_OK; *error = HEXAGRAM_PCAPNG_ERROR_OK;
return total; return total;
@ -71,16 +73,15 @@ error_malloc_stream:
return NULL; return NULL;
} }
ssize_t hexagram_pcapng_stream_read(fd, handler, error) ssize_t hexagram_pcapng_stream_read(int fd,
int fd; hexagram_pcapng_block_handler *handler,
hexagram_pcapng_block_handler *handler; int *error) {
int *error;
{
hexagram_pcapng_block_header header; hexagram_pcapng_block_header header;
hexagram_pcapng_block_footer footer; hexagram_pcapng_block_footer footer;
ssize_t total = 0; ssize_t total = 0;
while (1) { while (1) {
size_t expected;
ssize_t readlen; ssize_t readlen;
if ((readlen = read(fd, &header, sizeof(header))) < 0) { if ((readlen = read(fd, &header, sizeof(header))) < 0) {
@ -93,12 +94,16 @@ ssize_t hexagram_pcapng_stream_read(fd, handler, error)
*error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED; *error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED;
goto error_io; goto error_io;
} else {
total += readlen;
} }
total += readlen; expected = header.length - sizeof(header) - sizeof(footer);
if (handler(fd, header.type, header.length - sizeof(header) - sizeof(footer), error) < 0) { if ((readlen = handler(fd, header.type, expected, error)) < 0) {
goto error_io; goto error_io;
} else {
total += readlen;
} }
if ((readlen = read(fd, &footer, sizeof(footer))) < 0) { if ((readlen = read(fd, &footer, sizeof(footer))) < 0) {
@ -111,18 +116,18 @@ ssize_t hexagram_pcapng_stream_read(fd, handler, error)
*error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED; *error = HEXAGRAM_PCAPNG_ERROR_TRUNCATED;
goto error_io; goto error_io;
} } else if (footer.length != header.length) {
if (footer.length != header.length) {
*error = HEXAGRAM_PCAPNG_ERROR_FORMAT; *error = HEXAGRAM_PCAPNG_ERROR_FORMAT;
goto error_io; goto error_io;
} else {
total += readlen;
} }
} }
done:
*error = HEXAGRAM_PCAPNG_ERROR_OK; *error = HEXAGRAM_PCAPNG_ERROR_OK;
done:
return total; return total;
error_io: error_io: