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:
parent
d833d98502
commit
3ef450a80a
@ -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]))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user