添加一些录像文件解析错误的保护
This commit is contained in:
13
main.lua
13
main.lua
@@ -306,16 +306,24 @@ for _,fileName in next,fs.getDirectoryItems("replay")do
|
|||||||
if fileName:sub(12,12):match("[a-zA-Z]")then
|
if fileName:sub(12,12):match("[a-zA-Z]")then
|
||||||
local date,mode,version,player,seed,setting,mod
|
local date,mode,version,player,seed,setting,mod
|
||||||
local fileData=fs.read('replay/'..fileName)
|
local fileData=fs.read('replay/'..fileName)
|
||||||
fs.remove('replay/'..fileName)
|
|
||||||
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
|
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
|
||||||
mode, fileData=STRING.readLine(fileData)mode=modeTable[mode]or mode
|
mode, fileData=STRING.readLine(fileData)mode=modeTable[mode]or mode
|
||||||
version,fileData=STRING.readLine(fileData)
|
version,fileData=STRING.readLine(fileData)
|
||||||
player, fileData=STRING.readLine(fileData)if player=="Local Player"then player="Stacker"end
|
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)
|
seed, fileData=STRING.readLine(fileData)
|
||||||
setting,fileData=STRING.readLine(fileData)setting=JSON.decode(setting)
|
setting,fileData=STRING.readLine(fileData)setting=JSON.decode(setting)
|
||||||
mod, fileData=STRING.readLine(fileData)mod=JSON.decode(mod)
|
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)
|
local newName=fileName:sub(1,10)..fileName:sub(15)
|
||||||
fs.write('replay/'..newName,
|
fs.write('replay/'..newName,
|
||||||
love.data.compress('string','zlib',
|
love.data.compress('string','zlib',
|
||||||
@@ -333,6 +341,7 @@ for _,fileName in next,fs.getDirectoryItems("replay")do
|
|||||||
)
|
)
|
||||||
fileName=newName
|
fileName=newName
|
||||||
end
|
end
|
||||||
|
::BREAK_cannotParse::
|
||||||
local rep=DATA.parseReplay('replay/'..fileName)
|
local rep=DATA.parseReplay('replay/'..fileName)
|
||||||
table.insert(REPLAY,rep)
|
table.insert(REPLAY,rep)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -382,35 +382,45 @@ do--function DATA.saveReplay()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function DATA.parseReplay(fileName,ifFull)
|
function DATA.parseReplay(fileName,ifFull)
|
||||||
local fileData=love.filesystem.read(fileName)
|
local fileData,success,metaData,rep
|
||||||
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,
|
|
||||||
|
|
||||||
date=metaData.date,
|
--Read file
|
||||||
mode=metaData.mode,
|
fileData=love.filesystem.read(fileName)
|
||||||
version=metaData.version,
|
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
|
||||||
player=metaData.player,
|
|
||||||
|
|
||||||
seed=metaData.seed,
|
--Decompress file
|
||||||
setting=metaData.setting,
|
success,fileData=pcall(loveDecompress,'string','zlib',fileData)
|
||||||
mod=metaData.mod,
|
if not success then goto BREAK_cannotParse end
|
||||||
|
|
||||||
modeName=("%s %s"):format(text.modes[metaData.mode][1],text.modes[metaData.mode][2]),
|
--Load metadata
|
||||||
}
|
metaData,fileData=STRING.readLine(fileData)
|
||||||
if ifFull then rep.data=fileData end
|
metaData=JSON.decode(metaData)
|
||||||
return rep
|
if not metaData or not text.modes[metaData.mode]then goto BREAK_cannotParse end
|
||||||
else
|
--Create replay object
|
||||||
return{
|
rep={
|
||||||
fileName=fileName,
|
fileName=fileName,
|
||||||
available=false,
|
available=true,
|
||||||
}
|
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
return DATA
|
return DATA
|
||||||
Reference in New Issue
Block a user