lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Tue,  7 Feb 2017 17:03:21 -0200
From:   Marcelo Ricardo Leitner <marcelo.leitner@...il.com>
To:     netdev@...r.kernel.org
Cc:     linux-sctp@...r.kernel.org, Vlad Yasevich <vyasevich@...il.com>,
        Neil Horman <nhorman@...driver.com>
Subject: [PATCH net-next] sctp: avoid list_del_init if it's freeing the memory right away

There is no reason to use list_del_init() in these places as we are
going to free/destroy the memory in a few lines below.

Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@...il.com>
---
 net/sctp/associola.c     | 14 ++++----------
 net/sctp/auth.c          |  8 ++------
 net/sctp/chunk.c         |  4 ++--
 net/sctp/outqueue.c      | 14 +++++++-------
 net/sctp/sm_make_chunk.c |  3 +--
 5 files changed, 16 insertions(+), 27 deletions(-)

diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index e50dc6d7543fd6acfa7442f3a9ee575203c7718d..7eb9dacfa53a438b20a34319cf01c6c9a591f0c3 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -1638,25 +1638,19 @@ int sctp_assoc_set_id(struct sctp_association *asoc, gfp_t gfp)
 static void sctp_assoc_free_asconf_queue(struct sctp_association *asoc)
 {
 	struct sctp_chunk *asconf;
-	struct sctp_chunk *tmp;
 
-	list_for_each_entry_safe(asconf, tmp, &asoc->addip_chunk_list, list) {
-		list_del_init(&asconf->list);
+	list_for_each_entry(asconf, &asoc->addip_chunk_list, list)
 		sctp_chunk_free(asconf);
-	}
 }
 
 /* Free asconf_ack cache */
 static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc)
 {
 	struct sctp_chunk *ack;
-	struct sctp_chunk *tmp;
 
-	list_for_each_entry_safe(ack, tmp, &asoc->asconf_ack_list,
-				transmitted_list) {
-		list_del_init(&ack->transmitted_list);
+	list_for_each_entry(ack, &asoc->asconf_ack_list,
+			    transmitted_list)
 		sctp_chunk_free(ack);
-	}
 }
 
 /* Clean up the ASCONF_ACK queue */
@@ -1674,7 +1668,7 @@ void sctp_assoc_clean_asconf_ack_cache(const struct sctp_association *asoc)
 				htonl(asoc->peer.addip_serial))
 			break;
 
-		list_del_init(&ack->transmitted_list);
+		list_del(&ack->transmitted_list);
 		sctp_chunk_free(ack);
 	}
 }
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
index f99d4855d3de34e0f0b1bf027a87dde3ad91a522..3db3c95c5b4c32011864f4862a446fd9aca9680c 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -109,7 +109,6 @@ struct sctp_shared_key *sctp_auth_shkey_create(__u16 key_id, gfp_t gfp)
 /* Free the shared key structure */
 static void sctp_auth_shkey_free(struct sctp_shared_key *sh_key)
 {
-	BUG_ON(!list_empty(&sh_key->key_list));
 	sctp_auth_key_put(sh_key->key);
 	sh_key->key = NULL;
 	kfree(sh_key);
@@ -123,11 +122,8 @@ void sctp_auth_destroy_keys(struct list_head *keys)
 	struct sctp_shared_key *ep_key;
 	struct sctp_shared_key *tmp;
 
-	if (list_empty(keys))
-		return;
-
 	key_for_each_safe(ep_key, tmp, keys) {
-		list_del_init(&ep_key->key_list);
+		list_del(&ep_key->key_list);
 		sctp_auth_shkey_free(ep_key);
 	}
 }
@@ -948,7 +944,7 @@ int sctp_auth_del_key_id(struct sctp_endpoint *ep,
 		return -EINVAL;
 
 	/* Delete the shared key */
-	list_del_init(&key->key_list);
+	list_del(&key->key_list);
 	sctp_auth_shkey_free(key);
 
 	return 0;
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c
index e3621cb4827fadb5f5cb41ebe8455dfa3300a765..4c05a51dd53435c0c9c000a7d662758d65c05772 100644
--- a/net/sctp/chunk.c
+++ b/net/sctp/chunk.c
@@ -97,7 +97,7 @@ static void sctp_datamsg_destroy(struct sctp_datamsg *msg)
 
 	/* Release all references. */
 	list_for_each_safe(pos, temp, &msg->chunks) {
-		list_del_init(pos);
+		list_del(pos);
 		chunk = list_entry(pos, struct sctp_chunk, frag_list);
 		/* Check whether we _really_ need to notify. */
 		if (notify < 0) {
@@ -289,7 +289,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
 
 errout:
 	list_for_each_safe(pos, temp, &msg->chunks) {
-		list_del_init(pos);
+		list_del(pos);
 		chunk = list_entry(pos, struct sctp_chunk, frag_list);
 		sctp_chunk_free(chunk);
 	}
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 65abe22d869167b13193e8b057572d9d8f84625c..80d2203af69d8711e611d5ea53e2283364019586 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -231,7 +231,7 @@ static void __sctp_outq_teardown(struct sctp_outq *q)
 
 	/* Throw away chunks that have been gap ACKed.  */
 	list_for_each_safe(lchunk, temp, &q->sacked) {
-		list_del_init(lchunk);
+		list_del(lchunk);
 		chunk = list_entry(lchunk, struct sctp_chunk,
 				   transmitted_list);
 		sctp_chunk_fail(chunk, q->error);
@@ -240,7 +240,7 @@ static void __sctp_outq_teardown(struct sctp_outq *q)
 
 	/* Throw away any chunks in the retransmit queue. */
 	list_for_each_safe(lchunk, temp, &q->retransmit) {
-		list_del_init(lchunk);
+		list_del(lchunk);
 		chunk = list_entry(lchunk, struct sctp_chunk,
 				   transmitted_list);
 		sctp_chunk_fail(chunk, q->error);
@@ -249,7 +249,7 @@ static void __sctp_outq_teardown(struct sctp_outq *q)
 
 	/* Throw away any chunks that are in the abandoned queue. */
 	list_for_each_safe(lchunk, temp, &q->abandoned) {
-		list_del_init(lchunk);
+		list_del(lchunk);
 		chunk = list_entry(lchunk, struct sctp_chunk,
 				   transmitted_list);
 		sctp_chunk_fail(chunk, q->error);
@@ -266,7 +266,7 @@ static void __sctp_outq_teardown(struct sctp_outq *q)
 
 	/* Throw away any leftover control chunks. */
 	list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) {
-		list_del_init(&chunk->list);
+		list_del(&chunk->list);
 		sctp_chunk_free(chunk);
 	}
 }
@@ -392,7 +392,7 @@ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
 		    chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)
 			continue;
 
-		list_del_init(&chk->list);
+		list_del(&chk->list);
 		asoc->sent_cnt_removable--;
 		asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
 
@@ -1329,7 +1329,7 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk)
 				    transmitted_list);
 		tsn = ntohl(tchunk->subh.data_hdr->tsn);
 		if (TSN_lte(tsn, ctsn)) {
-			list_del_init(&tchunk->transmitted_list);
+			list_del(&tchunk->transmitted_list);
 			if (asoc->peer.prsctp_capable &&
 			    SCTP_PR_PRIO_ENABLED(chunk->sinfo.sinfo_flags))
 				asoc->sent_cnt_removable--;
@@ -1828,7 +1828,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
 		 * the ctsn.
 		 */
 		if (TSN_lte(tsn, ctsn)) {
-			list_del_init(lchunk);
+			list_del(lchunk);
 			sctp_chunk_free(chunk);
 		} else {
 			if (TSN_lte(tsn, asoc->adv_peer_ack_point+1)) {
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index ad3445b3408eac9791ee5645b55da68ee14e20b1..d984d88f1f283bdc6f259a115739e19a24eee396 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -1437,7 +1437,6 @@ static struct sctp_chunk *sctp_make_control(const struct sctp_association *asoc,
 static void sctp_chunk_destroy(struct sctp_chunk *chunk)
 {
 	BUG_ON(!list_empty(&chunk->list));
-	list_del_init(&chunk->transmitted_list);
 
 	consume_skb(chunk->skb);
 	consume_skb(chunk->auth_chunk);
@@ -3505,7 +3504,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
 	}
 
 	/* Free the cached last sent asconf chunk. */
-	list_del_init(&asconf->transmitted_list);
+	list_del(&asconf->transmitted_list);
 	sctp_chunk_free(asconf);
 	asoc->addip_last_asconf = NULL;
 
-- 
2.9.3

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ