if (skb->nfct)
                        goto out;
        }
-
+repeat:
        ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum,
                               l3proto, l4proto, &set_reply, &ctinfo);
        if (!ct) {
                nf_conntrack_event_cache(IPCT_REPLY, ct);
 out:
        if (tmpl) {
-               /* Special case: we have to repeat this hook, assign the
-                * template again to this packet. We assume that this packet
-                * has no conntrack assigned. This is used by nf_ct_tcp. */
+               /* Special case: TCP tracker reports an attempt to reopen a
+                * closed/aborted connection. We have to go back and create a
+                * fresh conntrack.
+                */
                if (ret == NF_REPEAT)
-                       skb->nfct = (struct nf_conntrack *)tmpl;
+                       goto repeat;
                else
                        nf_ct_put(tmpl);
        }
 
                        skb->nfctinfo = IP_CT_NEW;
                }
 
-               /* Repeat if requested, see nf_iterate(). */
-               do {
-                       err = nf_conntrack_in(net, info->family,
-                                             NF_INET_PRE_ROUTING, skb);
-               } while (err == NF_REPEAT);
-
+               err = nf_conntrack_in(net, info->family,
+                                     NF_INET_PRE_ROUTING, skb);
                if (err != NF_ACCEPT)
                        return -ENOENT;