Loading lib/kobject_uevent.c +34 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <linux/socket.h> #include <linux/skbuff.h> #include <linux/netlink.h> #include <linux/uidgid.h> #include <linux/uuid.h> #include <linux/ctype.h> #include <net/sock.h> Loading Loading @@ -296,6 +297,38 @@ static void cleanup_uevent_env(struct subprocess_info *info) } #endif #ifdef CONFIG_NET static struct sk_buff *alloc_uevent_skb(struct kobj_uevent_env *env, const char *action_string, const char *devpath) { struct netlink_skb_parms *parms; struct sk_buff *skb = NULL; char *scratch; size_t len; /* allocate message with maximum possible size */ len = strlen(action_string) + strlen(devpath) + 2; skb = alloc_skb(len + env->buflen, GFP_KERNEL); if (!skb) return NULL; /* add header */ scratch = skb_put(skb, len); sprintf(scratch, "%s@%s", action_string, devpath); skb_put_data(skb, env->buf, env->buflen); parms = &NETLINK_CB(skb); parms->creds.uid = GLOBAL_ROOT_UID; parms->creds.gid = GLOBAL_ROOT_GID; parms->dst_group = 1; parms->portid = 0; return skb; } #endif static int kobject_uevent_net_broadcast(struct kobject *kobj, struct kobj_uevent_env *env, const char *action_string, Loading @@ -314,22 +347,10 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj, continue; if (!skb) { /* allocate message with the maximum possible size */ size_t len = strlen(action_string) + strlen(devpath) + 2; char *scratch; retval = -ENOMEM; skb = alloc_skb(len + env->buflen, GFP_KERNEL); skb = alloc_uevent_skb(env, action_string, devpath); if (!skb) continue; /* add header */ scratch = skb_put(skb, len); sprintf(scratch, "%s@%s", action_string, devpath); skb_put_data(skb, env->buf, env->buflen); NETLINK_CB(skb).dst_group = 1; } retval = netlink_broadcast_filtered(uevent_sock, skb_get(skb), Loading Loading
lib/kobject_uevent.c +34 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #include <linux/socket.h> #include <linux/skbuff.h> #include <linux/netlink.h> #include <linux/uidgid.h> #include <linux/uuid.h> #include <linux/ctype.h> #include <net/sock.h> Loading Loading @@ -296,6 +297,38 @@ static void cleanup_uevent_env(struct subprocess_info *info) } #endif #ifdef CONFIG_NET static struct sk_buff *alloc_uevent_skb(struct kobj_uevent_env *env, const char *action_string, const char *devpath) { struct netlink_skb_parms *parms; struct sk_buff *skb = NULL; char *scratch; size_t len; /* allocate message with maximum possible size */ len = strlen(action_string) + strlen(devpath) + 2; skb = alloc_skb(len + env->buflen, GFP_KERNEL); if (!skb) return NULL; /* add header */ scratch = skb_put(skb, len); sprintf(scratch, "%s@%s", action_string, devpath); skb_put_data(skb, env->buf, env->buflen); parms = &NETLINK_CB(skb); parms->creds.uid = GLOBAL_ROOT_UID; parms->creds.gid = GLOBAL_ROOT_GID; parms->dst_group = 1; parms->portid = 0; return skb; } #endif static int kobject_uevent_net_broadcast(struct kobject *kobj, struct kobj_uevent_env *env, const char *action_string, Loading @@ -314,22 +347,10 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj, continue; if (!skb) { /* allocate message with the maximum possible size */ size_t len = strlen(action_string) + strlen(devpath) + 2; char *scratch; retval = -ENOMEM; skb = alloc_skb(len + env->buflen, GFP_KERNEL); skb = alloc_uevent_skb(env, action_string, devpath); if (!skb) continue; /* add header */ scratch = skb_put(skb, len); sprintf(scratch, "%s@%s", action_string, devpath); skb_put_data(skb, env->buf, env->buflen); NETLINK_CB(skb).dst_group = 1; } retval = netlink_broadcast_filtered(uevent_sock, skb_get(skb), Loading