@ -371,8 +371,44 @@ static efi_status_t EFIAPI efi_reinstall_protocol_interface(void *handle,
static efi_status_t EFIAPI efi_uninstall_protocol_interface ( void * handle ,
efi_guid_t * protocol , void * protocol_interface )
{
struct list_head * lhandle ;
int i ;
efi_status_t r = EFI_NOT_FOUND ;
EFI_ENTRY ( " %p, %p, %p " , handle , protocol , protocol_interface ) ;
return EFI_EXIT ( EFI_NOT_FOUND ) ;
if ( ! handle | | ! protocol ) {
r = EFI_INVALID_PARAMETER ;
goto out ;
}
list_for_each ( lhandle , & efi_obj_list ) {
struct efi_object * efiobj ;
efiobj = list_entry ( lhandle , struct efi_object , link ) ;
if ( efiobj - > handle ! = handle )
continue ;
for ( i = 0 ; i < ARRAY_SIZE ( efiobj - > protocols ) ; i + + ) {
struct efi_handler * handler = & efiobj - > protocols [ i ] ;
const efi_guid_t * hprotocol = handler - > guid ;
if ( ! hprotocol )
continue ;
if ( ! guidcmp ( hprotocol , protocol ) ) {
if ( handler - > protocol_interface ) {
r = EFI_ACCESS_DENIED ;
} else {
handler - > guid = 0 ;
r = EFI_SUCCESS ;
}
goto out ;
}
}
}
out :
return EFI_EXIT ( r ) ;
}
static efi_status_t EFIAPI efi_register_protocol_notify ( efi_guid_t * protocol ,
@ -813,7 +849,7 @@ static efi_status_t EFIAPI efi_open_protocol(
struct efi_handler * handler = & efiobj - > protocols [ i ] ;
const efi_guid_t * hprotocol = handler - > guid ;
if ( ! hprotocol )
break ;
continue ;
if ( ! guidcmp ( hprotocol , protocol ) ) {
if ( attributes ! =
EFI_OPEN_PROTOCOL_TEST_PROTOCOL ) {