Index: sys/xen/xen_intr.c =================================================================== --- sys/xen/xen_intr.c +++ sys/xen/xen_intr.c @@ -396,13 +396,18 @@ *isrcp = NULL; if (port_handlep == NULL) { + xen_intr_handle_t discard; printf("%s: %s: Bad event handle\n", intr_owner, __func__); - return (EINVAL); + port_handlep = &discard; + error = EINVAL; + goto failearly; } isrc = xen_intr_alloc_isrc(params); - if (isrc == NULL) - return (ENOSPC); + if (isrc == NULL) { + error = ENOSPC; + goto failearly; + } refcount_init(&isrc->xi_refcount, 1); cpu = isrc->xi_cpu; mtx_lock(&xen_intr_isrc_lock); @@ -428,10 +433,8 @@ } error = xen_arch_intr_event_bind(isrc, cpu); - if (error != 0) { /* *very* unlikely */ - xen_intr_release_isrc(isrc); - return (error); - } + if (error != 0) /* *very* unlikely */ + goto failrelease; if (isrc->xi_cpu != cpu) { /* @@ -456,12 +459,17 @@ error = xen_intr_add_handler(intr_owner, filter, handler, arg, flags, *port_handlep); - if (error != 0) { - xen_intr_release_isrc(isrc); - return (error); - } + if (error != 0) + goto failrelease; *isrcp = isrc; return (0); + +failrelease: + xen_intr_release_isrc(isrc); + +failearly: + *port_handlep = NULL; + return (error); } /**