extern void str2in6_addr (const char *, struct in6_addr *);
extern const char *inet6_ntoa (struct in6_addr);
+static inline int ipv6_martian (struct in6_addr *addr)
+{
+ struct in6_addr localhost_addr;
+
+ inet_pton (AF_INET6, "::1", &localhost_addr);
+
+ if (IPV6_ADDR_SAME(&localhost_addr, addr))
+ return 1;
+
+ return 0;
+}
+
#endif /* HAVE_IPV6 */
extern int all_digit (const char *);
+/* NOTE: This routine expects the address argument in network byte order. */
static inline int ipv4_martian (struct in_addr *addr)
{
- in_addr_t ip = addr->s_addr;
+ in_addr_t ip = ntohl(addr->s_addr);
if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) {
return 1;
struct prefix_ipv4 *p;
struct connected *ifc;
+ if (ipv4_martian(addr))
+ return;
+
/* Make connected structure. */
ifc = connected_new ();
ifc->ifp = ifp;
struct prefix_ipv6 *p;
struct connected *ifc;
+ if (ipv6_martian(addr))
+ return;
+
/* Make connected structure. */
ifc = connected_new ();
ifc->ifp = ifp;
return CMD_WARNING;
}
+ if (ipv4_martian(&cp.prefix))
+ {
+ vty_out (vty, "%% Invalid address%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
ifc = connected_check (ifp, (struct prefix *) &cp);
if (! ifc)
{
return CMD_WARNING;
}
+ if (ipv6_martian(&cp.prefix))
+ {
+ vty_out (vty, "%% Invalid address%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
ifc = connected_check (ifp, (struct prefix *) &cp);
if (! ifc)
{