return NULL;
sk->s_fd = -1;
- sk->s_cb = cb;
+ sk->s_cb = nl_cb_get(cb);
sk->s_local.nl_family = AF_NETLINK;
sk->s_peer.nl_family = AF_NETLINK;
sk->s_seq_expect = sk->s_seq_next = time(0);
struct nl_sock *nl_socket_alloc(void)
{
struct nl_cb *cb;
-
+ struct nl_sock *sk;
+
cb = nl_cb_alloc(default_cb);
if (!cb)
return NULL;
- return __alloc_socket(cb);
+ /* will increment cb reference count on success */
+ sk = __alloc_socket(cb);
+
+ nl_cb_put(cb);
+
+ return sk;
}
/**
if (cb == NULL)
BUG();
- return __alloc_socket(nl_cb_get(cb));
+ return __alloc_socket(cb);
}
/**
void nl_socket_set_cb(struct nl_sock *sk, struct nl_cb *cb)
{
+ if (cb == NULL)
+ BUG();
+
nl_cb_put(sk->s_cb);
sk->s_cb = nl_cb_get(cb);
}