net/ipv4: Eliminate kstrdup memory leak
The string clone is only used as a temporary copy of the argument val within the while loop, and so it should be freed before leaving the function. The call to strsep, however, modifies clone, so a pointer to the front of the string is kept in saved_clone, to make it possible to free it. The sematic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @r exists@ local idexpression x; expression E; identifier l; statement S; @@ *x= \(kasprintf\|kstrdup\)(...); ... if (x == NULL) S ... when != kfree(x) when != E = x if (...) { <... when != kfree(x) * goto l; ...> * return ...; } // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7e368739e3
commit
c34186ed00
1 changed files with 3 additions and 2 deletions
|
@ -196,10 +196,10 @@ void tcp_get_allowed_congestion_control(char *buf, size_t maxlen)
|
|||
int tcp_set_allowed_congestion_control(char *val)
|
||||
{
|
||||
struct tcp_congestion_ops *ca;
|
||||
char *clone, *name;
|
||||
char *saved_clone, *clone, *name;
|
||||
int ret = 0;
|
||||
|
||||
clone = kstrdup(val, GFP_USER);
|
||||
saved_clone = clone = kstrdup(val, GFP_USER);
|
||||
if (!clone)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -226,6 +226,7 @@ int tcp_set_allowed_congestion_control(char *val)
|
|||
}
|
||||
out:
|
||||
spin_unlock(&tcp_cong_list_lock);
|
||||
kfree(saved_clone);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue