From b60466c8b8437bb6863f2b5bfb81f43cd9bcd637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 4 May 2015 19:20:06 +0200 Subject: [PATCH] Made argument parsing for CC modem emulation more forgiving, avoids crashing computers. --- .../integration/computercraft/SwitchPeripheral.scala | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala b/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala index c8d07ccd5..98795bdf2 100644 --- a/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala +++ b/src/main/scala/li/cil/oc/integration/computercraft/SwitchPeripheral.scala @@ -26,11 +26,11 @@ class SwitchPeripheral(val switch: Switch) extends IPeripheral { result(switch.openPorts(computer).add(port)) }), "isOpen" -> ((computer, context, arguments) => { - val port = checkPort(arguments, 0) + val port = optPort(arguments, 0) result(switch.openPorts(computer).contains(port)) }), "close" -> ((computer, context, arguments) => { - val port = checkPort(arguments, 0) + val port = optPort(arguments, 0) result(switch.openPorts(computer).remove(port)) }), "closeAll" -> ((computer, context, arguments) => { @@ -119,6 +119,13 @@ class SwitchPeripheral(val switch: Switch) extends IPeripheral { port } + private def optPort(args: Array[AnyRef], index: Int): Int = { + if (args.length < index - 1 || !args(index).isInstanceOf[Double]) return 0 + val port = args(index).asInstanceOf[Double].toInt + if (port < 1 || port > 0xFFFF) return 0 + port + } + private def checkString(args: Array[AnyRef], index: Int) = { if (args.length < index - 1 || !args(index).isInstanceOf[String]) throw new IllegalArgumentException(s"bad argument #${index + 1} (string expected)")