Hello.
Thank you for your feedback.
Paul Moore wrote:
I see.
The skb might be already dequeued by other thread while I slept inside
security_post_recv_datagram().
So far, there is no difference between skb_free_datagram() and kfree_skb().
| void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
| {
| kfree_skb(skb);
| }
udp_recvmsg() thinks it might not be ok to directly call kfree_skb().
But you and skb_kill_datagram() think it is ok to directly call kfree_skb(),
I will do so.
Oh, I didn't notice I can insert here. Now I can also move the rest code like
| error = security_post_recv_datagram(sk, skb, flags);
| if (error)
| goto force_dequeue;
| } while (!wait_for_packet(sk, err, &timeo));
|
| return NULL;
| force_dequeue:
| /* dequeue if MSG_PEEK is set. */
| no_packet:
| *err = error;
| return NULL;
to reduce indentation.
Thank you.
-