Use memccpy() and memcpy() instead of nstr{cpy,lcpy,cat}.
These are standard, either in POSIX or C23. The semantics are slightly different as the error path does not enforce null-termination in the function itself, so enforce that by hand. As a nice side effect, this makes those error paths easier to audit.
This commit is contained in:
parent
e223b4c5a8
commit
7fb968e861
3
cfg.rl
3
cfg.rl
@ -14,14 +14,13 @@
|
||||
#include "ifchd.h"
|
||||
#include "sockd.h"
|
||||
#include "nk/log.h"
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "nk/privs.h"
|
||||
#include "nk/io.h"
|
||||
|
||||
static void copy_cmdarg(char *dest, const char *src,
|
||||
size_t destlen, const char *argname)
|
||||
{
|
||||
if (!nstrcpy(dest, destlen, src))
|
||||
if (!memccpy(dest, src, 0, destlen))
|
||||
suicide("snprintf failed on %s", argname);
|
||||
}
|
||||
|
||||
|
230
ifchd-parse.c
230
ifchd-parse.c
@ -7,18 +7,17 @@
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "nk/log.h"
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "ifchd-parse.h"
|
||||
#include "ifchd.h"
|
||||
#include "ifset.h"
|
||||
#include "ndhc.h"
|
||||
|
||||
|
||||
#line 49 "ifchd-parse.rl"
|
||||
#line 48 "ifchd-parse.rl"
|
||||
|
||||
|
||||
|
||||
#line 22 "ifchd-parse.c"
|
||||
#line 21 "ifchd-parse.c"
|
||||
static const int ipv4set_parser_start = 1;
|
||||
static const int ipv4set_parser_first_final = 43;
|
||||
static const int ipv4set_parser_error = 0;
|
||||
@ -26,7 +25,7 @@ static const int ipv4set_parser_error = 0;
|
||||
static const int ipv4set_parser_en_main = 1;
|
||||
|
||||
|
||||
#line 51 "ifchd-parse.rl"
|
||||
#line 50 "ifchd-parse.rl"
|
||||
|
||||
|
||||
static int perform_ip4set(const char *buf, size_t len)
|
||||
@ -44,15 +43,15 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
bool have_bcast = false;
|
||||
|
||||
|
||||
#line 48 "ifchd-parse.c"
|
||||
#line 47 "ifchd-parse.c"
|
||||
{
|
||||
cs = (int)ipv4set_parser_start;
|
||||
}
|
||||
|
||||
#line 67 "ifchd-parse.rl"
|
||||
#line 66 "ifchd-parse.rl"
|
||||
|
||||
|
||||
#line 56 "ifchd-parse.c"
|
||||
#line 55 "ifchd-parse.c"
|
||||
{
|
||||
switch ( cs ) {
|
||||
case 1:
|
||||
@ -176,10 +175,10 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
goto _out0;
|
||||
_ctr2:
|
||||
{
|
||||
#line 18 "ifchd-parse.rl"
|
||||
#line 17 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 183 "ifchd-parse.c"
|
||||
#line 182 "ifchd-parse.c"
|
||||
|
||||
goto _st2;
|
||||
_st2:
|
||||
@ -301,7 +300,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr13:
|
||||
{
|
||||
#line 19 "ifchd-parse.rl"
|
||||
#line 18 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_addr) {
|
||||
@ -311,7 +310,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_addr[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 315 "ifchd-parse.c"
|
||||
#line 314 "ifchd-parse.c"
|
||||
|
||||
goto _st9;
|
||||
_st9:
|
||||
@ -331,10 +330,10 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr16:
|
||||
{
|
||||
#line 18 "ifchd-parse.rl"
|
||||
#line 17 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 338 "ifchd-parse.c"
|
||||
#line 337 "ifchd-parse.c"
|
||||
|
||||
goto _st10;
|
||||
_st10:
|
||||
@ -438,7 +437,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr49:
|
||||
{
|
||||
#line 27 "ifchd-parse.rl"
|
||||
#line 26 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_subnet) {
|
||||
@ -448,7 +447,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_subnet[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 452 "ifchd-parse.c"
|
||||
#line 451 "ifchd-parse.c"
|
||||
|
||||
goto _st43;
|
||||
_st43:
|
||||
@ -471,7 +470,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr50:
|
||||
{
|
||||
#line 27 "ifchd-parse.rl"
|
||||
#line 26 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_subnet) {
|
||||
@ -481,7 +480,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_subnet[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 485 "ifchd-parse.c"
|
||||
#line 484 "ifchd-parse.c"
|
||||
|
||||
goto _st16;
|
||||
_st16:
|
||||
@ -501,10 +500,10 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr28:
|
||||
{
|
||||
#line 18 "ifchd-parse.rl"
|
||||
#line 17 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 508 "ifchd-parse.c"
|
||||
#line 507 "ifchd-parse.c"
|
||||
|
||||
goto _st17;
|
||||
_st17:
|
||||
@ -608,7 +607,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr52:
|
||||
{
|
||||
#line 35 "ifchd-parse.rl"
|
||||
#line 34 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_bcast) {
|
||||
@ -618,7 +617,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_bcast[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 622 "ifchd-parse.c"
|
||||
#line 621 "ifchd-parse.c"
|
||||
|
||||
goto _st44;
|
||||
_st44:
|
||||
@ -638,7 +637,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr54:
|
||||
{
|
||||
#line 35 "ifchd-parse.rl"
|
||||
#line 34 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_bcast) {
|
||||
@ -648,7 +647,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_bcast[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 652 "ifchd-parse.c"
|
||||
#line 651 "ifchd-parse.c"
|
||||
|
||||
goto _st45;
|
||||
_st45:
|
||||
@ -668,7 +667,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr56:
|
||||
{
|
||||
#line 35 "ifchd-parse.rl"
|
||||
#line 34 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_bcast) {
|
||||
@ -678,7 +677,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_bcast[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 682 "ifchd-parse.c"
|
||||
#line 681 "ifchd-parse.c"
|
||||
|
||||
goto _st46;
|
||||
_st46:
|
||||
@ -794,7 +793,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr57:
|
||||
{
|
||||
#line 27 "ifchd-parse.rl"
|
||||
#line 26 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_subnet) {
|
||||
@ -804,7 +803,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_subnet[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 808 "ifchd-parse.c"
|
||||
#line 807 "ifchd-parse.c"
|
||||
|
||||
goto _st47;
|
||||
_st47:
|
||||
@ -827,7 +826,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
_ctr59:
|
||||
{
|
||||
#line 27 "ifchd-parse.rl"
|
||||
#line 26 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t arg_len = p - arg_start;
|
||||
if (arg_len > 0 && (size_t)arg_len < sizeof ip4_subnet) {
|
||||
@ -837,7 +836,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
ip4_subnet[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 841 "ifchd-parse.c"
|
||||
#line 840 "ifchd-parse.c"
|
||||
|
||||
goto _st48;
|
||||
_st48:
|
||||
@ -1138,7 +1137,7 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
_out: {}
|
||||
}
|
||||
|
||||
#line 68 "ifchd-parse.rl"
|
||||
#line 67 "ifchd-parse.rl"
|
||||
|
||||
|
||||
if (cs < ipv4set_parser_first_final) {
|
||||
@ -1161,11 +1160,11 @@ static int perform_ip4set(const char *buf, size_t len)
|
||||
}
|
||||
|
||||
|
||||
#line 159 "ifchd-parse.rl"
|
||||
#line 158 "ifchd-parse.rl"
|
||||
|
||||
|
||||
|
||||
#line 1169 "ifchd-parse.c"
|
||||
#line 1168 "ifchd-parse.c"
|
||||
static const int ifchd_parser_start = 1;
|
||||
static const int ifchd_parser_first_final = 126;
|
||||
static const int ifchd_parser_error = 0;
|
||||
@ -1173,7 +1172,7 @@ static const int ifchd_parser_error = 0;
|
||||
static const int ifchd_parser_en_main = 1;
|
||||
|
||||
|
||||
#line 161 "ifchd-parse.rl"
|
||||
#line 160 "ifchd-parse.rl"
|
||||
|
||||
|
||||
/*
|
||||
@ -1187,14 +1186,14 @@ int execute_buffer(const char *newbuf)
|
||||
char tb[MAX_BUF];
|
||||
int cmdf = 0;
|
||||
|
||||
char *snp = nstrcpy(buf, sizeof buf, cl.ibuf);
|
||||
char *snp = memccpy(buf, cl.ibuf, 0, sizeof buf);
|
||||
memset(cl.ibuf, 0, sizeof cl.ibuf);
|
||||
if (!snp) {
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
if (!nstrcat(buf, sizeof buf, newbuf)) {
|
||||
log_line("%s: (%s) nstrcat failed", client_config.interface, __func__);
|
||||
if (!memccpy(snp - 1, newbuf, 0, sizeof buf - (size_t)(snp - buf - 1))) {
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
|
||||
@ -1206,15 +1205,15 @@ int execute_buffer(const char *newbuf)
|
||||
int cs = 0;
|
||||
|
||||
|
||||
#line 1210 "ifchd-parse.c"
|
||||
#line 1209 "ifchd-parse.c"
|
||||
{
|
||||
cs = (int)ifchd_parser_start;
|
||||
}
|
||||
|
||||
#line 192 "ifchd-parse.rl"
|
||||
#line 191 "ifchd-parse.rl"
|
||||
|
||||
|
||||
#line 1218 "ifchd-parse.c"
|
||||
#line 1217 "ifchd-parse.c"
|
||||
{
|
||||
switch ( cs ) {
|
||||
case 1:
|
||||
@ -1514,10 +1513,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _out0;
|
||||
_ctr2:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 1521 "ifchd-parse.c"
|
||||
#line 1520 "ifchd-parse.c"
|
||||
|
||||
goto _st2;
|
||||
_st2:
|
||||
@ -1594,13 +1593,13 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr20:
|
||||
{
|
||||
#line 155 "ifchd-parse.rl"
|
||||
#line 154 "ifchd-parse.rl"
|
||||
cl.state = STATE_CARRIER; }
|
||||
|
||||
#line 1601 "ifchd-parse.c"
|
||||
#line 1600 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 105 "ifchd-parse.rl"
|
||||
#line 104 "ifchd-parse.rl"
|
||||
|
||||
int pr = 0;
|
||||
cmd_start = p + 1;
|
||||
@ -1628,12 +1627,12 @@ int execute_buffer(const char *newbuf)
|
||||
cmdf |= pr;
|
||||
}
|
||||
|
||||
#line 1632 "ifchd-parse.c"
|
||||
#line 1631 "ifchd-parse.c"
|
||||
|
||||
goto _st126;
|
||||
_ctr39:
|
||||
{
|
||||
#line 94 "ifchd-parse.rl"
|
||||
#line 93 "ifchd-parse.rl"
|
||||
|
||||
ptrdiff_t al = p - arg_start;
|
||||
if (al < 0 || (size_t)al > sizeof tb - 1) {
|
||||
@ -1645,10 +1644,10 @@ int execute_buffer(const char *newbuf)
|
||||
tb[arg_len] = 0;
|
||||
}
|
||||
|
||||
#line 1649 "ifchd-parse.c"
|
||||
#line 1648 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 105 "ifchd-parse.rl"
|
||||
#line 104 "ifchd-parse.rl"
|
||||
|
||||
int pr = 0;
|
||||
cmd_start = p + 1;
|
||||
@ -1676,7 +1675,7 @@ int execute_buffer(const char *newbuf)
|
||||
cmdf |= pr;
|
||||
}
|
||||
|
||||
#line 1680 "ifchd-parse.c"
|
||||
#line 1679 "ifchd-parse.c"
|
||||
|
||||
goto _st126;
|
||||
_st126:
|
||||
@ -1719,10 +1718,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr3:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 1726 "ifchd-parse.c"
|
||||
#line 1725 "ifchd-parse.c"
|
||||
|
||||
goto _st10;
|
||||
_st10:
|
||||
@ -1768,58 +1767,58 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr26:
|
||||
{
|
||||
#line 144 "ifchd-parse.rl"
|
||||
#line 143 "ifchd-parse.rl"
|
||||
cl.state = STATE_DNS; }
|
||||
|
||||
#line 1775 "ifchd-parse.c"
|
||||
#line 1774 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 1781 "ifchd-parse.c"
|
||||
#line 1780 "ifchd-parse.c"
|
||||
|
||||
goto _st14;
|
||||
_ctr115:
|
||||
{
|
||||
#line 145 "ifchd-parse.rl"
|
||||
#line 144 "ifchd-parse.rl"
|
||||
cl.state = STATE_LPRSVR; }
|
||||
|
||||
#line 1789 "ifchd-parse.c"
|
||||
#line 1788 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 1795 "ifchd-parse.c"
|
||||
#line 1794 "ifchd-parse.c"
|
||||
|
||||
goto _st14;
|
||||
_ctr126:
|
||||
{
|
||||
#line 146 "ifchd-parse.rl"
|
||||
#line 145 "ifchd-parse.rl"
|
||||
cl.state = STATE_NTPSVR; }
|
||||
|
||||
#line 1803 "ifchd-parse.c"
|
||||
#line 1802 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 1809 "ifchd-parse.c"
|
||||
#line 1808 "ifchd-parse.c"
|
||||
|
||||
goto _st14;
|
||||
_ctr148:
|
||||
{
|
||||
#line 147 "ifchd-parse.rl"
|
||||
#line 146 "ifchd-parse.rl"
|
||||
cl.state = STATE_WINS; }
|
||||
|
||||
#line 1817 "ifchd-parse.c"
|
||||
#line 1816 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 1823 "ifchd-parse.c"
|
||||
#line 1822 "ifchd-parse.c"
|
||||
|
||||
goto _st14;
|
||||
_st14:
|
||||
@ -2039,30 +2038,30 @@ int execute_buffer(const char *newbuf)
|
||||
goto _ctr46;
|
||||
_ctr46:
|
||||
{
|
||||
#line 150 "ifchd-parse.rl"
|
||||
#line 149 "ifchd-parse.rl"
|
||||
cl.state = STATE_DOMAIN; }
|
||||
|
||||
#line 2046 "ifchd-parse.c"
|
||||
#line 2045 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2052 "ifchd-parse.c"
|
||||
#line 2051 "ifchd-parse.c"
|
||||
|
||||
goto _st33;
|
||||
_ctr53:
|
||||
{
|
||||
#line 149 "ifchd-parse.rl"
|
||||
#line 148 "ifchd-parse.rl"
|
||||
cl.state = STATE_HOSTNAME; }
|
||||
|
||||
#line 2060 "ifchd-parse.c"
|
||||
#line 2059 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2066 "ifchd-parse.c"
|
||||
#line 2065 "ifchd-parse.c"
|
||||
|
||||
goto _st33;
|
||||
_st33:
|
||||
@ -2081,10 +2080,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st33;
|
||||
_ctr4:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2088 "ifchd-parse.c"
|
||||
#line 2087 "ifchd-parse.c"
|
||||
|
||||
goto _st34;
|
||||
_st34:
|
||||
@ -2139,10 +2138,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _ctr53;
|
||||
_ctr5:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2146 "ifchd-parse.c"
|
||||
#line 2145 "ifchd-parse.c"
|
||||
|
||||
goto _st39;
|
||||
_st39:
|
||||
@ -2188,16 +2187,16 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr59:
|
||||
{
|
||||
#line 143 "ifchd-parse.rl"
|
||||
#line 142 "ifchd-parse.rl"
|
||||
cl.state = STATE_IP4SET; }
|
||||
|
||||
#line 2195 "ifchd-parse.c"
|
||||
#line 2194 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2201 "ifchd-parse.c"
|
||||
#line 2200 "ifchd-parse.c"
|
||||
|
||||
goto _st43;
|
||||
_st43:
|
||||
@ -2375,16 +2374,16 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr133:
|
||||
{
|
||||
#line 142 "ifchd-parse.rl"
|
||||
#line 141 "ifchd-parse.rl"
|
||||
cl.state = STATE_ROUTER; }
|
||||
|
||||
#line 2382 "ifchd-parse.c"
|
||||
#line 2381 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2388 "ifchd-parse.c"
|
||||
#line 2387 "ifchd-parse.c"
|
||||
|
||||
goto _st59;
|
||||
_st59:
|
||||
@ -2476,16 +2475,16 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr110:
|
||||
{
|
||||
#line 154 "ifchd-parse.rl"
|
||||
#line 153 "ifchd-parse.rl"
|
||||
cl.state = STATE_IPTTL; }
|
||||
|
||||
#line 2483 "ifchd-parse.c"
|
||||
#line 2482 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2489 "ifchd-parse.c"
|
||||
#line 2488 "ifchd-parse.c"
|
||||
|
||||
goto _st67;
|
||||
_st67:
|
||||
@ -2773,10 +2772,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _ctr110;
|
||||
_ctr6:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2780 "ifchd-parse.c"
|
||||
#line 2779 "ifchd-parse.c"
|
||||
|
||||
goto _st94;
|
||||
_st94:
|
||||
@ -2817,10 +2816,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr7:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2824 "ifchd-parse.c"
|
||||
#line 2823 "ifchd-parse.c"
|
||||
|
||||
goto _st98;
|
||||
_st98:
|
||||
@ -2858,16 +2857,16 @@ int execute_buffer(const char *newbuf)
|
||||
goto _ctr120;
|
||||
_ctr120:
|
||||
{
|
||||
#line 153 "ifchd-parse.rl"
|
||||
#line 152 "ifchd-parse.rl"
|
||||
cl.state = STATE_MTU; }
|
||||
|
||||
#line 2865 "ifchd-parse.c"
|
||||
#line 2864 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 2871 "ifchd-parse.c"
|
||||
#line 2870 "ifchd-parse.c"
|
||||
|
||||
goto _st102;
|
||||
_st102:
|
||||
@ -2878,10 +2877,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st67;
|
||||
_ctr8:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2885 "ifchd-parse.c"
|
||||
#line 2884 "ifchd-parse.c"
|
||||
|
||||
goto _st103;
|
||||
_st103:
|
||||
@ -2922,10 +2921,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr9:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2929 "ifchd-parse.c"
|
||||
#line 2928 "ifchd-parse.c"
|
||||
|
||||
goto _st107;
|
||||
_st107:
|
||||
@ -2984,10 +2983,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st0;
|
||||
_ctr10:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 2991 "ifchd-parse.c"
|
||||
#line 2990 "ifchd-parse.c"
|
||||
|
||||
goto _st113;
|
||||
_st113:
|
||||
@ -3043,16 +3042,16 @@ int execute_buffer(const char *newbuf)
|
||||
goto _ctr140;
|
||||
_ctr140:
|
||||
{
|
||||
#line 152 "ifchd-parse.rl"
|
||||
#line 151 "ifchd-parse.rl"
|
||||
cl.state = STATE_TIMEZONE; }
|
||||
|
||||
#line 3050 "ifchd-parse.c"
|
||||
#line 3049 "ifchd-parse.c"
|
||||
|
||||
{
|
||||
#line 93 "ifchd-parse.rl"
|
||||
#line 92 "ifchd-parse.rl"
|
||||
arg_start = p; }
|
||||
|
||||
#line 3056 "ifchd-parse.c"
|
||||
#line 3055 "ifchd-parse.c"
|
||||
|
||||
goto _st119;
|
||||
_st119:
|
||||
@ -3069,10 +3068,10 @@ int execute_buffer(const char *newbuf)
|
||||
goto _st102;
|
||||
_ctr11:
|
||||
{
|
||||
#line 92 "ifchd-parse.rl"
|
||||
#line 91 "ifchd-parse.rl"
|
||||
cl.state = STATE_NOTHING; }
|
||||
|
||||
#line 3076 "ifchd-parse.c"
|
||||
#line 3075 "ifchd-parse.c"
|
||||
|
||||
goto _st121;
|
||||
_st121:
|
||||
@ -3250,7 +3249,7 @@ int execute_buffer(const char *newbuf)
|
||||
_out: {}
|
||||
}
|
||||
|
||||
#line 193 "ifchd-parse.rl"
|
||||
#line 192 "ifchd-parse.rl"
|
||||
|
||||
|
||||
if (cs == ifchd_parser_error) {
|
||||
@ -3260,8 +3259,9 @@ int execute_buffer(const char *newbuf)
|
||||
}
|
||||
|
||||
if (cmd_start != pe) {
|
||||
if (!nstrcpy(cl.ibuf, sizeof cl.ibuf, cmd_start)) {
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
if (!memccpy(cl.ibuf, cmd_start, 0, sizeof cl.ibuf)) {
|
||||
memset(cl.ibuf, 0, sizeof cl.ibuf);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "nk/log.h"
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "ifchd-parse.h"
|
||||
#include "ifchd.h"
|
||||
#include "ifset.h"
|
||||
@ -171,14 +170,14 @@ int execute_buffer(const char *newbuf)
|
||||
char tb[MAX_BUF];
|
||||
int cmdf = 0;
|
||||
|
||||
char *snp = nstrcpy(buf, sizeof buf, cl.ibuf);
|
||||
char *snp = memccpy(buf, cl.ibuf, 0, sizeof buf);
|
||||
memset(cl.ibuf, 0, sizeof cl.ibuf);
|
||||
if (!snp) {
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
if (!nstrcat(buf, sizeof buf, newbuf)) {
|
||||
log_line("%s: (%s) nstrcat failed", client_config.interface, __func__);
|
||||
if (!memccpy(snp - 1, newbuf, 0, sizeof buf - (size_t)(snp - buf - 1))) {
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
|
||||
@ -199,8 +198,9 @@ int execute_buffer(const char *newbuf)
|
||||
}
|
||||
|
||||
if (cmd_start != pe) {
|
||||
if (!nstrcpy(cl.ibuf, sizeof cl.ibuf, cmd_start)) {
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
if (!memccpy(cl.ibuf, cmd_start, 0, sizeof cl.ibuf)) {
|
||||
memset(cl.ibuf, 0, sizeof cl.ibuf);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return -99;
|
||||
}
|
||||
}
|
||||
|
27
ifchd.c
27
ifchd.c
@ -14,7 +14,6 @@
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "nk/log.h"
|
||||
#include "nk/privs.h"
|
||||
#include "nk/io.h"
|
||||
@ -103,9 +102,10 @@ static int write_resolve_conf(void)
|
||||
q = strchr(p, '\0');
|
||||
else
|
||||
*q++ = '\0';
|
||||
if (!nstrcpy(buf, sizeof buf, p)) {
|
||||
log_line("%s: (%s) nstrcpy failed appending nameservers",
|
||||
if (!memccpy(buf, p, 0, sizeof buf)) {
|
||||
log_line("%s: (%s) memccpy failed appending nameservers",
|
||||
client_config.interface, __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
writeordie(resolv_conf_fd, ns_str, strlen(ns_str));
|
||||
@ -123,9 +123,10 @@ static int write_resolve_conf(void)
|
||||
q = strchr(p, '\0');
|
||||
else
|
||||
*q++ = '\0';
|
||||
if (!nstrcpy(buf, sizeof buf, p)) {
|
||||
log_line("%s: (%s) nstrcpy failed appending domains",
|
||||
if (!memccpy(buf, p, 0, sizeof buf)) {
|
||||
log_line("%s: (%s) memccpy failed appending domains",
|
||||
client_config.interface, __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (numdoms == 0) {
|
||||
@ -188,8 +189,11 @@ int perform_dns(const char *str, size_t len)
|
||||
log_line("DNS server list is too long: %zu > %zu", len, sizeof cl.namesvrs);
|
||||
return ret;
|
||||
}
|
||||
if (!nstrcpy(cl.namesvrs, sizeof cl.namesvrs, str))
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
if (!memccpy(cl.namesvrs, str, 0, sizeof cl.namesvrs)) {
|
||||
memset(cl.namesvrs, 0, sizeof cl.namesvrs);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return ret;
|
||||
}
|
||||
ret = write_resolve_conf();
|
||||
if (ret >= 0)
|
||||
log_line("Added DNS server: '%s'", str);
|
||||
@ -224,11 +228,14 @@ int perform_domain(const char *str, size_t len)
|
||||
return 0;
|
||||
int ret = -1;
|
||||
if (len > sizeof cl.domains) {
|
||||
log_line("DNS domain list is too long: %zu > %zu", len, sizeof cl.namesvrs);
|
||||
log_line("DNS domain list is too long: %zu > %zu", len, sizeof cl.domains);
|
||||
return ret;
|
||||
}
|
||||
if (!memccpy(cl.domains, str, 0, sizeof cl.domains)) {
|
||||
memset(cl.domains, 0, sizeof cl.domains);
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return ret;
|
||||
}
|
||||
if (!nstrcpy(cl.domains, sizeof cl.domains, str))
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
ret = write_resolve_conf();
|
||||
if (ret == 0)
|
||||
log_line("Added DNS domain: '%s'", str);
|
||||
|
23
leasefile.c
23
leasefile.c
@ -11,7 +11,6 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "nk/log.h"
|
||||
#include "nk/io.h"
|
||||
#include "leasefile.h"
|
||||
@ -22,12 +21,12 @@ static int leasefilefd = -1;
|
||||
|
||||
static void get_leasefile_path(char *leasefile, size_t dlen, char *ifname)
|
||||
{
|
||||
if (!nstrcpy(leasefile, dlen, state_dir))
|
||||
suicide("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
if (!nstrcat(leasefile, dlen, "/LEASE-"))
|
||||
suicide("%s: (%s) nstrcat1 failed", client_config.interface, __func__);
|
||||
if (!nstrcat(leasefile, dlen, ifname))
|
||||
suicide("%s: (%s) nstrcat2 failed", client_config.interface, __func__);
|
||||
char *p = memccpy(leasefile, state_dir, 0, dlen);
|
||||
if (!p) suicide("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
p = memccpy(p - 1, "/LEASE-", 0, dlen - (size_t)(p - leasefile - 1));
|
||||
if (!p) suicide("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
p = memccpy(p - 1, ifname, 0, dlen - (size_t)(p - leasefile - 1));
|
||||
if (!p) suicide("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
}
|
||||
|
||||
void open_leasefile(void)
|
||||
@ -50,12 +49,14 @@ static void do_write_leasefile(struct in_addr ipnum)
|
||||
return;
|
||||
}
|
||||
inet_ntop(AF_INET, &ipnum, ip, sizeof ip);
|
||||
if (!nstrcpy(out, sizeof out, ip)) {
|
||||
log_line("%s: (%s) nstrcpy failed", client_config.interface, __func__);
|
||||
char *p = memccpy(out, ip, 0, sizeof out);
|
||||
if (!p) {
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return;
|
||||
}
|
||||
if (!nstrcat(out, sizeof out, "\n")) {
|
||||
log_line("%s: (%s) nstrcat failed", client_config.interface, __func__);
|
||||
p = memccpy(p - 1, "\n", 0, sizeof out - (size_t)(p - out - 1));
|
||||
if (!p) {
|
||||
log_line("%s: (%s) memccpy failed", client_config.interface, __func__);
|
||||
return;
|
||||
}
|
||||
if (safe_ftruncate(leasefilefd, 0)) {
|
||||
|
52
nk/nstrcpy.h
52
nk/nstrcpy.h
@ -1,52 +0,0 @@
|
||||
#ifndef NKLIB_NSTRCPY_H_
|
||||
#define NKLIB_NSTRCPY_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
// Returns pointer to end of dest string (NULL terminator) if
|
||||
// src is not truncated when copying to dest.
|
||||
// Otherwise, returns NULL if src is truncated or size == 0.
|
||||
static inline char *nstrcpy(char *dest, size_t size, const char *src)
|
||||
{
|
||||
if (!size) return NULL;
|
||||
char c;
|
||||
for (size_t i = 0; i < size; ++i, ++dest) {
|
||||
c = *src++;
|
||||
*dest = c;
|
||||
if (!c) return dest;
|
||||
}
|
||||
*(dest - 1) = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Same semantics as above, except we append to dest.
|
||||
static inline char *nstrcat(char *dest, size_t size, const char *src)
|
||||
{
|
||||
size_t len = strlen(dest);
|
||||
return nstrcpy(dest + len, size - len, src);
|
||||
}
|
||||
|
||||
// Acts as nstrcpy, but does not require src to be NULL terminated.
|
||||
// That said, it will stop early if src contains a NULL terminator.
|
||||
static inline char *nstrcpyl(char *dest, size_t dsize, const char *src, size_t ssize)
|
||||
{
|
||||
if (!dsize) return NULL;
|
||||
char c;
|
||||
size_t i = 0, j = 0;
|
||||
for (; i < dsize && j < ssize; ++i, ++j, ++dest) {
|
||||
c = *src++;
|
||||
*dest = c;
|
||||
if (!c) return dest;
|
||||
}
|
||||
if (i == dsize) {
|
||||
*(dest - 1) = 0;
|
||||
return NULL;
|
||||
}
|
||||
// j == ssize here
|
||||
*dest = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
12
nk/pspawn.c
12
nk/pspawn.c
@ -5,7 +5,6 @@
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "nk/pspawn.h"
|
||||
#include "nk/io.h"
|
||||
|
||||
@ -13,15 +12,16 @@
|
||||
#define MAX_ARGBUF 16384
|
||||
|
||||
#define NK_GEN_ARG(STRVAL, STRLEN) do { \
|
||||
char *snp = nstrcpyl(argbuf, argbuflen, STRVAL, STRLEN); \
|
||||
if (!snp) { \
|
||||
static const char errstr[] = "nk_pspawn: constructing argument list failed\n"; \
|
||||
size_t SL = (STRLEN); \
|
||||
if (argbuflen < SL + 1) { \
|
||||
static const char errstr[] = "nk_pspawn: argument list too long\n"; \
|
||||
safe_write(STDERR_FILENO, errstr, sizeof errstr); \
|
||||
_Exit(EXIT_FAILURE); \
|
||||
} \
|
||||
memcpy(argbuf, (STRVAL), SL); \
|
||||
argbuf[SL] = 0; \
|
||||
argv[curv] = argbuf; argv[++curv] = NULL; \
|
||||
size_t l = (size_t)(snp - argbuf); \
|
||||
argbuf += l; argbuflen -= l; \
|
||||
argbuf += SL; argbuflen -= SL; \
|
||||
} while (0)
|
||||
|
||||
int nk_pspawn(pid_t *pid, const char *command,
|
||||
|
3
sockd.c
3
sockd.c
@ -26,7 +26,6 @@
|
||||
#include "nk/log.h"
|
||||
#include "nk/io.h"
|
||||
#include "nk/privs.h"
|
||||
#include "nk/nstrcpy.h"
|
||||
#include "sockd.h"
|
||||
#include "ndhc-defines.h"
|
||||
#include "ndhc.h"
|
||||
@ -142,7 +141,7 @@ static int create_udp_socket(uint32_t ip, uint16_t port, char *iface)
|
||||
}
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof ifr);
|
||||
if (!nstrcpy(ifr.ifr_name, sizeof ifr.ifr_name, iface)) {
|
||||
if (!memccpy(ifr.ifr_name, iface, 0, sizeof ifr.ifr_name)) {
|
||||
log_line("%s: (%s) Set interface name failed.",
|
||||
client_config.interface, __func__);
|
||||
goto out_fd;
|
||||
|
Loading…
Reference in New Issue
Block a user