Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 836
b: refs/heads/master
c: 2a0a6eb
h: refs/heads/master
v: v3
  • Loading branch information
Herbert Xu authored and David S. Miller committed May 3, 2005
1 parent 12682c4 commit fb666a7
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 49 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 96c36023434b7b6824b1da72a6b7b1ca61d7310c
refs/heads/master: 2a0a6ebee1d68552152ae8d4aeda91d806995dec
19 changes: 8 additions & 11 deletions trunk/kernel/audit.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
/* Get message from skb (based on rtnetlink_rcv_skb). Each message is
* processed by audit_receive_msg. Malformed skbs with wrong length are
* discarded silently. */
static int audit_receive_skb(struct sk_buff *skb)
static void audit_receive_skb(struct sk_buff *skb)
{
int err;
struct nlmsghdr *nlh;
Expand All @@ -436,7 +436,7 @@ static int audit_receive_skb(struct sk_buff *skb)
while (skb->len >= NLMSG_SPACE(0)) {
nlh = (struct nlmsghdr *)skb->data;
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
return 0;
return;
rlen = NLMSG_ALIGN(nlh->nlmsg_len);
if (rlen > skb->len)
rlen = skb->len;
Expand All @@ -446,23 +446,20 @@ static int audit_receive_skb(struct sk_buff *skb)
netlink_ack(skb, nlh, 0);
skb_pull(skb, rlen);
}
return 0;
}

/* Receive messages from netlink socket. */
static void audit_receive(struct sock *sk, int length)
{
struct sk_buff *skb;
unsigned int qlen;

if (down_trylock(&audit_netlink_sem))
return;
down(&audit_netlink_sem);

/* FIXME: this must not cause starvation */
while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
if (audit_receive_skb(skb) && skb->len)
skb_queue_head(&sk->sk_receive_queue, skb);
else
kfree_skb(skb);
for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
audit_receive_skb(skb);
kfree_skb(skb);
}
up(&audit_netlink_sem);
}
Expand Down
23 changes: 14 additions & 9 deletions trunk/net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -609,26 +609,31 @@ static inline int rtnetlink_rcv_skb(struct sk_buff *skb)

/*
* rtnetlink input queue processing routine:
* - try to acquire shared lock. If it is failed, defer processing.
* - process as much as there was in the queue upon entry.
* - feed skbs to rtnetlink_rcv_skb, until it refuse a message,
* that will occur, when a dump started and/or acquisition of
* exclusive lock failed.
* that will occur, when a dump started.
*/

static void rtnetlink_rcv(struct sock *sk, int len)
{
unsigned int qlen = skb_queue_len(&sk->sk_receive_queue);

do {
struct sk_buff *skb;

if (rtnl_shlock_nowait())
return;
rtnl_lock();

if (qlen > skb_queue_len(&sk->sk_receive_queue))
qlen = skb_queue_len(&sk->sk_receive_queue);

while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
while (qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
if (rtnetlink_rcv_skb(skb)) {
if (skb->len)
if (skb->len) {
skb_queue_head(&sk->sk_receive_queue,
skb);
else
qlen++;
} else
kfree_skb(skb);
break;
}
Expand All @@ -638,7 +643,7 @@ static void rtnetlink_rcv(struct sock *sk, int len)
up(&rtnl_sem);

netdev_run_todo();
} while (rtnl && rtnl->sk_receive_queue.qlen);
} while (qlen);
}

static struct rtnetlink_link link_rtnetlink_table[RTM_NR_MSGTYPES] =
Expand Down
3 changes: 2 additions & 1 deletion trunk/net/decnet/netfilter/dn_rtmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,9 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb)
static void dnrmg_receive_user_sk(struct sock *sk, int len)
{
struct sk_buff *skb;
unsigned int qlen = skb_queue_len(&sk->sk_receive_queue);

while((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
while (qlen-- && (skb = skb_dequeue(&sk->sk_receive_queue))) {
dnrmg_receive_user_skb(skb);
kfree_skb(skb);
}
Expand Down
20 changes: 9 additions & 11 deletions trunk/net/ipv4/netfilter/ip_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,20 +546,18 @@ ipq_rcv_skb(struct sk_buff *skb)
static void
ipq_rcv_sk(struct sock *sk, int len)
{
do {
struct sk_buff *skb;
struct sk_buff *skb;
unsigned int qlen;

if (down_trylock(&ipqnl_sem))
return;
down(&ipqnl_sem);

while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
ipq_rcv_skb(skb);
kfree_skb(skb);
}
for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
ipq_rcv_skb(skb);
kfree_skb(skb);
}

up(&ipqnl_sem);

} while (ipqnl && ipqnl->sk_receive_queue.qlen);
up(&ipqnl_sem);
}

static int
Expand Down
3 changes: 2 additions & 1 deletion trunk/net/ipv4/tcp_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -777,8 +777,9 @@ static inline void tcpdiag_rcv_skb(struct sk_buff *skb)
static void tcpdiag_rcv(struct sock *sk, int len)
{
struct sk_buff *skb;
unsigned int qlen = skb_queue_len(&sk->sk_receive_queue);

while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
while (qlen-- && (skb = skb_dequeue(&sk->sk_receive_queue))) {
tcpdiag_rcv_skb(skb);
kfree_skb(skb);
}
Expand Down
20 changes: 9 additions & 11 deletions trunk/net/ipv6/netfilter/ip6_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,20 +549,18 @@ ipq_rcv_skb(struct sk_buff *skb)
static void
ipq_rcv_sk(struct sock *sk, int len)
{
do {
struct sk_buff *skb;
struct sk_buff *skb;
unsigned int qlen;

if (down_trylock(&ipqnl_sem))
return;
down(&ipqnl_sem);

while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
ipq_rcv_skb(skb);
kfree_skb(skb);
}
for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
ipq_rcv_skb(skb);
kfree_skb(skb);
}

up(&ipqnl_sem);

} while (ipqnl && ipqnl->sk_receive_queue.qlen);
up(&ipqnl_sem);
}

static int
Expand Down
15 changes: 11 additions & 4 deletions trunk/net/xfrm/xfrm_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -1008,17 +1008,24 @@ static int xfrm_user_rcv_skb(struct sk_buff *skb)

static void xfrm_netlink_rcv(struct sock *sk, int len)
{
unsigned int qlen = skb_queue_len(&sk->sk_receive_queue);

do {
struct sk_buff *skb;

down(&xfrm_cfg_sem);

while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
if (qlen > skb_queue_len(&sk->sk_receive_queue))
qlen = skb_queue_len(&sk->sk_receive_queue);

while (qlen--) {
skb = skb_dequeue(&sk->sk_receive_queue);
if (xfrm_user_rcv_skb(skb)) {
if (skb->len)
if (skb->len) {
skb_queue_head(&sk->sk_receive_queue,
skb);
else
qlen++;
} else
kfree_skb(skb);
break;
}
Expand All @@ -1027,7 +1034,7 @@ static void xfrm_netlink_rcv(struct sock *sk, int len)

up(&xfrm_cfg_sem);

} while (xfrm_nl && xfrm_nl->sk_receive_queue.qlen);
} while (qlen);
}

static int build_expire(struct sk_buff *skb, struct xfrm_state *x, int hard)
Expand Down

0 comments on commit fb666a7

Please sign in to comment.