I just hit the CR ASSERT [1] in CoreValidateHandle(). It looks like the IHANDLE was a use after free as it was a Pool buffer that was to small to be an IHANDLE and it did not have a valid handle.
I’m trying to understand why it is safe to walk the gHandleList without a lock? Seems like a local could cache a pointer and an event could remove a handle and Link would point to a stale handle?
Kind of feels like I’m missing something?
| EFI_STATUS |
| CoreValidateHandle ( |
| IN EFI_HANDLE UserHandle |
| ) |
| { |
| IHANDLE *Handle; |
| LIST_ENTRY *Link; |
|
|
| if (UserHandle == NULL) { |
| return EFI_INVALID_PARAMETER; |
| } |
|
|
| for (Link = gHandleList.BackLink; Link != &gHandleList; Link = Link->BackLink) { |
| Handle = CR (Link, IHANDLE, AllHandles, EFI_HANDLE_SIGNATURE); |
| if (Handle == (IHANDLE *) UserHandle) { |
| return EFI_SUCCESS; |
| } |
| } |
|
|
| return EFI_INVALID_PARAMETER; |
| } |
|
Thanks,
Andrew Fish