Linux 6.18.18
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.18.18 kernel.
All users of the 6.18 kernel series must upgrade.
The updated 6.18.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.18.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 drivers/ata/libata-eh.c | 1 drivers/ata/libata-scsi.c | 1 include/net/act_api.h | 1 include/net/tc_act/tc_gate.h | 33 ++- net/sched/act_ct.c | 6 net/sched/act_gate.c | 265 +++++++++++++++++++++--------- net/sched/cls_api.c | 7 security/apparmor/apparmorfs.c | 225 +++++++++++++++---------- security/apparmor/include/label.h | 16 - security/apparmor/include/lib.h | 12 + security/apparmor/include/match.h | 1 security/apparmor/include/policy.h | 10 - security/apparmor/include/policy_ns.h | 2 security/apparmor/include/policy_unpack.h | 75 +++++--- security/apparmor/label.c | 12 - security/apparmor/match.c | 58 ++++-- security/apparmor/policy.c | 77 +++++++- security/apparmor/policy_ns.c | 2 security/apparmor/policy_unpack.c | 49 ++++- 20 files changed, 592 insertions(+), 263 deletions(-)
Greg Kroah-Hartman (1):
Linux 6.18.18
John Johansen (6):
apparmor: fix: limit the number of levels of policy namespaces
apparmor: Fix double free of ns_name in aa_replace_profiles()
apparmor: fix unprivileged local user can do privileged policy management
apparmor: fix differential encoding verification
apparmor: fix race on rawdata dereference
apparmor: fix race between freeing data and fs accessing it
Massimiliano Pellizzer (5):
apparmor: validate DFA start states are in bounds in unpack_pdb
apparmor: fix memory leak in verify_header
apparmor: replace recursive profile removal with iterative approach
apparmor: fix side-effect bug in match_char() macro usage
apparmor: fix missing bounds check on DEFAULT table in verify_dfa()
Niklas Cassel (1):
ata: libata: cancel pending work after clearing deferred_qc
Paul Moses (1):
net/sched: act_gate: snapshot parameters with RCU on replace
Victor Nogueira (1):
net/sched: Only allow act_ct to bind to clsact/ingress qdiscs and shared blocks
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 18 -SUBLEVEL = 17 +SUBLEVEL = 18 EXTRAVERSION = NAME = Baby Opossum Posse
drivers/ata/libata-eh.c +1 -0
@@ -659,6 +659,7 @@ void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap,*/ WARN_ON_ONCE (qc->flags &ATA_QCFLAG_ACTIVE ); ap->deferred_qc =NULL ; +cancel_work (&ap->deferred_qc_work);set_host_byte (scmd,DID_TIME_OUT );scsi_eh_finish_cmd (scmd, &ap->eh_done_q); }else if (i <ATA_MAX_QUEUE ) {
drivers/ata/libata-scsi.c +1 -0
@@ -1698,6 +1698,7 @@ void ata_scsi_requeue_deferred_qc(struct ata_port *ap) scmd = qc->scsicmd; ap->deferred_qc =NULL ; +cancel_work (&ap->deferred_qc_work);ata_qc_free (qc); scmd->result = (DID_SOFT_ERROR <<16 );scsi_done (scmd);
include/net/act_api.h +1 -0
@@ -70,6 +70,7 @@ struct tc_action {#define TCA_ACT_FLAGS_REPLACE (1U << (TCA_ACT_FLAGS_USER_BITS + 2))#define TCA_ACT_FLAGS_NO_RTNL (1U << (TCA_ACT_FLAGS_USER_BITS + 3))#define TCA_ACT_FLAGS_AT_INGRESS (1U << (TCA_ACT_FLAGS_USER_BITS + 4)) +#define TCA_ACT_FLAGS_AT_INGRESS_OR_CLSACT (1U << (TCA_ACT_FLAGS_USER_BITS + 5))/* Update lastuse only if needed, to avoid dirtying a cache line. * We use a temp variable to avoid fetching jiffies twice.
include/net/tc_act/tc_gate.h +26 -7
@@ -32,6 +32,7 @@ struct tcf_gate_params {s32 tcfg_clockid;size_t num_entries;struct list_head entries; +struct rcu_head rcu; };#define GATE_ACT_GATE_OPEN BIT(0)
@@ -39,7 +40,7 @@ struct tcf_gate_params {struct tcf_gate {struct tc_action common; -struct tcf_gate_params param; +struct tcf_gate_params __rcu *param;u8 current_gate_status;ktime_t current_close_time;u32 current_entry_octets;
@@ -51,47 +52,65 @@ struct tcf_gate {#define to_gate (a) ((struct tcf_gate *)a) +static inline struct tcf_gate_params *tcf_gate_params_locked (const struct tc_action *a) +{ +struct tcf_gate *gact =to_gate (a); + +return rcu_dereference_protected (gact->param, +lockdep_is_held (&gact->tcf_lock)); +} +static inline s32 tcf_gate_prio (const struct tc_action *a) { +struct tcf_gate_params *p;s32 tcfg_prio; - tcfg_prio =to_gate (a)->param.tcfg_priority; + p =tcf_gate_params_locked (a); + tcfg_prio = p->tcfg_priority;return tcfg_prio; }static inline u64 tcf_gate_basetime (const struct tc_action *a) { +struct tcf_gate_params *p;u64 tcfg_basetime; - tcfg_basetime =to_gate (a)->param.tcfg_basetime; + p =tcf_gate_params_locked (a); + tcfg_basetime = p->tcfg_basetime;return tcfg_basetime; }static inline u64 tcf_gate_cycletime (const struct tc_action *a) { +struct tcf_gate_params *p;u64 tcfg_cycletime; - tcfg_cycletime =to_gate (a)->param.tcfg_cycletime; + p =tcf_gate_params_locked (a); + tcfg_cycletime = p->tcfg_cycletime;return tcfg_cycletime; }static inline u64 tcf_gate_cycletimeext (const struct tc_action *a) { +struct tcf_gate_params *p;u64 tcfg_cycletimeext; - tcfg_cycletimeext =to_gate (a)->param.tcfg_cycletime_ext; + p =tcf_gate_params_locked (a); + tcfg_cycletimeext = p->tcfg_cycletime_ext;return tcfg_cycletimeext; }static inline u32 tcf_gate_num_entries (const struct tc_action *a) { +struct tcf_gate_params *p;u32 num_entries; - num_entries =to_gate (a)->param.num_entries; + p =tcf_gate_params_locked (a); + num_entries = p->num_entries;return num_entries; }
@@ -105,7 +124,7 @@ static inline struct action_gate_entryu32 num_entries;int i =0 ; - p = &to_gate (a)->param; + p =tcf_gate_params_locked (a); num_entries = p->num_entries;list_for_each_entry (entry, &p->entries, list)
net/sched/act_ct.c +6 -0
@@ -1358,6 +1358,12 @@ static int tcf_ct_init(struct net *net, struct nlattr *nla,return -EINVAL ; } +if (bind && !(flags &TCA_ACT_FLAGS_AT_INGRESS_OR_CLSACT )) { +NL_SET_ERR_MSG_MOD (extack, +"Attaching ct to a non ingress/clsact qdisc is unsupported" ); +return -EOPNOTSUPP ; + } + err =nla_parse_nested (tb,TCA_CT_MAX , nla, ct_policy, extack);if (err <0 )return err;
net/sched/act_gate.c +186 -79
385 lines not on this page · raw message
net/sched/cls_api.c +7 -0
@@ -2228,6 +2228,11 @@ static bool is_qdisc_ingress(__u32 classid)return (TC_H_MIN (classid) ==TC_H_MIN (TC_H_MIN_INGRESS )); } +static bool is_ingress_or_clsact (struct tcf_block *block,struct Qdisc *q) +{ +return tcf_block_shared (block) || (q && !!(q->flags &TCQ_F_INGRESS )); +} +static int tc_new_tfilter (struct sk_buff *skb,struct nlmsghdr *n,struct netlink_ext_ack *extack) {
@@ -2420,6 +2425,8 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, flags |=TCA_ACT_FLAGS_NO_RTNL ;if (is_qdisc_ingress (parent)) flags |=TCA_ACT_FLAGS_AT_INGRESS ; +if (is_ingress_or_clsact (block, q)) + flags |=TCA_ACT_FLAGS_AT_INGRESS_OR_CLSACT ; err = tp->ops->change (net, skb, tp, cl, t->tcm_handle, tca, &fh, flags, extack);if (err ==0 ) {
security/apparmor/apparmorfs.c +134 -91
515 lines not on this page · raw message
security/apparmor/include/label.h +8 -8
@@ -102,7 +102,7 @@ enum label_flags {struct aa_label ;struct aa_proxy { -struct kref count; +struct aa_common_ref count;struct aa_label __rcu *label; };
@@ -125,7 +125,7 @@ struct label_it {* vec: vector of profiles comprising the compound label */ struct aa_label { -struct kref count; +struct aa_common_ref count;struct rb_node node;struct rcu_head rcu;struct aa_proxy *proxy;
@@ -357,7 +357,7 @@ int aa_label_match(struct aa_profile *profile, struct aa_ruleset *rules,*/ static inline struct aa_label *__aa_get_label (struct aa_label *l) { -if (l &&kref_get_unless_zero (&l->count)) +if (l &&kref_get_unless_zero (&l->count.count))return l;return NULL ;
@@ -366,7 +366,7 @@ static inline struct aa_label *__aa_get_label(struct aa_label *l)static inline struct aa_label *aa_get_label (struct aa_label *l) {if (l) -kref_get (&(l->count)); +kref_get (&(l->count.count));return l; }
@@ -386,7 +386,7 @@ static inline struct aa_label *aa_get_label_rcu(struct aa_label __rcu **l)rcu_read_lock ();do { c =rcu_dereference (*l); - }while (c && !kref_get_unless_zero (&c->count)); + }while (c && !kref_get_unless_zero (&c->count.count));rcu_read_unlock ();return c;
@@ -426,7 +426,7 @@ static inline struct aa_label *aa_get_newest_label(struct aa_label *l)static inline void aa_put_label (struct aa_label *l) {if (l) -kref_put (&l->count, aa_label_kref); +kref_put (&l->count.count, aa_label_kref); }/* wrapper fn to indicate semantics of the check */
@@ -443,7 +443,7 @@ void aa_proxy_kref(struct kref *kref);static inline struct aa_proxy *aa_get_proxy (struct aa_proxy *proxy) {if (proxy) -kref_get (&(proxy->count)); +kref_get (&(proxy->count.count));return proxy; }
@@ -451,7 +451,7 @@ static inline struct aa_proxy *aa_get_proxy(struct aa_proxy *proxy)static inline void aa_put_proxy (struct aa_proxy *proxy) {if (proxy) -kref_put (&proxy->count, aa_proxy_kref); +kref_put (&proxy->count.count, aa_proxy_kref); }void __aa_proxy_redirect (struct aa_label *orig,struct aa_label *new);
security/apparmor/include/lib.h +12 -0
@@ -85,6 +85,18 @@ void aa_info_message(const char *str);/* Security blob offsets */ extern struct lsm_blob_sizes apparmor_blob_sizes; +enum reftype { +REF_NS , +REF_PROXY , +REF_RAWDATA , +}; + +/* common reference count used by data the shows up in aafs */ +struct aa_common_ref { +struct kref count; +enum reftype reftype; +}; +/** * aa_strneq - compare null terminated @str to a non null terminated substring * @str: a null terminated string
security/apparmor/include/match.h +1 -0
@@ -185,6 +185,7 @@ static inline void aa_put_dfa(struct aa_dfa *dfa)#define MATCH_FLAG_DIFF_ENCODE 0x80000000#define MARK_DIFF_ENCODE 0x40000000#define MATCH_FLAG_OOB_TRANSITION 0x20000000 +#define MARK_DIFF_ENCODE_VERIFIED 0x10000000#define MATCH_FLAGS_MASK 0xff000000#define MATCH_FLAGS_VALID (MATCH_FLAG_DIFF_ENCODE | MATCH_FLAG_OOB_TRANSITION)#define MATCH_FLAGS_INVALID (MATCH_FLAGS_MASK & ~MATCH_FLAGS_VALID)
security/apparmor/include/policy.h +5 -5
@@ -355,7 +355,7 @@ static inline bool profile_mediates_safe(struct aa_profile *profile,static inline struct aa_profile *aa_get_profile (struct aa_profile *p) {if (p) -kref_get (&(p->label.count)); +kref_get (&(p->label.count.count));return p; }
@@ -369,7 +369,7 @@ static inline struct aa_profile *aa_get_profile(struct aa_profile *p)*/ static inline struct aa_profile *aa_get_profile_not0 (struct aa_profile *p) { -if (p &&kref_get_unless_zero (&p->label.count)) +if (p &&kref_get_unless_zero (&p->label.count.count))return p;return NULL ;
@@ -389,7 +389,7 @@ static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)rcu_read_lock ();do { c =rcu_dereference (*p); - }while (c && !kref_get_unless_zero (&c->label.count)); + }while (c && !kref_get_unless_zero (&c->label.count.count));rcu_read_unlock ();return c;
@@ -402,7 +402,7 @@ static inline struct aa_profile *aa_get_profile_rcu(struct aa_profile __rcu **p)static inline void aa_put_profile (struct aa_profile *p) {if (p) -kref_put (&p->label.count, aa_label_kref); +kref_put (&p->label.count.count, aa_label_kref); }static inline int AUDIT_MODE (struct aa_profile *profile)
@@ -419,7 +419,7 @@ bool aa_policy_admin_capable(const struct cred *subj_cred, struct aa_label *label, struct aa_ns *ns);int aa_may_manage_policy (const struct cred *subj_cred,struct aa_label *label,struct aa_ns *ns, -u32 mask); +const struct cred *ocred,u32 mask);bool aa_current_policy_view_capable (struct aa_ns *ns);bool aa_current_policy_admin_capable (struct aa_ns *ns);
security/apparmor/include/policy_ns.h +2 -0
@@ -18,6 +18,8 @@#include "label.h" #include "policy.h" +/* Match max depth of user namespaces */ +#define MAX_NS_DEPTH 32/* struct aa_ns_acct - accounting of profiles in namespace * @max_size: maximum space allowed for all profiles in namespace
security/apparmor/include/policy_unpack.h +45 -30
112 lines not on this page · raw message
security/apparmor/label.c +8 -4
@@ -52,7 +52,8 @@ static void free_proxy(struct aa_proxy *proxy)void aa_proxy_kref (struct kref *kref) { - struct aa_proxy *proxy = container_of(kref, struct aa_proxy, count); + struct aa_proxy *proxy = container_of(kref, struct aa_proxy, + count.count);free_proxy (proxy); }
@@ -63,7 +64,8 @@ struct aa_proxy *aa_alloc_proxy(struct aa_label *label, gfp_t gfp) new =kzalloc (sizeof (struct aa_proxy ), gfp);if (new) { -kref_init (&new->count); +kref_init (&new->count.count); + new->count.reftype =REF_PROXY ;rcu_assign_pointer (new->label,aa_get_label (label)); }return new;
@@ -375,7 +377,8 @@ static void label_free_rcu(struct rcu_head *head)void aa_label_kref (struct kref *kref) { - struct aa_label *label = container_of(kref, struct aa_label, count); + struct aa_label *label = container_of(kref, struct aa_label, + count.count);struct aa_ns *ns =labels_ns (label);if (!ns) {
@@ -412,7 +415,8 @@ bool aa_label_init(struct aa_label *label, int size, gfp_t gfp) label->size = size;/* doesn't include null */ label->vec[size] =NULL ;/* null terminate */ -kref_init (&label->count); +kref_init (&label->count.count); + label->count.reftype =REF_NS ;/* for aafs purposes */ RB_CLEAR_NODE (&label->node);return true;
security/apparmor/match.c +42 -16
93 lines not on this page · raw message
security/apparmor/policy.c +67 -10
153 lines not on this page · raw message
security/apparmor/policy_ns.c +2 -0
@@ -223,6 +223,8 @@ static struct aa_ns *__aa_create_ns(struct aa_ns *parent, const char *name,AA_BUG (!name);AA_BUG (!mutex_is_locked (&parent->lock)); +if (parent->level >MAX_NS_DEPTH ) +return ERR_PTR (-ENOSPC ); ns =alloc_ns (parent->base.hname, name);if (!ns)return ERR_PTR (-ENOMEM );
security/apparmor/policy_unpack.c +37 -12
92 lines not on this page · raw message