diff --git a/include/patty/ax25.h b/include/patty/ax25.h index b6daa20..b44c0c7 100644 --- a/include/patty/ax25.h +++ b/include/patty/ax25.h @@ -12,7 +12,7 @@ #pragma pack(1) typedef struct _patty_ax25_addr { - uint8_t callsign[6]; + char callsign[6]; uint8_t ssid; } patty_ax25_addr; diff --git a/src/ax25.c b/src/ax25.c index 0606c55..b9d6bbd 100644 --- a/src/ax25.c +++ b/src/ax25.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -252,13 +251,13 @@ int patty_ax25_ntop(const patty_ax25_addr *addr, goto error_invalid_args; } else if (c == ' ' && !space) { space = 1; - } else if (space) { + } else if (c != ' ' && space) { errno = EINVAL; goto error_invalid_args; } - dest[o++] = c; + dest[o++] = space? '\0': c; } dest[o] = '\0'; diff --git a/src/frame.c b/src/frame.c index 1859118..f5a8f35 100644 --- a/src/frame.c +++ b/src/frame.c @@ -19,7 +19,7 @@ static ssize_t validate_station(void *data, if (c == ' ' && !space) { space = 1; - } else if (space) { + } else if (c != ' ' && space) { errno = EINVAL; goto error; @@ -52,6 +52,8 @@ static ssize_t decode_hops(patty_ax25_frame *frame, if ((decoded = validate_station(data, offset)) < 0) { goto error; } else { + memcpy(&frame->repeaters[i], addr, sizeof(*addr)); + offset += decoded; } @@ -66,7 +68,7 @@ static ssize_t decode_hops(patty_ax25_frame *frame, * If the last hop does not have the address extension bit set, then * that's a big problem. */ - if (addr && PATTY_AX25_ADDRESS_OCTET_LAST(addr->ssid)) { + if (addr && !PATTY_AX25_ADDRESS_OCTET_LAST(addr->ssid)) { errno = EINVAL; goto error; @@ -87,12 +89,16 @@ static ssize_t decode_address(patty_ax25_frame *frame, if ((decoded = validate_station(data, offset)) < 0) { goto error; } else { + memcpy(&frame->dest, ((uint8_t *)data) + offset, sizeof(frame->dest)); + offset += decoded; } if ((decoded = validate_station(data, offset)) < 0) { goto error; } else { + memcpy(&frame->src, ((uint8_t *)data) + offset, sizeof(frame->src)); + offset += decoded; }