添加一些录像文件解析错误的保护

This commit is contained in:
MrZ626
2021-06-28 15:17:39 +08:00
parent 45ab91267f
commit a1f32ca333
2 changed files with 47 additions and 28 deletions

View File

@@ -306,16 +306,24 @@ for _,fileName in next,fs.getDirectoryItems("replay")do
if fileName:sub(12,12):match("[a-zA-Z]")then
local date,mode,version,player,seed,setting,mod
local fileData=fs.read('replay/'..fileName)
fs.remove('replay/'..fileName)
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
mode, fileData=STRING.readLine(fileData)mode=modeTable[mode]or mode
version,fileData=STRING.readLine(fileData)
player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end
fileData=love.data.decompress('string','zlib',fileData)
local success
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
if not success then goto BREAK_cannotParse end
seed, fileData=STRING.readLine(fileData)
setting,fileData=STRING.readLine(fileData)setting=JSON.decode(setting)
mod, fileData=STRING.readLine(fileData)mod=JSON.decode(mod)
if
not setting or
not mod or
not mode or
#mode==0
then goto BREAK_cannotParse end
fs.remove('replay/'..fileName)
local newName=fileName:sub(1,10)..fileName:sub(15)
fs.write('replay/'..newName,
love.data.compress('string','zlib',
@@ -333,6 +341,7 @@ for _,fileName in next,fs.getDirectoryItems("replay")do
)
fileName=newName
end
::BREAK_cannotParse::
local rep=DATA.parseReplay('replay/'..fileName)
table.insert(REPLAY,rep)
end

View File

@@ -382,35 +382,45 @@ do--function DATA.saveReplay()
end
end
function DATA.parseReplay(fileName,ifFull)
local fileData=love.filesystem.read(fileName)
if fileData and #fileData>0 then
fileData=loveDecompress('string','zlib',fileData)
local metaData
metaData,fileData=STRING.readLine(fileData)
metaData=JSON.decode(metaData)
local rep={
fileName=fileName,
available=true,
local fileData,success,metaData,rep
date=metaData.date,
mode=metaData.mode,
version=metaData.version,
player=metaData.player,
--Read file
fileData=love.filesystem.read(fileName)
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
seed=metaData.seed,
setting=metaData.setting,
mod=metaData.mod,
--Decompress file
success,fileData=pcall(loveDecompress,'string','zlib',fileData)
if not success then goto BREAK_cannotParse end
modeName=("%s %s"):format(text.modes[metaData.mode][1],text.modes[metaData.mode][2]),
}
if ifFull then rep.data=fileData end
return rep
else
return{
fileName=fileName,
available=false,
}
end
--Load metadata
metaData,fileData=STRING.readLine(fileData)
metaData=JSON.decode(metaData)
if not metaData or not text.modes[metaData.mode]then goto BREAK_cannotParse end
--Create replay object
rep={
fileName=fileName,
available=true,
date=metaData.date,
mode=metaData.mode,
version=metaData.version,
player=metaData.player,
seed=metaData.seed,
setting=metaData.setting,
mod=metaData.mod,
modeName=("%s %s"):format(text.modes[metaData.mode][1],text.modes[metaData.mode][2]),
}
if ifFull then rep.data=fileData end
do return rep end
--Create unavailable replay object
::BREAK_cannotParse::
return{
fileName=fileName,
available=false,
}
end
return DATA