git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gen_stats.c: Duplicate xstats buffer for later use
[pandora-kernel.git]
/
net
/
core
/
gen_stats.c
diff --git
a/net/core/gen_stats.c
b/net/core/gen_stats.c
index
0452eb2
..
91080c1
100644
(file)
--- a/
net/core/gen_stats.c
+++ b/
net/core/gen_stats.c
@@
-31,6
+31,9
@@
gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size)
return 0;
nla_put_failure:
return 0;
nla_put_failure:
+ kfree(d->xstats);
+ d->xstats = NULL;
+ d->xstats_len = 0;
spin_unlock_bh(d->lock);
return -1;
}
spin_unlock_bh(d->lock);
return -1;
}
@@
-204,7
+207,9
@@
int
gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
{
if (d->compat_xstats) {
gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
{
if (d->compat_xstats) {
- d->xstats = st;
+ d->xstats = kmemdup(st, len, GFP_ATOMIC);
+ if (!d->xstats)
+ goto err_out;
d->xstats_len = len;
}
d->xstats_len = len;
}
@@
-212,6
+217,11
@@
gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
return gnet_stats_copy(d, TCA_STATS_APP, st, len);
return 0;
return gnet_stats_copy(d, TCA_STATS_APP, st, len);
return 0;
+
+err_out:
+ d->xstats_len = 0;
+ spin_unlock_bh(d->lock);
+ return -1;
}
EXPORT_SYMBOL(gnet_stats_copy_app);
}
EXPORT_SYMBOL(gnet_stats_copy_app);
@@
-244,6
+254,9
@@
gnet_stats_finish_copy(struct gnet_dump *d)
return -1;
}
return -1;
}
+ kfree(d->xstats);
+ d->xstats = NULL;
+ d->xstats_len = 0;
spin_unlock_bh(d->lock);
return 0;
}
spin_unlock_bh(d->lock);
return 0;
}