head = link_insert_deferred_queue(l_ptr,
                                                                          head);
                                if (likely(msg_is_dest(msg, tipc_own_addr))) {
+                                       int ret;
 deliver:
                                        if (likely(msg_isdata(msg))) {
                                                tipc_node_unlock(n_ptr);
                                                continue;
                                        case MSG_FRAGMENTER:
                                                l_ptr->stats.recv_fragments++;
-                                               if (tipc_link_recv_fragment(&l_ptr->defragm_buf,
-                                                                           &buf, &msg)) {
+                                               ret = tipc_link_recv_fragment(
+                                                       &l_ptr->defragm_buf,
+                                                       &buf, &msg);
+                                               if (ret == 1) {
                                                        l_ptr->stats.recv_fragmented++;
                                                        goto deliver;
                                                }
+                                               if (ret == -1)
+                                                       l_ptr->next_in_no--;
                                                break;
                                        case CHANGEOVER_PROTOCOL:
                                                type = msg_type(msg);
                        set_fragm_size(pbuf, fragm_sz);
                        set_expected_frags(pbuf, exp_fragm_cnt - 1);
                } else {
-                       warn("Link unable to reassemble fragmented message\n");
+                       dbg("Link unable to reassemble fragmented message\n");
+                       buf_discard(fbuf);
+                       return -1;
                }
                buf_discard(fbuf);
                return 0;