From a40a96e54b0d047d14d99bb715ee2dd94458acb6 Mon Sep 17 00:00:00 2001
From: "Leon M. George" <leon@georgemail.eu>
Date: Fri, 6 May 2022 00:02:52 +0200
Subject: [PATCH] base-files: ipcalc.sh: fail when network is too small

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 | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/package/base-files/files/bin/ipcalc.sh b/package/base-files/files/bin/ipcalc.sh
index 66d37952de8..b21b6e28dc6 100755
--- a/package/base-files/files/bin/ipcalc.sh
+++ b/package/base-files/files/bin/ipcalc.sh
@@ -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)
-- 
GitLab