提交 b529ccf2 编写于 作者: A Arnaldo Carvalho de Melo 提交者: David S. Miller

[NETLINK]: Introduce nlmsg_hdr() helper

For the common "(struct nlmsghdr *)skb->data" sequence, so that we reduce the
number of direct accesses to skb->data and for consistency with all the other
cast skb member helpers.
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 965ffea4
...@@ -212,7 +212,7 @@ static void cn_rx_skb(struct sk_buff *__skb) ...@@ -212,7 +212,7 @@ static void cn_rx_skb(struct sk_buff *__skb)
skb = skb_get(__skb); skb = skb_get(__skb);
if (skb->len >= NLMSG_SPACE(0)) { if (skb->len >= NLMSG_SPACE(0)) {
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(struct cn_msg) || if (nlh->nlmsg_len < sizeof(struct cn_msg) ||
skb->len < nlh->nlmsg_len || skb->len < nlh->nlmsg_len ||
......
...@@ -50,7 +50,7 @@ scsi_nl_rcv_msg(struct sk_buff *skb) ...@@ -50,7 +50,7 @@ scsi_nl_rcv_msg(struct sk_buff *skb)
while (skb->len >= NLMSG_SPACE(0)) { while (skb->len >= NLMSG_SPACE(0)) {
err = 0; err = 0;
nlh = (struct nlmsghdr *) skb->data; nlh = nlmsg_hdr(skb);
if ((nlh->nlmsg_len < (sizeof(*nlh) + sizeof(*hdr))) || if ((nlh->nlmsg_len < (sizeof(*nlh) + sizeof(*hdr))) ||
(skb->len < nlh->nlmsg_len)) { (skb->len < nlh->nlmsg_len)) {
printk(KERN_WARNING "%s: discarding partial skb\n", printk(KERN_WARNING "%s: discarding partial skb\n",
......
...@@ -1081,7 +1081,7 @@ iscsi_if_rx(struct sock *sk, int len) ...@@ -1081,7 +1081,7 @@ iscsi_if_rx(struct sock *sk, int len)
struct nlmsghdr *nlh; struct nlmsghdr *nlh;
struct iscsi_uevent *ev; struct iscsi_uevent *ev;
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(*nlh) || if (nlh->nlmsg_len < sizeof(*nlh) ||
skb->len < nlh->nlmsg_len) { skb->len < nlh->nlmsg_len) {
break; break;
......
...@@ -97,7 +97,7 @@ int ecryptfs_send_netlink(char *data, int data_len, ...@@ -97,7 +97,7 @@ int ecryptfs_send_netlink(char *data, int data_len,
*/ */
static int ecryptfs_process_nl_response(struct sk_buff *skb) static int ecryptfs_process_nl_response(struct sk_buff *skb)
{ {
struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data; struct nlmsghdr *nlh = nlmsg_hdr(skb);
struct ecryptfs_message *msg = NLMSG_DATA(nlh); struct ecryptfs_message *msg = NLMSG_DATA(nlh);
int rc; int rc;
...@@ -181,7 +181,7 @@ static void ecryptfs_receive_nl_message(struct sock *sk, int len) ...@@ -181,7 +181,7 @@ static void ecryptfs_receive_nl_message(struct sock *sk, int len)
"rc = [%d]\n", rc); "rc = [%d]\n", rc);
return; return;
} }
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
if (!NLMSG_OK(nlh, skb->len)) { if (!NLMSG_OK(nlh, skb->len)) {
ecryptfs_printk(KERN_ERR, "Received corrupt netlink " ecryptfs_printk(KERN_ERR, "Received corrupt netlink "
"message\n"); "message\n");
......
...@@ -138,6 +138,11 @@ struct nlattr ...@@ -138,6 +138,11 @@ struct nlattr
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb)
{
return (struct nlmsghdr *)skb->data;
}
struct netlink_skb_parms struct netlink_skb_parms
{ {
struct ucred creds; /* Skb credentials */ struct ucred creds; /* Skb credentials */
......
...@@ -151,7 +151,7 @@ struct audit_buffer { ...@@ -151,7 +151,7 @@ struct audit_buffer {
static void audit_set_pid(struct audit_buffer *ab, pid_t pid) static void audit_set_pid(struct audit_buffer *ab, pid_t pid)
{ {
struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data; struct nlmsghdr *nlh = nlmsg_hdr(ab->skb);
nlh->nlmsg_pid = pid; nlh->nlmsg_pid = pid;
} }
...@@ -750,7 +750,7 @@ static void audit_receive_skb(struct sk_buff *skb) ...@@ -750,7 +750,7 @@ static void audit_receive_skb(struct sk_buff *skb)
u32 rlen; u32 rlen;
while (skb->len >= NLMSG_SPACE(0)) { while (skb->len >= NLMSG_SPACE(0)) {
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
return; return;
rlen = NLMSG_ALIGN(nlh->nlmsg_len); rlen = NLMSG_ALIGN(nlh->nlmsg_len);
...@@ -1268,7 +1268,7 @@ void audit_log_end(struct audit_buffer *ab) ...@@ -1268,7 +1268,7 @@ void audit_log_end(struct audit_buffer *ab)
audit_log_lost("rate limit exceeded"); audit_log_lost("rate limit exceeded");
} else { } else {
if (audit_pid) { if (audit_pid) {
struct nlmsghdr *nlh = (struct nlmsghdr *)ab->skb->data; struct nlmsghdr *nlh = nlmsg_hdr(ab->skb);
nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0); nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0);
skb_queue_tail(&audit_skb_queue, ab->skb); skb_queue_tail(&audit_skb_queue, ab->skb);
ab->skb = NULL; ab->skb = NULL;
......
...@@ -102,7 +102,7 @@ static int prepare_reply(struct genl_info *info, u8 cmd, struct sk_buff **skbp, ...@@ -102,7 +102,7 @@ static int prepare_reply(struct genl_info *info, u8 cmd, struct sk_buff **skbp,
*/ */
static int send_reply(struct sk_buff *skb, pid_t pid) static int send_reply(struct sk_buff *skb, pid_t pid)
{ {
struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data); struct genlmsghdr *genlhdr = nlmsg_data(nlmsg_hdr(skb));
void *reply = genlmsg_data(genlhdr); void *reply = genlmsg_data(genlhdr);
int rc; int rc;
...@@ -121,7 +121,7 @@ static int send_reply(struct sk_buff *skb, pid_t pid) ...@@ -121,7 +121,7 @@ static int send_reply(struct sk_buff *skb, pid_t pid)
static void send_cpu_listeners(struct sk_buff *skb, static void send_cpu_listeners(struct sk_buff *skb,
struct listener_list *listeners) struct listener_list *listeners)
{ {
struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data); struct genlmsghdr *genlhdr = nlmsg_data(nlmsg_hdr(skb));
struct listener *s, *tmp; struct listener *s, *tmp;
struct sk_buff *skb_next, *skb_cur = skb; struct sk_buff *skb_next, *skb_cur = skb;
void *reply = genlmsg_data(genlhdr); void *reply = genlmsg_data(genlhdr);
......
...@@ -102,7 +102,7 @@ static unsigned int dnrmg_hook(unsigned int hook, ...@@ -102,7 +102,7 @@ static unsigned int dnrmg_hook(unsigned int hook,
static inline void dnrmg_receive_user_skb(struct sk_buff *skb) static inline void dnrmg_receive_user_skb(struct sk_buff *skb)
{ {
struct nlmsghdr *nlh = (struct nlmsghdr *)skb->data; struct nlmsghdr *nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
return; return;
......
...@@ -807,7 +807,7 @@ static void nl_fib_input(struct sock *sk, int len) ...@@ -807,7 +807,7 @@ static void nl_fib_input(struct sock *sk, int len)
if (skb == NULL) if (skb == NULL)
return; return;
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len || if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len ||
nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*frn))) { nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*frn))) {
kfree_skb(skb); kfree_skb(skb);
......
...@@ -847,7 +847,7 @@ static inline void inet_diag_rcv_skb(struct sk_buff *skb) ...@@ -847,7 +847,7 @@ static inline void inet_diag_rcv_skb(struct sk_buff *skb)
{ {
if (skb->len >= NLMSG_SPACE(0)) { if (skb->len >= NLMSG_SPACE(0)) {
int err; int err;
struct nlmsghdr *nlh = (struct nlmsghdr *)skb->data; struct nlmsghdr *nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(*nlh) || if (nlh->nlmsg_len < sizeof(*nlh) ||
skb->len < nlh->nlmsg_len) skb->len < nlh->nlmsg_len)
......
...@@ -497,7 +497,7 @@ ipq_rcv_skb(struct sk_buff *skb) ...@@ -497,7 +497,7 @@ ipq_rcv_skb(struct sk_buff *skb)
if (skblen < sizeof(*nlh)) if (skblen < sizeof(*nlh))
return; return;
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
nlmsglen = nlh->nlmsg_len; nlmsglen = nlh->nlmsg_len;
if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen) if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen)
return; return;
......
...@@ -487,7 +487,7 @@ ipq_rcv_skb(struct sk_buff *skb) ...@@ -487,7 +487,7 @@ ipq_rcv_skb(struct sk_buff *skb)
if (skblen < sizeof(*nlh)) if (skblen < sizeof(*nlh))
return; return;
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
nlmsglen = nlh->nlmsg_len; nlmsglen = nlh->nlmsg_len;
if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen) if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen)
return; return;
......
...@@ -1471,7 +1471,7 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *, ...@@ -1471,7 +1471,7 @@ static int netlink_rcv_skb(struct sk_buff *skb, int (*cb)(struct sk_buff *,
int err; int err;
while (skb->len >= nlmsg_total_size(0)) { while (skb->len >= nlmsg_total_size(0)) {
nlh = (struct nlmsghdr *) skb->data; nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len) if (nlh->nlmsg_len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len)
return 0; return 0;
......
...@@ -57,7 +57,7 @@ static int handle_cmd(struct sk_buff *skb, struct genl_info *info) ...@@ -57,7 +57,7 @@ static int handle_cmd(struct sk_buff *skb, struct genl_info *info)
if (rep_buf) { if (rep_buf) {
skb_push(rep_buf, hdr_space); skb_push(rep_buf, hdr_space);
rep_nlh = (struct nlmsghdr *)rep_buf->data; rep_nlh = nlmsg_hdr(rep_buf);
memcpy(rep_nlh, req_nlh, hdr_space); memcpy(rep_nlh, req_nlh, hdr_space);
rep_nlh->nlmsg_len = rep_buf->len; rep_nlh->nlmsg_len = rep_buf->len;
genlmsg_unicast(rep_buf, req_nlh->nlmsg_pid); genlmsg_unicast(rep_buf, req_nlh->nlmsg_pid);
......
...@@ -3786,7 +3786,7 @@ static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb) ...@@ -3786,7 +3786,7 @@ static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
err = -EINVAL; err = -EINVAL;
goto out; goto out;
} }
nlh = (struct nlmsghdr *)skb->data; nlh = nlmsg_hdr(skb);
err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm); err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);
if (err) { if (err) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册