def _extract_and_handle_bgp4_withdraws(self, withdraw_list):
        """Extracts withdraws advertised in the given update message's
         *MpUnReachNlri* attribute.

        Assumes MPBGP capability is enabled.
        Parameters:
            - update_msg: (Update) is assumed to be checked for all bgp
            message errors.

        Extracted withdraws are added to appropriate *Destination* for further
        processing.
        """
        msg_rf = RF_IPv4_UC
        w_nlris = withdraw_list
        if not w_nlris:
            # If this is EOR of some kind, handle it
            self._handle_eor(msg_rf)

        for w_nlri in w_nlris:
            w_path = bgp_utils.create_path(
                self,
                w_nlri,
                is_withdraw=True
            )

            block, blocked_cause = self._apply_in_filter(w_path)

            received_route = ReceivedRoute(w_path, self, block)
            nlri_str = w_nlri.formatted_nlri_str

            if nlri_str in self._adj_rib_in:
                del self._adj_rib_in[nlri_str]
                self._signal_bus.adj_rib_in_changed(self, received_route)

            if not block:
                # Update appropriate table with withdraws.
                tm = self._core_service.table_manager
                tm.learn_path(w_path)
            else:
                LOG.debug('prefix : %s is blocked by in-bound filter: %s',
                          nlri_str, blocked_cause)