base-files: ipcalc.sh: fail when network is too small
authorLeon M. George <leon@georgemail.eu>
Thu, 5 May 2022 22:02:52 +0000 (00:02 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 7 Feb 2023 20:05:56 +0000 (21:05 +0100)
It's possible to move range boundaries in a way that the start address
lies behind the end address.
Detect this condition and exit with an error message.

Signed-off-by: Leon M. George <leon@georgemail.eu>
package/base-files/files/bin/ipcalc.sh

index 66d37952de8ee02a37320efdebe7fabfc6513ab9..b21b6e28dc67b364502ade267cac9d234cfb1d9f 100755 (executable)
@@ -44,13 +44,14 @@ BEGIN {
        }
 
        network=and(ipaddr,netmask)
+       prefix=32-bitcount(compl32(netmask))
        broadcast=or(network,compl32(netmask))
 
        print "IP="int2ip(ipaddr)
        print "NETMASK="int2ip(netmask)
        print "BROADCAST="int2ip(broadcast)
        print "NETWORK="int2ip(network)
-       print "PREFIX="32-bitcount(compl32(netmask))
+       print "PREFIX="prefix
 
        # range calculations:
        # ipcalc <ip> <netmask> <start> <num>
@@ -68,6 +69,11 @@ BEGIN {
        if (end>limit) end=limit
        if (end==ipaddr) end=ipaddr-1
 
+       if (start>end) {
+               print "network ("int2ip(network)"/"prefix") too small" > "/dev/stderr"
+               exit(1)
+       }
+
        if (ipaddr > start && ipaddr < end) {
                print "ipaddr inside range" > "/dev/stderr"
                exit(1)