untrusted comment: verify with openbsd-68-base.pub
RWQZj25CSG5R2mvT0vgUJWnSAeishXPa7fIC6YOuw2N/DbBZCNTCTBeV7061u5w9elOesf4ShrZQtpzZVPy7tDDA7l9bAGneyQk=

OpenBSD 6.8 errata 014, February 24, 2021:

A sequence of overlapping IPv4 fragments could crash the kernel in
pf due to an assertion.

Apply by doing:
   signify -Vep /etc/signify/openbsd-68-base.pub -x 014_pffrag.patch.sig \
       -m - | (cd /usr/src && patch -p0)

And then rebuild and install a new kernel:
   KK=`sysctl -n kern.osversion | cut -d# -f1`
   cd /usr/src/sys/arch/`machine`/compile/$KK
   make obj
   make config
   make
   make install

Index: sys/net/pf_norm.c
===================================================================
RCS file: /cvs/src/sys/net/pf_norm.c,v
diff -u -p -r1.219 pf_norm.c
--- sys/net/pf_norm.c   24 Jun 2020 22:03:43 -0000      1.219
+++ sys/net/pf_norm.c   18 Feb 2021 17:47:57 -0000
@@ -671,10 +671,35 @@ pf_fillup_fragment(struct pf_frnode *key

               aftercut = frent->fe_off + frent->fe_len - after->fe_off;
               if (aftercut < after->fe_len) {
+                       int old_index, new_index;
+
                       DPFPRINTF(LOG_NOTICE, "frag tail overlap %d", aftercut);
                       m_adj(after->fe_m, aftercut);
+                       old_index = pf_frent_index(after);
                       after->fe_off += aftercut;
                       after->fe_len -= aftercut;
+                       new_index = pf_frent_index(after);
+                       if (old_index != new_index) {
+                               DPFPRINTF(LOG_DEBUG, "frag index %d, new %d",
+                                   old_index, new_index);
+                               /* Fragment switched queue as fe_off changed */
+                               after->fe_off -= aftercut;
+                               after->fe_len += aftercut;
+                               /* Remove restored fragment from old queue */
+                               pf_frent_remove(frag, after);
+                               after->fe_off += aftercut;
+                               after->fe_len -= aftercut;
+                               /* Insert into correct queue */
+                               if (pf_frent_insert(frag, after, prev)) {
+                                       DPFPRINTF(LOG_WARNING,
+                                           "fragment requeue limit exceeded");
+                                       m_freem(after->fe_m);
+                                       pool_put(&pf_frent_pl, after);
+                                       pf_nfrents--;
+                                       /* There is not way to recover */
+                                       goto free_fragment;
+                               }
+                       }
                       break;
               }