What if you enable both DMA and Interrupt for a STM32 ADC
I managed to simulate a DMA transfer error, with the ADC configured in continuous conversion mode and indeed, HAL_ADC_ErrorCallback is called twice: one by the DMA because of the transfer error and another one because just after the DMA auto-deactivation due to that error, an overrun happens in the ADC that is captured by the IRQ handler.
As for the other callbacks, half conversion complete and conversion complete do not seem to be called twice, just once, by the DMA handler.