|
@@ -141,12 +141,18 @@ EXPORT_SYMBOL_GPL(cn_netlink_send);
|
|
|
*/
|
|
|
static int cn_call_callback(struct sk_buff *skb)
|
|
|
{
|
|
|
+ struct nlmsghdr *nlh;
|
|
|
struct cn_callback_entry *i, *cbq = NULL;
|
|
|
struct cn_dev *dev = &cdev;
|
|
|
struct cn_msg *msg = nlmsg_data(nlmsg_hdr(skb));
|
|
|
struct netlink_skb_parms *nsp = &NETLINK_CB(skb);
|
|
|
int err = -ENODEV;
|
|
|
|
|
|
+ /* verify msg->len is within skb */
|
|
|
+ nlh = nlmsg_hdr(skb);
|
|
|
+ if (nlh->nlmsg_len < NLMSG_HDRLEN + sizeof(struct cn_msg) + msg->len)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
spin_lock_bh(&dev->cbdev->queue_lock);
|
|
|
list_for_each_entry(i, &dev->cbdev->queue_list, callback_entry) {
|
|
|
if (cn_cb_equal(&i->id.id, &msg->id)) {
|