This file is indexed.

/usr/share/lua/5.1/json/decode.lua is in lua-json 1.3.3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
--[[
	Licensed according to the included 'LICENSE' document
	Author: Thomas Harning Jr <harningt@gmail.com>
]]
local lpeg = require("lpeg")

local error = error
local pcall = pcall

local jsonutil = require("json.util")
local merge = jsonutil.merge
local util = require("json.decode.util")

local decode_state = require("json.decode.state")

local setmetatable, getmetatable = setmetatable, getmetatable
local assert = assert
local ipairs, pairs = ipairs, pairs
local string_char = require("string").char

local type = type

local require = require

local _ENV = nil

local modulesToLoad = {
	"composite",
	"strings",
	"number",
	"others"
}
local loadedModules = {
}

local json_decode = {}

json_decode.default = {
	unicodeWhitespace = true,
	initialObject = false,
	nothrow = false
}

local modes_defined = { "default", "strict", "simple" }

json_decode.simple = {}

json_decode.strict = {
	unicodeWhitespace = true,
	initialObject = true,
	nothrow = false
}

for _,name in ipairs(modulesToLoad) do
	local mod = require("json.decode." .. name)
	if mod.mergeOptions then
		for _, mode in pairs(modes_defined) do
			mod.mergeOptions(json_decode[mode], mode)
		end
	end
	loadedModules[#loadedModules + 1] = mod
end

-- Shift over default into defaultOptions to permit build optimization
local defaultOptions = json_decode.default
json_decode.default = nil

local function generateDecoder(lexer, options)
	-- Marker to permit detection of final end
	local marker = {}
	local parser = lpeg.Ct((options.ignored * lexer)^0 * lpeg.Cc(marker)) * options.ignored * (lpeg.P(-1) + util.unexpected())
	local decoder = function(data)
		local state = decode_state.create(options)
		local parsed = parser:match(data)
		assert(parsed, "Invalid JSON data")
		local i = 0
		while true do
			i = i + 1
			local item = parsed[i]
			if item == marker then break end
			if type(item) == 'function' and item ~= jsonutil.undefined and item ~= jsonutil.null then
				item(state)
			else
				state:set_value(item)
			end
		end
		if options.initialObject then
			assert(type(state.previous) == 'table', "Initial value not an object or array")
		end
		-- Make sure stack is empty
		assert(state.i == 0, "Unclosed elements present")
		return state.previous
	end
	if options.nothrow then
		return function(data)
			local status, rv = pcall(decoder, data)
			if status then
				return rv
			else
				return nil, rv
			end
		end
	end
	return decoder
end

local function buildDecoder(mode)
	mode = mode and merge({}, defaultOptions, mode) or defaultOptions
	for _, mod in ipairs(loadedModules) do
		if mod.mergeOptions then
			mod.mergeOptions(mode)
		end
	end
	local ignored = mode.unicodeWhitespace and util.unicode_ignored or util.ascii_ignored
	-- Store 'ignored' in the global options table
	mode.ignored = ignored

	--local grammar = {
	--	[1] = mode.initialObject and (ignored * (object_type + array_type)) or value_type
	--}
	local lexer
	for _, mod in ipairs(loadedModules) do
		local new_lexer = mod.generateLexer(mode)
		lexer = lexer and lexer + new_lexer or new_lexer
	end
	return generateDecoder(lexer, mode)
end

-- Since 'default' is nil, we cannot take map it
local defaultDecoder = buildDecoder(json_decode.default)
local prebuilt_decoders = {}
for _, mode in pairs(modes_defined) do
	if json_decode[mode] ~= nil then
		prebuilt_decoders[json_decode[mode]] = buildDecoder(json_decode[mode])
	end
end

--[[
Options:
	number => number decode options
	string => string decode options
	array  => array decode options
	object => object decode options
	initialObject => whether or not to require the initial object to be a table/array
	allowUndefined => whether or not to allow undefined values
]]
local function getDecoder(mode)
	mode = mode == true and json_decode.strict or mode or json_decode.default
	local decoder = mode == nil and defaultDecoder or prebuilt_decoders[mode]
	if decoder then
		return decoder
	end
	return buildDecoder(mode)
end

local function decode(data, mode)
	local decoder = getDecoder(mode)
	return decoder(data)
end

local mt = {}
mt.__call = function(self, ...)
	return decode(...)
end

json_decode.getDecoder = getDecoder
json_decode.decode = decode
json_decode.util = util
setmetatable(json_decode, mt)

return json_decode