Skip to content

Commit

Permalink
Fix crash when importing a corrupt pxo
Browse files Browse the repository at this point in the history
  • Loading branch information
OverloadedOrama committed Mar 5, 2024
1 parent e726dcf commit 36d4b0f
Showing 1 changed file with 26 additions and 17 deletions.
43 changes: 26 additions & 17 deletions src/Autoload/OpenSave.gd
Original file line number Diff line number Diff line change
Expand Up @@ -185,30 +185,30 @@ func handle_loading_video(file: String) -> bool:
func open_pxo_file(path: String, untitled_backup := false, replace_empty := true) -> void:
var empty_project := Global.current_project.is_empty() and replace_empty
var new_project: Project
if empty_project:
new_project = Global.current_project
new_project.frames = []
new_project.layers = []
new_project.animation_tags.clear()
new_project.name = path.get_file()
else:
new_project = Project.new([], path.get_file())
var zip_reader := ZIPReader.new()
var err := zip_reader.open(path)
if err == FAILED:
# Most likely uses the old pxo format, load that
var success := open_v0_pxo_file(path, new_project)
if not success:
new_project = open_v0_pxo_file(path, empty_project)
if not is_instance_valid(new_project):
return
elif err != OK:
Global.popup_error(tr("File failed to open. Error code %s (%s)") % [err, error_string(err)])
return
else:
if empty_project:
new_project = Global.current_project
new_project.frames = []
new_project.layers = []
new_project.animation_tags.clear()
new_project.name = path.get_file()
else:
new_project = Project.new([], path.get_file())
var data_json := zip_reader.read_file("data.json").get_string_from_utf8()
var test_json_conv := JSON.new()
var error := test_json_conv.parse(data_json)
if error != OK:
print("Error, corrupt pxo file")
print("Error, corrupt pxo file. Error code %s (%s)" % [error, error_string(error)])
zip_reader.close()
return
var result = test_json_conv.get_data()
Expand Down Expand Up @@ -284,30 +284,39 @@ func open_pxo_file(path: String, untitled_backup := false, replace_empty := true
save_project_to_recent_list(path)


func open_v0_pxo_file(path: String, new_project: Project) -> bool:
func open_v0_pxo_file(path: String, empty_project: bool) -> Project:
var file := FileAccess.open_compressed(path, FileAccess.READ, FileAccess.COMPRESSION_ZSTD)
if FileAccess.get_open_error() == ERR_FILE_UNRECOGNIZED:
# If the file is not compressed open it raw (pre-v0.7)
file = FileAccess.open(path, FileAccess.READ)
var err := FileAccess.get_open_error()
if err != OK:
Global.popup_error(tr("File failed to open. Error code %s (%s)") % [err, error_string(err)])
return false
return null

var first_line := file.get_line()
var test_json_conv := JSON.new()
var error := test_json_conv.parse(first_line)
if error != OK:
print("Error, corrupt pxo file")
print("Error, corrupt pxo file. Error code %s (%s)" % [error, error_string(error)])
file.close()
return false
return null

var result = test_json_conv.get_data()
if typeof(result) != TYPE_DICTIONARY:
print("Error, json parsed result is: %s" % typeof(result))
file.close()
return false
return null

var new_project: Project
if empty_project:
new_project = Global.current_project
new_project.frames = []
new_project.layers = []
new_project.animation_tags.clear()
new_project.name = path.get_file()
else:
new_project = Project.new([], path.get_file())
new_project.deserialize(result)
for frame in new_project.frames:
for cel in frame.cels:
Expand Down Expand Up @@ -344,7 +353,7 @@ func open_v0_pxo_file(path: String, new_project: Project) -> bool:
else:
new_project.tiles.reset_mask()
file.close()
return true
return new_project


func save_pxo_file(
Expand Down

0 comments on commit 36d4b0f

Please sign in to comment.