makesyscalls: sprinkle some assert() on standard function calls

Improves our error reporting, ensuring that we aren't just ignoring
errors in the common case.

Note specifically the boundary where we have to change up our error
handling approach.  It's fine to error() out up until we create the
tempdir, then the rest should try to handle it gracefully and abort().
A future change will clean this up further by pcall'ing all of the bits
that cannot currently error() without cleaning up.
This commit is contained in:
Kyle Evans 2021-01-27 12:12:33 -06:00
parent e12a0ffe2b
commit 6687410af7

View File

@ -95,28 +95,30 @@ local files = {}
local function cleanup()
for _, v in pairs(files) do
v:close()
assert(v:close())
end
if cleantmp then
if lfs.dir(tmpspace) then
for fname in lfs.dir(tmpspace) do
if fname ~= "." and fname ~= ".." then
os.remove(tmpspace .. "/" .. fname))
assert(os.remove(tmpspace .. "/" ..
fname))
end
end
end
if lfs.attributes(tmpspace) and not lfs.rmdir(tmpspace) then
io.stderr:write("Failed to clean up tmpdir: " ..
tmpspace .. "\n")
assert(io.stderr:write("Failed to clean up tmpdir: " ..
tmpspace .. "\n"))
end
else
io.stderr:write("Temp files left in " .. tmpspace .. "\n")
assert(io.stderr:write("Temp files left in " .. tmpspace ..
"\n"))
end
end
local function abort(status, msg)
io.stderr:write(msg .. "\n")
assert(io.stderr:write(msg .. "\n"))
cleanup()
os.exit(status)
end
@ -208,14 +210,11 @@ local function process_config(file)
-- would need to sanitize the line for potentially special characters.
local line_expr = "^([%w%p]+%s*)=(%s*[`\"]?[^\"`]+[`\"]?)"
if file == nil then
if not file then
return nil, "No file given"
end
local fh = io.open(file)
if fh == nil then
return nil, "Could not open file"
end
local fh = assert(io.open(file))
for nextline in fh:lines() do
-- Strip any whole-line comments
@ -262,7 +261,7 @@ local function process_config(file)
end
end
io.close(fh)
assert(io.close(fh))
return cfg
end
@ -291,7 +290,7 @@ local function grab_capenabled(file, open_fail_ok)
end
end
io.close(fh)
assert(io.close(fh))
return capentries
end
@ -369,8 +368,8 @@ local function read_file(tmpfile)
end
local fh = files[tmpfile]
fh:seek("set")
return fh:read("a")
assert(fh:seek("set"))
return assert(fh:read("a"))
end
local function write_line(tmpfile, line)
@ -378,13 +377,13 @@ local function write_line(tmpfile, line)
print("Not found: " .. tmpfile)
return
end
files[tmpfile]:write(line)
assert(files[tmpfile]:write(line))
end
local function write_line_pfile(tmppat, line)
for k in pairs(files) do
if k:match(tmppat) ~= nil then
files[k]:write(line)
assert(files[k]:write(line))
end
end
end
@ -505,7 +504,7 @@ local function process_sysfile(file)
process_syscall_def(prevline)
end
io.close(fh)
assert(io.close(fh))
return capentries
end
@ -1108,7 +1107,7 @@ end
-- Entry point
if #arg < 1 or #arg > 2 then
abort(1, "usage: " .. arg[0] .. " input-file <config-file>")
error("usage: " .. arg[0] .. " input-file <config-file>")
end
local sysfile, configfile = arg[1], arg[2]
@ -1116,13 +1115,7 @@ local sysfile, configfile = arg[1], arg[2]
-- process_config either returns nil and a message, or a
-- table that we should merge into the global config
if configfile ~= nil then
local res, msg = process_config(configfile)
if res == nil then
-- Error... handle?
print(msg)
os.exit(1)
end
local res = assert(process_config(configfile))
for k, v in pairs(res) do
if v ~= config[k] then
@ -1150,17 +1143,28 @@ process_compat()
process_abi_flags()
if not lfs.mkdir(tmpspace) then
abort(1, "Failed to create tempdir " .. tmpspace)
error("Failed to create tempdir " .. tmpspace)
end
-- XXX Revisit the error handling here, we should probably move the rest of this
-- into a function that we pcall() so we can catch the errors and clean up
-- gracefully.
for _, v in ipairs(temp_files) do
local tmpname = tmpspace .. v
files[v] = io.open(tmpname, "w+")
-- XXX Revisit these with a pcall() + error handler
if not files[v] then
abort(1, "Failed to open temp file: " .. tmpname)
end
end
for _, v in ipairs(output_files) do
local tmpname = tmpspace .. v
files[v] = io.open(tmpname, "w+")
-- XXX Revisit these with a pcall() + error handler
if not files[v] then
abort(1, "Failed to open temp output file: " .. tmpname)
end
end
-- Write out all of the preamble bits
@ -1358,12 +1362,12 @@ write_line("systrace", read_file("systraceret"))
for _, v in ipairs(output_files) do
local target = config[v]
if target ~= "/dev/null" then
local fh = io.open(target, "w+")
local fh = assert(io.open(target, "w+"))
if fh == nil then
abort(1, "Failed to open '" .. target .. "'")
end
fh:write(read_file(v))
fh:close()
assert(fh:write(read_file(v)))
assert(fh:close())
end
end