Revert "Merge "libnl_2: Fix memory leaks" into ics-mr0"

This reverts commit 4f7c0843bbaa9cb4ec3a7890461cebbee689530a, reversing
changes made to 6fb3df8d468a105b49c1cdbbdcb061dc8de022a4.
diff --git a/libnl_2/handlers.c b/libnl_2/handlers.c
index 48dcab4..ec8d512 100644
--- a/libnl_2/handlers.c
+++ b/libnl_2/handlers.c
@@ -39,14 +39,16 @@
 struct nl_cb *nl_cb_clone(struct nl_cb *orig)
 {
 	struct nl_cb *new_cb;
+	int new_refcnt;
 
 	new_cb = nl_cb_alloc(NL_CB_DEFAULT);
 	if (new_cb == NULL)
 		goto fail;
 
-	/* Copy original and set refcount to 1 */
+	/* Preserve reference count and copy original */
+	new_refcnt = new_cb->cb_refcnt;
 	memcpy(new_cb, orig, sizeof(*orig));
-	new_cb->cb_refcnt = 1;
+	new_cb->cb_refcnt = new_refcnt;
 
 	return new_cb;
 fail:
@@ -82,9 +84,9 @@
 
 void nl_cb_put(struct nl_cb *cb)
 {
-	if (!cb)
-		return;
 	cb->cb_refcnt--;
 	if (cb->cb_refcnt <= 0)
 		free(cb);
+
 }
+
diff --git a/libnl_2/netlink.c b/libnl_2/netlink.c
index ee3d600..cc2f88e 100644
--- a/libnl_2/netlink.c
+++ b/libnl_2/netlink.c
@@ -59,14 +59,15 @@
 {
 	int rc = -1;
 	int sk_flags;
-	int RECV_BUF_SIZE = getpagesize();
+	int RECV_BUF_SIZE;
 	int errsv;
 	struct iovec recvmsg_iov;
 	struct msghdr msg;
 
 	/* Allocate buffer */
+	RECV_BUF_SIZE = getpagesize();
 	*buf = (unsigned char *) malloc(RECV_BUF_SIZE);
-	if (!(*buf)) {
+	if (!buf) {
 		rc = -ENOMEM;
 		goto fail;
 	}
@@ -90,11 +91,8 @@
 	errsv = errno;
 	fcntl(sk->s_fd, F_SETFL, sk_flags);
 
-	if (rc < 0) {
+	if (rc < 0)
 		rc = -errsv;
-		free(*buf);
-		*buf = NULL;
-	}
 
 fail:
 	return rc;
@@ -110,6 +108,7 @@
 	int rc, cb_rc = NL_OK, done = 0;
 
 	do {
+
 		unsigned char *buf;
 		int i, rem, flags;
 		struct nlmsghdr *nlh;
@@ -128,7 +127,7 @@
 
 			/* Check for callbacks */
 
-			msg = (struct nl_msg *) malloc(sizeof(struct nl_msg));
+			msg = (struct nl_msg *)malloc(sizeof(struct nl_msg));
 			memset(msg, 0, sizeof(*msg));
 			msg->nm_nlh = nlh;
 
@@ -188,6 +187,7 @@
 			if (done)
 				break;
 		}
+
 		free(buf);
 		buf = NULL;
 
@@ -197,7 +197,7 @@
 
 success:
 fail:
-	return rc;
+	return	rc;
 }
 
 /* Send raw data over netlink socket */
diff --git a/libnl_2/socket.c b/libnl_2/socket.c
index d906cac..ce54f19 100644
--- a/libnl_2/socket.c
+++ b/libnl_2/socket.c
@@ -31,7 +31,7 @@
 }
 
 /* Allocate new netlink socket. */
-static struct nl_sock *_nl_socket_alloc(void)
+struct nl_sock *nl_socket_alloc(void)
 {
 	struct nl_sock *sk;
 	struct timeval tv;
@@ -39,13 +39,13 @@
 
 	sk = (struct nl_sock *) malloc(sizeof(struct nl_sock));
 	if (!sk)
-		return NULL;
+		goto fail;
 	memset(sk, 0, sizeof(*sk));
 
 	/* Get current time */
 
 	if (gettimeofday(&tv, NULL))
-		goto fail;
+		return NULL;
 	else
 		sk->s_seq_next = (int) tv.tv_sec;
 
@@ -59,36 +59,24 @@
 	sk->s_peer.nl_pid = 0; /* Kernel */
 	sk->s_peer.nl_groups = 0; /* No groups */
 
-	return sk;
-fail:
-	free(sk);
-	return NULL;
-}
-
-/* Allocate new netlink socket. */
-struct nl_sock *nl_socket_alloc(void)
-{
-	struct nl_sock *sk = _nl_socket_alloc();
-	struct nl_cb *cb;
-
-	if (!sk)
-		return NULL;
-
-	cb = nl_cb_alloc(NL_CB_DEFAULT);
+	cb = (struct nl_cb *) malloc(sizeof(struct nl_cb));
 	if (!cb)
 		goto cb_fail;
-	sk->s_cb = cb;
+	memset(cb, 0, sizeof(*cb));
+	sk->s_cb = nl_cb_alloc(NL_CB_DEFAULT);
+
+
 	return sk;
 cb_fail:
 	free(sk);
+fail:
 	return NULL;
 }
 
 /* Allocate new socket with custom callbacks. */
 struct nl_sock *nl_socket_alloc_cb(struct nl_cb *cb)
 {
-	struct nl_sock *sk = _nl_socket_alloc();
-
+	struct nl_sock *sk = nl_socket_alloc();
 	if (!sk)
 		return NULL;
 
@@ -96,6 +84,7 @@
 	nl_cb_get(cb);
 
 	return sk;
+
 }
 
 /* Free a netlink socket. */
@@ -127,3 +116,5 @@
 {
 	return sk->s_fd;
 }
+
+