mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 07:01:23 +00:00
audit: restore AUDIT_LOGINUID unset ABI
A regression was caused by commit780a7654ce
: audit: Make testing for a valid loginuid explicit. (which in turn attempted to fix a regression caused bye1760bd
) When audit_krule_to_data() fills in the rules to get a listing, there was a missing clause to convert back from AUDIT_LOGINUID_SET to AUDIT_LOGINUID. This broke userspace by not returning the same information that was sent and expected. The rule: auditctl -a exit,never -F auid=-1 gives: auditctl -l LIST_RULES: exit,never f24=0 syscall=all when it should give: LIST_RULES: exit,never auid=-1 (0xffffffff) syscall=all Tag it so that it is reported the same way it was set. Create a new private flags audit_krule field (pflags) to store it that won't interact with the public one from the API. Cc: stable@vger.kernel.org # v3.10-rc1+ Signed-off-by: Richard Guy Briggs <rgb@redhat.com> Signed-off-by: Paul Moore <pmoore@redhat.com>
This commit is contained in:
parent
4a92843601
commit
041d7b98ff
2 changed files with 14 additions and 0 deletions
|
@ -47,6 +47,7 @@ struct sk_buff;
|
||||||
|
|
||||||
struct audit_krule {
|
struct audit_krule {
|
||||||
int vers_ops;
|
int vers_ops;
|
||||||
|
u32 pflags;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
u32 listnr;
|
u32 listnr;
|
||||||
u32 action;
|
u32 action;
|
||||||
|
@ -64,6 +65,9 @@ struct audit_krule {
|
||||||
u64 prio;
|
u64 prio;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Flag to indicate legacy AUDIT_LOGINUID unset usage */
|
||||||
|
#define AUDIT_LOGINUID_LEGACY 0x1
|
||||||
|
|
||||||
struct audit_field {
|
struct audit_field {
|
||||||
u32 type;
|
u32 type;
|
||||||
union {
|
union {
|
||||||
|
|
|
@ -442,6 +442,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,
|
||||||
if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) {
|
if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) {
|
||||||
f->type = AUDIT_LOGINUID_SET;
|
f->type = AUDIT_LOGINUID_SET;
|
||||||
f->val = 0;
|
f->val = 0;
|
||||||
|
entry->rule.pflags |= AUDIT_LOGINUID_LEGACY;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = audit_field_valid(entry, f);
|
err = audit_field_valid(entry, f);
|
||||||
|
@ -617,6 +618,13 @@ static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule)
|
||||||
data->buflen += data->values[i] =
|
data->buflen += data->values[i] =
|
||||||
audit_pack_string(&bufp, krule->filterkey);
|
audit_pack_string(&bufp, krule->filterkey);
|
||||||
break;
|
break;
|
||||||
|
case AUDIT_LOGINUID_SET:
|
||||||
|
if (krule->pflags & AUDIT_LOGINUID_LEGACY && !f->val) {
|
||||||
|
data->fields[i] = AUDIT_LOGINUID;
|
||||||
|
data->values[i] = AUDIT_UID_UNSET;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fallthrough if set */
|
||||||
default:
|
default:
|
||||||
data->values[i] = f->val;
|
data->values[i] = f->val;
|
||||||
}
|
}
|
||||||
|
@ -633,6 +641,7 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (a->flags != b->flags ||
|
if (a->flags != b->flags ||
|
||||||
|
a->pflags != b->pflags ||
|
||||||
a->listnr != b->listnr ||
|
a->listnr != b->listnr ||
|
||||||
a->action != b->action ||
|
a->action != b->action ||
|
||||||
a->field_count != b->field_count)
|
a->field_count != b->field_count)
|
||||||
|
@ -751,6 +760,7 @@ struct audit_entry *audit_dupe_rule(struct audit_krule *old)
|
||||||
new = &entry->rule;
|
new = &entry->rule;
|
||||||
new->vers_ops = old->vers_ops;
|
new->vers_ops = old->vers_ops;
|
||||||
new->flags = old->flags;
|
new->flags = old->flags;
|
||||||
|
new->pflags = old->pflags;
|
||||||
new->listnr = old->listnr;
|
new->listnr = old->listnr;
|
||||||
new->action = old->action;
|
new->action = old->action;
|
||||||
for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
|
for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue