diff --git a/repos/base-foc/src/core/irq_session_component.cc b/repos/base-foc/src/core/irq_session_component.cc index 7d6e312a0c..c0fb347317 100644 --- a/repos/base-foc/src/core/irq_session_component.cc +++ b/repos/base-foc/src/core/irq_session_component.cc @@ -199,8 +199,18 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, } Irq_args const irq_args(args); - _irq_object.associate(_irq_number, msi, irq_args.trigger(), - irq_args.polarity()); + if (_irq_object.associate(_irq_number, msi, irq_args.trigger(), + irq_args.polarity())) + return; + + /* cleanup */ + if (msi) + msi_alloc.clear(_irq_number, 1); + else { + addr_t const free_irq = _irq_number; + _irq_alloc->free((void *)free_irq); + } + throw Service_denied(); }