* Remove the head of tx_list
                 */
                list_del(&rec->list);
+               free_sg(sk, rec->sg_plaintext_data,
+                       &rec->sg_plaintext_num_elem, &rec->sg_plaintext_size);
+
                kfree(rec);
        }
 
                                goto tx_err;
 
                        list_del(&rec->list);
+                       free_sg(sk, rec->sg_plaintext_data,
+                               &rec->sg_plaintext_num_elem,
+                               &rec->sg_plaintext_size);
+
                        kfree(rec);
                } else {
                        break;
        rec->sg_encrypted_data[0].offset -= tls_ctx->tx.prepend_size;
        rec->sg_encrypted_data[0].length += tls_ctx->tx.prepend_size;
 
-       free_sg(sk, rec->sg_plaintext_data,
-               &rec->sg_plaintext_num_elem, &rec->sg_plaintext_size);
 
        /* Free the record if error is previously set on socket */
        if (err || sk->sk_err) {
        if (rc == -EINPROGRESS)
                return -EINPROGRESS;
 
-       free_sg(sk, rec->sg_plaintext_data, &rec->sg_plaintext_num_elem,
-               &rec->sg_plaintext_size);
-
        if (rc < 0) {
                tls_err_abort(sk, EBADMSG);
                return rc;
 
                rec = list_first_entry(&ctx->tx_list,
                                       struct tls_rec, list);
+
+               free_sg(sk, rec->sg_plaintext_data,
+                       &rec->sg_plaintext_num_elem,
+                       &rec->sg_plaintext_size);
+
                list_del(&rec->list);
                kfree(rec);
        }
                        &rec->sg_encrypted_num_elem,
                        &rec->sg_encrypted_size);
 
+               free_sg(sk, rec->sg_plaintext_data,
+                       &rec->sg_plaintext_num_elem,
+                       &rec->sg_plaintext_size);
+
                list_del(&rec->list);
                kfree(rec);
        }