From 654d526a69cde79d2acbb91324ec69fe9ec469fe Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 10 Aug 2017 11:40:12 -0600 Subject: [PATCH] NSH addroute/delroute: Fix an indexing problem introduced with previous commit. --- nshlib/nsh_routecmds.c | 52 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/nshlib/nsh_routecmds.c b/nshlib/nsh_routecmds.c index c7c134d31..0b602c9df 100644 --- a/nshlib/nsh_routecmds.c +++ b/nshlib/nsh_routecmds.c @@ -235,13 +235,19 @@ int cmd_addroute(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) if (family == PF_INET) #endif { + /* /0 -> 0x00000000 + * /8 -> 0xff000000 + * /24 -> 0xffffff00 + * /32 -> 0xffffffff + */ + if (shift > 32) { nsh_output(vtbl, g_fmtarginvalid, argv[0]); goto errout_with_sockfd; } - inaddr.ipv4.s_addr = (0xffffffff << shift); + inaddr.ipv4.s_addr = (0xffffffff << (32 - shift)); } #endif @@ -252,18 +258,32 @@ int cmd_addroute(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { int i; + /* /0 -> 0000:0000:0000:0000:0000:0000:0000:0000 + * /16 -> ffff:0000:0000:0000:0000:0000:0000:0000 + * /32 -> ffff:ffff:0000:0000:0000:0000:0000:0000 + * ... + * /128 -> ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff + */ + memset(&inaddr.ipv6, 0, sizeof(struct sockaddr_in6)); - for (i = 7; i >= 0 && shift >= 16; i--, shift -= 16) + for (i = 0; i < 8 && shift >= 16; i++, shift -= 16) { inaddr.ipv6.s6_addr16[i] = 0xffff; } - if (shift > 16 || (shift > 0 && i < 0)) + if (shift > 16 || (shift > 0 && i >= 8)) { nsh_output(vtbl, g_fmtarginvalid, argv[0]); goto errout_with_sockfd; } + /* /0 -> 0x0000 + * /1 -> 0x8000 + * /2 -> 0xc000 + * ... + * /16 -> 0xffff + */ + if (shift > 0) { inaddr.ipv6.s6_addr16[i] = (0xffff << (16 - shift)); @@ -495,13 +515,19 @@ int cmd_delroute(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) if (family == PF_INET) #endif { + /* /0 -> 0x00000000 + * /8 -> 0xff000000 + * /24 -> 0xffffff00 + * /32 -> 0xffffffff + */ + if (shift > 32) { nsh_output(vtbl, g_fmtarginvalid, argv[0]); goto errout_with_sockfd; } - inaddr.ipv4.s_addr = (0xffffffff << shift); + inaddr.ipv4.s_addr = (0xffffffff << (32 - shift)); } #endif @@ -512,18 +538,32 @@ int cmd_delroute(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { int i; + /* /0 -> 0000:0000:0000:0000:0000:0000:0000:0000 + * /16 -> ffff:0000:0000:0000:0000:0000:0000:0000 + * /32 -> ffff:ffff:0000:0000:0000:0000:0000:0000 + * ... + * /128 -> ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff + */ + memset(&inaddr.ipv6, 0, sizeof(struct sockaddr_in6)); - for (i = 7; i >= 0 && shift >= 16; i--, shift -= 16) + for (i = 0; i < 8 && shift >= 16; i++, shift -= 16) { inaddr.ipv6.s6_addr16[i] = 0xffff; } - if (shift > 16 || (shift > 0 && i < 0)) + if (shift > 16 || (shift > 0 && i >= 8)) { nsh_output(vtbl, g_fmtarginvalid, argv[0]); goto errout_with_sockfd; } + /* /0 -> 0x0000 + * /1 -> 0x8000 + * /2 -> 0xc000 + * ... + * /16 -> 0xffff + */ + if (shift > 0) { inaddr.ipv6.s6_addr16[i] = (0xffff << (16 - shift));