Skip to content

Commit 1c40be1

Browse files
Eric Dumazetdavem330
authored andcommitted
net sched: fix some kernel memory leaks
We leak at least 32bits of kernel memory to user land in tc dump, because we dont init all fields (capab ?) of the dumped structure. Use C99 initializers so that holes and non explicit fields are zeroed. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 001389b commit 1c40be1

File tree

5 files changed

+43
-37
lines changed

5 files changed

+43
-37
lines changed

net/sched/act_gact.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -152,21 +152,24 @@ static int tcf_gact(struct sk_buff *skb, struct tc_action *a, struct tcf_result
152152
static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
153153
{
154154
unsigned char *b = skb_tail_pointer(skb);
155-
struct tc_gact opt;
156155
struct tcf_gact *gact = a->priv;
156+
struct tc_gact opt = {
157+
.index = gact->tcf_index,
158+
.refcnt = gact->tcf_refcnt - ref,
159+
.bindcnt = gact->tcf_bindcnt - bind,
160+
.action = gact->tcf_action,
161+
};
157162
struct tcf_t t;
158163

159-
opt.index = gact->tcf_index;
160-
opt.refcnt = gact->tcf_refcnt - ref;
161-
opt.bindcnt = gact->tcf_bindcnt - bind;
162-
opt.action = gact->tcf_action;
163164
NLA_PUT(skb, TCA_GACT_PARMS, sizeof(opt), &opt);
164165
#ifdef CONFIG_GACT_PROB
165166
if (gact->tcfg_ptype) {
166-
struct tc_gact_p p_opt;
167-
p_opt.paction = gact->tcfg_paction;
168-
p_opt.pval = gact->tcfg_pval;
169-
p_opt.ptype = gact->tcfg_ptype;
167+
struct tc_gact_p p_opt = {
168+
.paction = gact->tcfg_paction,
169+
.pval = gact->tcfg_pval,
170+
.ptype = gact->tcfg_ptype,
171+
};
172+
170173
NLA_PUT(skb, TCA_GACT_PROB, sizeof(p_opt), &p_opt);
171174
}
172175
#endif

net/sched/act_mirred.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,16 @@ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind, i
219219
{
220220
unsigned char *b = skb_tail_pointer(skb);
221221
struct tcf_mirred *m = a->priv;
222-
struct tc_mirred opt;
222+
struct tc_mirred opt = {
223+
.index = m->tcf_index,
224+
.action = m->tcf_action,
225+
.refcnt = m->tcf_refcnt - ref,
226+
.bindcnt = m->tcf_bindcnt - bind,
227+
.eaction = m->tcfm_eaction,
228+
.ifindex = m->tcfm_ifindex,
229+
};
223230
struct tcf_t t;
224231

225-
opt.index = m->tcf_index;
226-
opt.action = m->tcf_action;
227-
opt.refcnt = m->tcf_refcnt - ref;
228-
opt.bindcnt = m->tcf_bindcnt - bind;
229-
opt.eaction = m->tcfm_eaction;
230-
opt.ifindex = m->tcfm_ifindex;
231232
NLA_PUT(skb, TCA_MIRRED_PARMS, sizeof(opt), &opt);
232233
t.install = jiffies_to_clock_t(jiffies - m->tcf_tm.install);
233234
t.lastuse = jiffies_to_clock_t(jiffies - m->tcf_tm.lastuse);

net/sched/act_nat.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -272,19 +272,19 @@ static int tcf_nat_dump(struct sk_buff *skb, struct tc_action *a,
272272
{
273273
unsigned char *b = skb_tail_pointer(skb);
274274
struct tcf_nat *p = a->priv;
275-
struct tc_nat opt;
275+
struct tc_nat opt = {
276+
.old_addr = p->old_addr,
277+
.new_addr = p->new_addr,
278+
.mask = p->mask,
279+
.flags = p->flags,
280+
281+
.index = p->tcf_index,
282+
.action = p->tcf_action,
283+
.refcnt = p->tcf_refcnt - ref,
284+
.bindcnt = p->tcf_bindcnt - bind,
285+
};
276286
struct tcf_t t;
277287

278-
opt.old_addr = p->old_addr;
279-
opt.new_addr = p->new_addr;
280-
opt.mask = p->mask;
281-
opt.flags = p->flags;
282-
283-
opt.index = p->tcf_index;
284-
opt.action = p->tcf_action;
285-
opt.refcnt = p->tcf_refcnt - ref;
286-
opt.bindcnt = p->tcf_bindcnt - bind;
287-
288288
NLA_PUT(skb, TCA_NAT_PARMS, sizeof(opt), &opt);
289289
t.install = jiffies_to_clock_t(jiffies - p->tcf_tm.install);
290290
t.lastuse = jiffies_to_clock_t(jiffies - p->tcf_tm.lastuse);

net/sched/act_simple.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,14 @@ static inline int tcf_simp_dump(struct sk_buff *skb, struct tc_action *a,
164164
{
165165
unsigned char *b = skb_tail_pointer(skb);
166166
struct tcf_defact *d = a->priv;
167-
struct tc_defact opt;
167+
struct tc_defact opt = {
168+
.index = d->tcf_index,
169+
.refcnt = d->tcf_refcnt - ref,
170+
.bindcnt = d->tcf_bindcnt - bind,
171+
.action = d->tcf_action,
172+
};
168173
struct tcf_t t;
169174

170-
opt.index = d->tcf_index;
171-
opt.refcnt = d->tcf_refcnt - ref;
172-
opt.bindcnt = d->tcf_bindcnt - bind;
173-
opt.action = d->tcf_action;
174175
NLA_PUT(skb, TCA_DEF_PARMS, sizeof(opt), &opt);
175176
NLA_PUT_STRING(skb, TCA_DEF_DATA, d->tcfd_defdata);
176177
t.install = jiffies_to_clock_t(jiffies - d->tcf_tm.install);

net/sched/act_skbedit.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,14 @@ static inline int tcf_skbedit_dump(struct sk_buff *skb, struct tc_action *a,
159159
{
160160
unsigned char *b = skb_tail_pointer(skb);
161161
struct tcf_skbedit *d = a->priv;
162-
struct tc_skbedit opt;
162+
struct tc_skbedit opt = {
163+
.index = d->tcf_index,
164+
.refcnt = d->tcf_refcnt - ref,
165+
.bindcnt = d->tcf_bindcnt - bind,
166+
.action = d->tcf_action,
167+
};
163168
struct tcf_t t;
164169

165-
opt.index = d->tcf_index;
166-
opt.refcnt = d->tcf_refcnt - ref;
167-
opt.bindcnt = d->tcf_bindcnt - bind;
168-
opt.action = d->tcf_action;
169170
NLA_PUT(skb, TCA_SKBEDIT_PARMS, sizeof(opt), &opt);
170171
if (d->flags & SKBEDIT_F_PRIORITY)
171172
NLA_PUT(skb, TCA_SKBEDIT_PRIORITY, sizeof(d->priority),

0 commit comments

Comments
 (0)