Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
074c1cd7
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
14
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
074c1cd7
编写于
8月 08, 2017
作者:
J
John Johansen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
apparmor: dfa move character match into a macro
Signed-off-by:
N
John Johansen
<
john.johansen@canonical.com
>
上级
9fcf78cc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
27 addition
and
47 deletion
+27
-47
security/apparmor/match.c
security/apparmor/match.c
+27
-47
未找到文件。
security/apparmor/match.c
浏览文件 @
074c1cd7
...
...
@@ -329,6 +329,18 @@ struct aa_dfa *aa_dfa_unpack(void *blob, size_t size, int flags)
return
ERR_PTR
(
error
);
}
#define match_char(state, def, base, next, check, C) \
do { \
u32 b = (base)[(state)]; \
unsigned int pos = base_idx(b) + (C); \
if ((check)[pos] != (state)) { \
(state) = (def)[(state)]; \
break; \
} \
(state) = (next)[pos]; \
break; \
} while (1)
/**
* aa_dfa_match_len - traverse @dfa to find state @str stops at
* @dfa: the dfa to match @str against (NOT NULL)
...
...
@@ -352,7 +364,7 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
u32
*
base
=
BASE_TABLE
(
dfa
);
u16
*
next
=
NEXT_TABLE
(
dfa
);
u16
*
check
=
CHECK_TABLE
(
dfa
);
unsigned
int
state
=
start
,
pos
;
unsigned
int
state
=
start
;
if
(
state
==
0
)
return
0
;
...
...
@@ -361,23 +373,13 @@ unsigned int aa_dfa_match_len(struct aa_dfa *dfa, unsigned int start,
if
(
dfa
->
tables
[
YYTD_ID_EC
])
{
/* Equivalence class table defined */
u8
*
equiv
=
EQUIV_TABLE
(
dfa
);
/* default is direct to next state */
for
(;
len
;
len
--
)
{
pos
=
base_idx
(
base
[
state
])
+
equiv
[(
u8
)
*
str
++
];
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
for
(;
len
;
len
--
)
match_char
(
state
,
def
,
base
,
next
,
check
,
equiv
[(
u8
)
*
str
++
]);
}
else
{
/* default is direct to next state */
for
(;
len
;
len
--
)
{
pos
=
base_idx
(
base
[
state
])
+
(
u8
)
*
str
++
;
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
for
(;
len
;
len
--
)
match_char
(
state
,
def
,
base
,
next
,
check
,
(
u8
)
*
str
++
);
}
return
state
;
...
...
@@ -402,7 +404,7 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
u32
*
base
=
BASE_TABLE
(
dfa
);
u16
*
next
=
NEXT_TABLE
(
dfa
);
u16
*
check
=
CHECK_TABLE
(
dfa
);
unsigned
int
state
=
start
,
pos
;
unsigned
int
state
=
start
;
if
(
state
==
0
)
return
0
;
...
...
@@ -412,22 +414,13 @@ unsigned int aa_dfa_match(struct aa_dfa *dfa, unsigned int start,
/* Equivalence class table defined */
u8
*
equiv
=
EQUIV_TABLE
(
dfa
);
/* default is direct to next state */
while
(
*
str
)
{
pos
=
base_idx
(
base
[
state
])
+
equiv
[(
u8
)
*
str
++
];
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
while
(
*
str
)
match_char
(
state
,
def
,
base
,
next
,
check
,
equiv
[(
u8
)
*
str
++
]);
}
else
{
/* default is direct to next state */
while
(
*
str
)
{
pos
=
base_idx
(
base
[
state
])
+
(
u8
)
*
str
++
;
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
while
(
*
str
)
match_char
(
state
,
def
,
base
,
next
,
check
,
(
u8
)
*
str
++
);
}
return
state
;
...
...
@@ -450,27 +443,14 @@ unsigned int aa_dfa_next(struct aa_dfa *dfa, unsigned int state,
u32
*
base
=
BASE_TABLE
(
dfa
);
u16
*
next
=
NEXT_TABLE
(
dfa
);
u16
*
check
=
CHECK_TABLE
(
dfa
);
unsigned
int
pos
;
/* current state is <state>, matching character *str */
if
(
dfa
->
tables
[
YYTD_ID_EC
])
{
/* Equivalence class table defined */
u8
*
equiv
=
EQUIV_TABLE
(
dfa
);
/* default is direct to next state */
pos
=
base_idx
(
base
[
state
])
+
equiv
[(
u8
)
c
];
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
else
{
/* default is direct to next state */
pos
=
base_idx
(
base
[
state
])
+
(
u8
)
c
;
if
(
check
[
pos
]
==
state
)
state
=
next
[
pos
];
else
state
=
def
[
state
];
}
match_char
(
state
,
def
,
base
,
next
,
check
,
equiv
[(
u8
)
c
]);
}
else
match_char
(
state
,
def
,
base
,
next
,
check
,
(
u8
)
c
);
return
state
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录