ifconfig: warn if setting an Internet address without mask
Add a postproc function for af_inet, and add interface flags as a parameter. Check there if setting an address without a mask unless the interface is loopback or point-to-point, where mask is not really meaningful; warn if so. This will hopefully be an error in the future. MFC after: 1 month Reviewd by: bz Differential Revision: https://reviews.freebsd.org/D32709
This commit is contained in:
parent
20d5940396
commit
d8237b9555
@ -175,6 +175,16 @@ in_getaddr(const char *s, int which)
|
||||
errx(1, "%s: bad value", s);
|
||||
}
|
||||
|
||||
static void
|
||||
in_postproc(int s, const struct afswtch *afp, int newaddr, int ifflags)
|
||||
{
|
||||
if (sintab[ADDR]->sin_len != 0 && sintab[MASK]->sin_len == 0 &&
|
||||
newaddr && (ifflags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0) {
|
||||
warnx("WARNING: setting interface address without mask "
|
||||
"is deprecated,\ndefault mask may not be correct.");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
in_status_tunnel(int s)
|
||||
{
|
||||
@ -222,6 +232,7 @@ static struct afswtch af_inet = {
|
||||
.af_af = AF_INET,
|
||||
.af_status = in_status,
|
||||
.af_getaddr = in_getaddr,
|
||||
.af_postproc = in_postproc,
|
||||
.af_status_tunnel = in_status_tunnel,
|
||||
.af_settunnel = in_set_tunnel,
|
||||
.af_difaddr = SIOCDIFADDR,
|
||||
|
@ -419,7 +419,8 @@ sec2str(time_t total)
|
||||
}
|
||||
|
||||
static void
|
||||
in6_postproc(int s, const struct afswtch *afp)
|
||||
in6_postproc(int s, const struct afswtch *afp, int newaddr __unused,
|
||||
int ifflags __unused)
|
||||
{
|
||||
if (explicit_prefix == 0) {
|
||||
/* Aggregatable address architecture defines all prefixes
|
||||
|
@ -116,7 +116,7 @@ static void status(const struct afswtch *afp, const struct sockaddr_dl *sdl,
|
||||
static void tunnel_status(int s);
|
||||
static _Noreturn void usage(void);
|
||||
|
||||
static int getifflags(const char *ifname, int us);
|
||||
static int getifflags(const char *ifname, int us, bool err_ok);
|
||||
|
||||
static struct afswtch *af_getbyname(const char *name);
|
||||
static struct afswtch *af_getbyfamily(int af);
|
||||
@ -603,7 +603,7 @@ main(int argc, char *argv[])
|
||||
if (iflen >= sizeof(name)) {
|
||||
warnx("%s: interface name too long, skipping", ifname);
|
||||
} else {
|
||||
flags = getifflags(name, -1);
|
||||
flags = getifflags(name, -1, false);
|
||||
if (!(((flags & IFF_CANTCONFIG) != 0) ||
|
||||
(downonly && (flags & IFF_UP) != 0) ||
|
||||
(uponly && (flags & IFF_UP) == 0)))
|
||||
@ -1000,7 +1000,7 @@ ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *uafp)
|
||||
* Do any post argument processing required by the address family.
|
||||
*/
|
||||
if (afp->af_postproc != NULL)
|
||||
afp->af_postproc(s, afp);
|
||||
afp->af_postproc(s, afp, newaddr, getifflags(name, s, true));
|
||||
/*
|
||||
* Do deferred callbacks registered while processing
|
||||
* command-line arguments.
|
||||
@ -1179,7 +1179,7 @@ setifdstaddr(const char *addr, int param __unused, int s,
|
||||
}
|
||||
|
||||
static int
|
||||
getifflags(const char *ifname, int us)
|
||||
getifflags(const char *ifname, int us, bool err_ok)
|
||||
{
|
||||
struct ifreq my_ifr;
|
||||
int s;
|
||||
@ -1192,8 +1192,10 @@ getifflags(const char *ifname, int us)
|
||||
} else
|
||||
s = us;
|
||||
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) {
|
||||
Perror("ioctl (SIOCGIFFLAGS)");
|
||||
exit(1);
|
||||
if (!err_ok) {
|
||||
Perror("ioctl (SIOCGIFFLAGS)");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if (us < 0)
|
||||
close(s);
|
||||
@ -1211,7 +1213,7 @@ setifflags(const char *vname, int value, int s, const struct afswtch *afp)
|
||||
struct ifreq my_ifr;
|
||||
int flags;
|
||||
|
||||
flags = getifflags(name, s);
|
||||
flags = getifflags(name, s, false);
|
||||
if (value < 0) {
|
||||
value = -value;
|
||||
flags &= ~value;
|
||||
|
@ -110,7 +110,8 @@ struct afswtch {
|
||||
void (*af_getaddr)(const char *, int);
|
||||
/* parse prefix method (IPv6) */
|
||||
void (*af_getprefix)(const char *, int);
|
||||
void (*af_postproc)(int s, const struct afswtch *);
|
||||
void (*af_postproc)(int s, const struct afswtch *,
|
||||
int newaddr, int ifflags);
|
||||
u_long af_difaddr; /* set dst if address ioctl */
|
||||
u_long af_aifaddr; /* set if address ioctl */
|
||||
void *af_ridreq; /* */
|
||||
|
Loading…
Reference in New Issue
Block a user