1
0
mirror of https://github.com/JohnBreaux/Boat-Battle.git synced 2024-11-15 05:25:57 +00:00

Fix fatal use-after-free in debug menu.

This commit is contained in:
John 2021-11-11 15:08:09 -06:00
parent d833d98502
commit 3ef450a80a

View File

@ -197,12 +197,20 @@ func history_move(rel_pos):
func debug_print_line(string): func debug_print_line(string):
emit_signal("print_text", string.c_unescape()) emit_signal("print_text", string.c_unescape())
# get_pwn: get the present working node if valid, otherwise cd to root
func get_pwn():
if !is_instance_valid(present_working_node):
debug_print_line("Node freed, traversing to /root/\n")
present_working_node = get_node("/root/")
return present_working_node
# complete_path: complete a relative or absolute path, and returns the node it refers to # complete_path: complete a relative or absolute path, and returns the node it refers to
# params: path: relative or absolute path to a node # params: path: relative or absolute path to a node
# returns: void # returns: void
func complete_path(path): func complete_path(path):
if path.is_rel_path(): # convert to absolute path if path.is_rel_path(): # convert to absolute path
path = String(present_working_node.get_path()) + "/" + path path = String(get_pwn().get_path()) + "/" + path
var node = get_node(path) var node = get_node(path)
if node: if node:
return node return node
@ -321,7 +329,7 @@ func listify_string(string):
func command_start (command): func command_start (command):
if command.size() > 1: if command.size() > 1:
var pack = load("res://scenes/" + command[1] + ".tscn"); var pack = load("res://scenes/" + command[1] + ".tscn");
present_working_node.add_child(pack.instance()); get_pwn().add_child(pack.instance());
debug_print_line("started '" + command[1] + "'\n") debug_print_line("started '" + command[1] + "'\n")
else: else:
debug_print_line(get_usage(command[0])) debug_print_line(get_usage(command[0]))
@ -329,7 +337,7 @@ func command_start (command):
# stop: kills a child of current working node # stop: kills a child of current working node
func command_kill (command): func command_kill (command):
if command.size() > 1: if command.size() > 1:
var node = present_working_node.find_node(command[1], false, false) var node = get_pwn().find_node(command[1], false, false)
if node: if node:
if String(node.get_path()).match("*Debug*"): if String(node.get_path()).match("*Debug*"):
debug_print_line("YOU DIDN'T SAY THE MAGIC WORD!\n") debug_print_line("YOU DIDN'T SAY THE MAGIC WORD!\n")
@ -347,7 +355,7 @@ func command_list (command):
if (command.size() > 1): if (command.size() > 1):
node = complete_path(command[1]) node = complete_path(command[1])
if (!node): if (!node):
node = present_working_node node = get_pwn()
var children = node.get_children() var children = node.get_children()
var names = [] var names = []
for i in range (children.size()): for i in range (children.size()):
@ -386,7 +394,7 @@ func command_clear (_command):
# pwd: print the present working node's path # pwd: print the present working node's path
func command_pwd (_command): func command_pwd (_command):
debug_print_line(String(present_working_node.get_path()) + "\n") debug_print_line(String(get_pwn().get_path()) + "\n")
# cd: change the present working node # cd: change the present working node
func command_cd (command): func command_cd (command):
@ -429,8 +437,8 @@ func command_call(command):
var call_cmd = command[1].split(' ', true, 1) var call_cmd = command[1].split(' ', true, 1)
if call_cmd.size() > 1: if call_cmd.size() > 1:
call_args = call_cmd[1].split(' ', false, 0) call_args = call_cmd[1].split(' ', false, 0)
if present_working_node.has_method(call_cmd[0]): if get_pwn().has_method(call_cmd[0]):
call_ret = present_working_node.callv(call_cmd[0], call_args) call_ret = get_pwn().callv(call_cmd[0], call_args)
else: else:
debug_print_line("We're sorry, but your call could not be completed as dialed.\n" debug_print_line("We're sorry, but your call could not be completed as dialed.\n"
+ "Please hang up and try your call again.\n") + "Please hang up and try your call again.\n")
@ -445,7 +453,7 @@ func command_exec(command):
var res var res
var err = expression.parse(command[1]) var err = expression.parse(command[1])
if err == OK: if err == OK:
res = expression.execute([], present_working_node, false); res = expression.execute([], get_pwn(), false);
if expression.has_execute_failed(): if expression.has_execute_failed():
debug_print_line(command[0] + ": command not found: " + command[1]) debug_print_line(command[0] + ": command not found: " + command[1])
res = "" res = ""
@ -458,7 +466,7 @@ func command_exec(command):
# listprops: list properties (variables) of present working node # listprops: list properties (variables) of present working node
func command_listprops(_command): func command_listprops(_command):
var props = "" var props = ""
var proplist = present_working_node.get_property_list() var proplist = get_pwn().get_property_list()
proplist.sort_custom(self, "propSort") proplist.sort_custom(self, "propSort")
for prop in proplist: for prop in proplist:
if prop["name"]: if prop["name"]:
@ -474,7 +482,7 @@ func propSort(a, b):
# getprop: get the value of a named property of the present working node # getprop: get the value of a named property of the present working node
func command_getprop(command): func command_getprop(command):
if command.size() > 1: if command.size() > 1:
var res = present_working_node.get(command[1]) var res = get_pwn().get(command[1])
debug_print_line(variant_to_string(res) + "\n") debug_print_line(variant_to_string(res) + "\n")
else: else:
debug_print_line(get_usage(command[0])) debug_print_line(get_usage(command[0]))
@ -484,10 +492,10 @@ func command_setprop(command):
if command.size() > 1: if command.size() > 1:
var prop = command[1].split(' ', true, 1) var prop = command[1].split(' ', true, 1)
if prop.size() > 1 && prop[0].is_valid_identifier(): if prop.size() > 1 && prop[0].is_valid_identifier():
var type = typeof(present_working_node.get(prop[0])) var type = typeof(get_pwn().get(prop[0]))
var variant = string_to_variant(prop[1], type) var variant = string_to_variant(prop[1], type)
if typeof(variant) > TYPE_NIL: if typeof(variant) > TYPE_NIL:
present_working_node.set(prop[0], string_to_variant(prop[1], type)) get_pwn().set(prop[0], string_to_variant(prop[1], type))
else: else:
debug_print_line(get_usage(command[0])) debug_print_line(get_usage(command[0]))