Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hanoi2005
redis
提交
430602b2
R
redis
项目概览
hanoi2005
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
430602b2
编写于
3月 29, 2012
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Protect globals access in Lua scripting.
上级
236adc28
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
44 addition
and
0 deletion
+44
-0
src/scripting.c
src/scripting.c
+44
-0
未找到文件。
src/scripting.c
浏览文件 @
430602b2
...
...
@@ -412,6 +412,45 @@ void luaLoadLibraries(lua_State *lua) {
#endif
}
void
scriptingProtectGlobals
(
lua_State
*
lua
)
{
char
*
s
[
26
];
sds
code
=
sdsempty
();
int
j
;
/* strict.lua from: http://metalua.luaforge.net/src/lib/strict.lua.html */
s
[
0
]
=
"local mt = getmetatable(_G)
\n
"
;
s
[
1
]
=
"if mt == nil then
\n
"
;
s
[
2
]
=
" mt = {}
\n
"
;
s
[
3
]
=
" setmetatable(_G, mt)
\n
"
;
s
[
4
]
=
"end
\n
"
;
s
[
5
]
=
"__STRICT = true
\n
"
;
s
[
6
]
=
"mt.__declared = {}
\n
"
;
s
[
7
]
=
"mt.__newindex = function (t, n, v)
\n
"
;
s
[
8
]
=
" if __STRICT and not mt.__declared[n] and debug.getinfo(2) then
\n
"
;
s
[
9
]
=
" local w = debug.getinfo(2,
\"
S
\"
).what
\n
"
;
s
[
10
]
=
" if w ~=
\"
main
\"
and w ~=
\"
C
\"
then
\n
"
;
s
[
11
]
=
" error(
\"
assign to undeclared global var '
\"
..n..
\"
'
\"
, 2)
\n
"
;
s
[
12
]
=
" end
\n
"
;
s
[
13
]
=
" mt.__declared[n] = true
\n
"
;
s
[
14
]
=
" end
\n
"
;
s
[
15
]
=
" rawset(t, n, v)
\n
"
;
s
[
16
]
=
"end
\n
"
;
s
[
17
]
=
"mt.__index = function (t, n)
\n
"
;
s
[
18
]
=
" if debug.getinfo(2) and not mt.__declared[n] and debug.getinfo(2,
\"
S
\"
).what ~=
\"
C
\"
then
\n
"
;
s
[
19
]
=
" error(
\"
global var '
\"
..n..
\"
' is not declared
\"
, 2)
\n
"
;
s
[
20
]
=
" end
\n
"
;
s
[
21
]
=
" return rawget(t, n)
\n
"
;
s
[
22
]
=
"end
\n
"
;
s
[
23
]
=
"function global(...)
\n
"
;
s
[
24
]
=
" for _, v in ipairs{...} do mt.__declared[v] = true end
\n
"
;
s
[
25
]
=
"end
\n
"
;
for
(
j
=
0
;
j
<
26
;
j
++
)
code
=
sdscatlen
(
code
,
s
[
j
],
strlen
(
s
[
j
]));
luaL_loadbuffer
(
lua
,
code
,
sdslen
(
code
),
"strict_lua"
);
lua_pcall
(
lua
,
0
,
0
,
0
);
sdsfree
(
code
);
}
/* Initialize the scripting environment.
* It is possible to call this function to reset the scripting environment
* assuming that we call scriptingRelease() before.
...
...
@@ -501,6 +540,11 @@ void scriptingInit(void) {
server
.
lua_client
->
flags
|=
REDIS_LUA_CLIENT
;
}
/* Lua beginners ofter don't use "local", this is likely to introduce
* subtle bugs in their code. To prevent problems we protect accesses
* to global variables. */
scriptingProtectGlobals
(
lua
);
server
.
lua
=
lua
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录