Remove usage of snprintf() from patty_ax25_ntop()

Remove usage of snprintf() from patty_ax25_ntop() to gain better control
over the behavior of how the 'len' argument and nul terminator are
handled
This commit is contained in:
XANTRONIX Development 2020-09-19 16:27:56 -05:00 committed by XANTRONIX Industrial
parent c98d07e876
commit 02033990a6

View file

@ -1,4 +1,3 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
@ -84,6 +83,21 @@ error_invalid_callsign:
return -1;
}
static inline int expt(int base, int e) {
int ret = base,
i;
if (e == 0) {
return 1;
}
for (i=1; i<e; i++) {
ret *= base;
}
return ret;
}
int patty_ax25_ntop(const patty_ax25_addr *addr,
char *dest,
size_t len) {
@ -96,7 +110,7 @@ int patty_ax25_ntop(const patty_ax25_addr *addr,
uint8_t c;
if (o == len) {
goto error_overflow;
goto error;
}
c = (addr->callsign[i] & 0xfe) >> 1;
@ -109,25 +123,32 @@ int patty_ax25_ntop(const patty_ax25_addr *addr,
}
if (ssid) {
int formatted;
int digits = ssid > 9? 2: 1,
d;
if ((formatted = snprintf(&dest[o], 1 + len - o, "-%d", ssid)) < 0) {
goto error_format_ssid;
} else {
o += formatted;
if (o + 1 + digits > len) {
goto error;
}
dest[o++] = '-';
for (d=0; d<digits; d++) {
int place = expt(10, digits - d - 1),
num = ((int)ssid % (place * 10)) / place;
dest[o++] = num + '0';
}
}
if (o > len) {
goto error_overflow;
goto error;
}
dest[o] = '\0';
return 0;
error_format_ssid:
error_overflow:
error:
errno = EOVERFLOW;
return -1;