Made argument parsing for CC modem emulation more forgiving, avoids crashing computers.

This commit is contained in:
Florian Nücke 2015-05-04 19:20:06 +02:00
parent 8c9f9749b1
commit b60466c8b8

View File

@ -26,11 +26,11 @@ class SwitchPeripheral(val switch: Switch) extends IPeripheral {
result(switch.openPorts(computer).add(port)) result(switch.openPorts(computer).add(port))
}), }),
"isOpen" -> ((computer, context, arguments) => { "isOpen" -> ((computer, context, arguments) => {
val port = checkPort(arguments, 0) val port = optPort(arguments, 0)
result(switch.openPorts(computer).contains(port)) result(switch.openPorts(computer).contains(port))
}), }),
"close" -> ((computer, context, arguments) => { "close" -> ((computer, context, arguments) => {
val port = checkPort(arguments, 0) val port = optPort(arguments, 0)
result(switch.openPorts(computer).remove(port)) result(switch.openPorts(computer).remove(port))
}), }),
"closeAll" -> ((computer, context, arguments) => { "closeAll" -> ((computer, context, arguments) => {
@ -119,6 +119,13 @@ class SwitchPeripheral(val switch: Switch) extends IPeripheral {
port 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) = { private def checkString(args: Array[AnyRef], index: Int) = {
if (args.length < index - 1 || !args(index).isInstanceOf[String]) if (args.length < index - 1 || !args(index).isInstanceOf[String])
throw new IllegalArgumentException(s"bad argument #${index + 1} (string expected)") throw new IllegalArgumentException(s"bad argument #${index + 1} (string expected)")