tomoyo: ignore data race while checking quota
syzbot is reporting that tomoyo's quota check is racy [1]. But this check is tolerant of some degree of inaccuracy. Thus, teach KCSAN to ignore this data race. [1] https://syzkaller.appspot.com/bug?id=999533deec7ba6337f8aa25d8bd1a4d5f7e50476 Reported-by: syzbot <syzbot+0789a72b46fd91431bd8@syzkaller.appspotmail.com> Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
This commit is contained in:
parent
1048ba83fb
commit
5797e861e4
|
@ -362,14 +362,14 @@ static bool tomoyo_merge_path_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u16 * const a_perm = &container_of(a, struct tomoyo_path_acl, head)
|
u16 * const a_perm = &container_of(a, struct tomoyo_path_acl, head)
|
||||||
->perm;
|
->perm;
|
||||||
u16 perm = *a_perm;
|
u16 perm = READ_ONCE(*a_perm);
|
||||||
const u16 b_perm = container_of(b, struct tomoyo_path_acl, head)->perm;
|
const u16 b_perm = container_of(b, struct tomoyo_path_acl, head)->perm;
|
||||||
|
|
||||||
if (is_delete)
|
if (is_delete)
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,7 +437,7 @@ static bool tomoyo_merge_mkdev_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u8 *const a_perm = &container_of(a, struct tomoyo_mkdev_acl,
|
u8 *const a_perm = &container_of(a, struct tomoyo_mkdev_acl,
|
||||||
head)->perm;
|
head)->perm;
|
||||||
u8 perm = *a_perm;
|
u8 perm = READ_ONCE(*a_perm);
|
||||||
const u8 b_perm = container_of(b, struct tomoyo_mkdev_acl, head)
|
const u8 b_perm = container_of(b, struct tomoyo_mkdev_acl, head)
|
||||||
->perm;
|
->perm;
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ static bool tomoyo_merge_mkdev_acl(struct tomoyo_acl_info *a,
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,14 +517,14 @@ static bool tomoyo_merge_path2_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u8 * const a_perm = &container_of(a, struct tomoyo_path2_acl, head)
|
u8 * const a_perm = &container_of(a, struct tomoyo_path2_acl, head)
|
||||||
->perm;
|
->perm;
|
||||||
u8 perm = *a_perm;
|
u8 perm = READ_ONCE(*a_perm);
|
||||||
const u8 b_perm = container_of(b, struct tomoyo_path2_acl, head)->perm;
|
const u8 b_perm = container_of(b, struct tomoyo_path2_acl, head)->perm;
|
||||||
|
|
||||||
if (is_delete)
|
if (is_delete)
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +655,7 @@ static bool tomoyo_merge_path_number_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u8 * const a_perm = &container_of(a, struct tomoyo_path_number_acl,
|
u8 * const a_perm = &container_of(a, struct tomoyo_path_number_acl,
|
||||||
head)->perm;
|
head)->perm;
|
||||||
u8 perm = *a_perm;
|
u8 perm = READ_ONCE(*a_perm);
|
||||||
const u8 b_perm = container_of(b, struct tomoyo_path_number_acl, head)
|
const u8 b_perm = container_of(b, struct tomoyo_path_number_acl, head)
|
||||||
->perm;
|
->perm;
|
||||||
|
|
||||||
|
@ -663,7 +663,7 @@ static bool tomoyo_merge_path_number_acl(struct tomoyo_acl_info *a,
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -233,14 +233,14 @@ static bool tomoyo_merge_inet_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u8 * const a_perm =
|
u8 * const a_perm =
|
||||||
&container_of(a, struct tomoyo_inet_acl, head)->perm;
|
&container_of(a, struct tomoyo_inet_acl, head)->perm;
|
||||||
u8 perm = *a_perm;
|
u8 perm = READ_ONCE(*a_perm);
|
||||||
const u8 b_perm = container_of(b, struct tomoyo_inet_acl, head)->perm;
|
const u8 b_perm = container_of(b, struct tomoyo_inet_acl, head)->perm;
|
||||||
|
|
||||||
if (is_delete)
|
if (is_delete)
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,14 +259,14 @@ static bool tomoyo_merge_unix_acl(struct tomoyo_acl_info *a,
|
||||||
{
|
{
|
||||||
u8 * const a_perm =
|
u8 * const a_perm =
|
||||||
&container_of(a, struct tomoyo_unix_acl, head)->perm;
|
&container_of(a, struct tomoyo_unix_acl, head)->perm;
|
||||||
u8 perm = *a_perm;
|
u8 perm = READ_ONCE(*a_perm);
|
||||||
const u8 b_perm = container_of(b, struct tomoyo_unix_acl, head)->perm;
|
const u8 b_perm = container_of(b, struct tomoyo_unix_acl, head)->perm;
|
||||||
|
|
||||||
if (is_delete)
|
if (is_delete)
|
||||||
perm &= ~b_perm;
|
perm &= ~b_perm;
|
||||||
else
|
else
|
||||||
perm |= b_perm;
|
perm |= b_perm;
|
||||||
*a_perm = perm;
|
WRITE_ONCE(*a_perm, perm);
|
||||||
return !perm;
|
return !perm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1058,30 +1058,30 @@ bool tomoyo_domain_quota_is_ok(struct tomoyo_request_info *r)
|
||||||
|
|
||||||
if (ptr->is_deleted)
|
if (ptr->is_deleted)
|
||||||
continue;
|
continue;
|
||||||
|
/*
|
||||||
|
* Reading perm bitmap might race with tomoyo_merge_*() because
|
||||||
|
* caller does not hold tomoyo_policy_lock mutex. But exceeding
|
||||||
|
* max_learning_entry parameter by a few entries does not harm.
|
||||||
|
*/
|
||||||
switch (ptr->type) {
|
switch (ptr->type) {
|
||||||
case TOMOYO_TYPE_PATH_ACL:
|
case TOMOYO_TYPE_PATH_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_path_acl, head)
|
data_race(perm = container_of(ptr, struct tomoyo_path_acl, head)->perm);
|
||||||
->perm;
|
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_PATH2_ACL:
|
case TOMOYO_TYPE_PATH2_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_path2_acl, head)
|
data_race(perm = container_of(ptr, struct tomoyo_path2_acl, head)->perm);
|
||||||
->perm;
|
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_PATH_NUMBER_ACL:
|
case TOMOYO_TYPE_PATH_NUMBER_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_path_number_acl,
|
data_race(perm = container_of(ptr, struct tomoyo_path_number_acl, head)
|
||||||
head)->perm;
|
->perm);
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_MKDEV_ACL:
|
case TOMOYO_TYPE_MKDEV_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_mkdev_acl,
|
data_race(perm = container_of(ptr, struct tomoyo_mkdev_acl, head)->perm);
|
||||||
head)->perm;
|
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_INET_ACL:
|
case TOMOYO_TYPE_INET_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_inet_acl,
|
data_race(perm = container_of(ptr, struct tomoyo_inet_acl, head)->perm);
|
||||||
head)->perm;
|
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_UNIX_ACL:
|
case TOMOYO_TYPE_UNIX_ACL:
|
||||||
perm = container_of(ptr, struct tomoyo_unix_acl,
|
data_race(perm = container_of(ptr, struct tomoyo_unix_acl, head)->perm);
|
||||||
head)->perm;
|
|
||||||
break;
|
break;
|
||||||
case TOMOYO_TYPE_MANUAL_TASK_ACL:
|
case TOMOYO_TYPE_MANUAL_TASK_ACL:
|
||||||
perm = 0;
|
perm = 0;
|
||||||
|
|
Loading…
Reference in New Issue