From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.byosoft.com.cn (mail.byosoft.com.cn [58.240.74.242]) by mx.groups.io with SMTP id smtpd.web12.4136.1633661262067016184 for ; Thu, 07 Oct 2021 19:47:43 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=none, err=permanent DNS error (domain: byosoft.com.cn, ip: 58.240.74.242, mailfrom: gaoliming@byosoft.com.cn) Received: from DESKTOPS6D0PVI ([58.246.60.130]) (envelope-sender ) by 192.168.6.13 with ESMTP for ; Fri, 08 Oct 2021 10:47:38 +0800 X-WM-Sender: gaoliming@byosoft.com.cn X-Originating-IP: 58.246.60.130 X-WM-AuthFlag: YES X-WM-AuthUser: gaoliming@byosoft.com.cn From: "gaoliming" To: "'Bi, Dandan'" , "'Ma, Hua'" , Cc: "'Wang, Jian J'" References: <33349c0e687ed186cd13db413fa708a8b761ffea.1632894508.git.hua.ma@intel.com> In-Reply-To: Subject: =?UTF-8?B?5Zue5aSNOiBbUEFUQ0hdIE1kZU1vZHVsZVBrZy9Db3JlL0R4ZTogQWRkIGxvY2sgcHJvdGVjdGlvbiBpbiBDb3JlTG9jYXRlSGFuZGxlQnVmZmVyKCk=?= Date: Fri, 8 Oct 2021 10:47:39 +0800 Message-ID: <007401d7bbee$dc0bf260$9423d720$@byosoft.com.cn> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQIIDhQRhoR9l3DzPHmEKqmZA/tmqwNdJfjAq0zYWrA= Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: quoted-printable Content-Language: zh-cn Reviewed-by: Liming Gao > -----=D3=CA=BC=FE=D4=AD=BC=FE----- > =B7=A2=BC=FE=C8=CB: Bi, Dandan > =B7=A2=CB=CD=CA=B1=BC=E4: 2021=C4=EA10=D4=C28=C8=D5 9:40 > =CA=D5=BC=FE=C8=CB: Ma, Hua ; devel@edk2.groups.io > =B3=AD=CB=CD: Wang, Jian J ; Liming Gao > > =D6=F7=CC=E2: RE: [PATCH] MdeModulePkg/Core/Dxe: Add lock protection = in > CoreLocateHandleBuffer() >=20 > Reviewed-by: Dandan Bi >=20 >=20 >=20 > Thanks, > Dandan >=20 > > -----Original Message----- > > From: Ma, Hua > > Sent: Wednesday, September 29, 2021 1:49 PM > > To: devel@edk2.groups.io > > Cc: Ma, Hua ; Wang, Jian J = ; > > Liming Gao ; Bi, Dandan > > > Subject: [PATCH] MdeModulePkg/Core/Dxe: Add lock protection in > > CoreLocateHandleBuffer() > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3666 > > > > Currently, CoreLocateHandleBuffer() follows three steps: > > 1) get the size of protocol database firstly > > 2) allocate the buffer based on the size > > 3) get the protocol database into the buffer There is no lock = protection for > > the whole three steps. If a new protocol added in step 2) by other = task, e.g. > > (event timer handle USB device hotplug). The size of protocol = database may > > be increased and cannot fit into the previous buffer in step 3). The protocol > > database cannot be returned successfully, EFI_BUFFER_TOO_SMALL error > > will be returned. > > > > This patch adds the lock to protect the whole three steps. > > It can make sure the correct protocol database be returned. > > > > Cc: Jian J Wang > > Cc: Liming Gao > > Cc: Dandan Bi > > Signed-off-by: Hua Ma > > --- > > MdeModulePkg/Core/Dxe/Hand/Locate.c | 64 > > +++++++++++++++++++++++------ > > 1 file changed, 51 insertions(+), 13 deletions(-) > > > > diff --git a/MdeModulePkg/Core/Dxe/Hand/Locate.c > > b/MdeModulePkg/Core/Dxe/Hand/Locate.c > > index be17f4cbc3..4987c046c6 100644 > > --- a/MdeModulePkg/Core/Dxe/Hand/Locate.c > > +++ b/MdeModulePkg/Core/Dxe/Hand/Locate.c > > @@ -86,7 +86,8 @@ CoreGetNextLocateByProtocol ( > > > > > > /** > > - Locates the requested handle(s) and returns them in Buffer. > > + Internal function for locating the requested handle(s) and = returns them > in > > Buffer. > > + The caller should already have acquired the ProtocolLock. > > > > @param SearchType The type of search to perform to > locate the > > handles @@ -104,8 +105,7 @@ > > CoreGetNextLocateByProtocol ( > > > > **/ > > EFI_STATUS > > -EFIAPI > > -CoreLocateHandle ( > > +InternalCoreLocateHandle ( > > IN EFI_LOCATE_SEARCH_TYPE SearchType, > > IN EFI_GUID *Protocol OPTIONAL, > > IN VOID *SearchKey OPTIONAL, > > @@ -143,11 +143,6 @@ CoreLocateHandle ( > > ResultBuffer =3D (IHANDLE **) Buffer; > > Status =3D EFI_SUCCESS; > > > > - // > > - // Lock the protocol database > > - // > > - CoreAcquireProtocolLock (); > > - > > // > > // Get the search function based on type > > // > > @@ -190,7 +185,6 @@ CoreLocateHandle ( > > } > > > > if (EFI_ERROR(Status)) { > > - CoreReleaseProtocolLock (); > > return Status; > > } > > > > @@ -247,10 +241,47 @@ CoreLocateHandle ( > > } > > } > > > > - CoreReleaseProtocolLock (); > > return Status; > > } > > > > +/** > > + Locates the requested handle(s) and returns them in Buffer. > > + > > + @param SearchType The type of search to perform to > locate the > > + handles > > + @param Protocol The protocol to search for > > + @param SearchKey Dependant on SearchType > > + @param BufferSize On input the size of Buffer. On > output the > > + size of data returned. > > + @param Buffer The buffer to return the results = in > > + > > + @retval EFI_BUFFER_TOO_SMALL Buffer too small, required buffer > size is > > + returned in BufferSize. > > + @retval EFI_INVALID_PARAMETER Invalid parameter > > + @retval EFI_SUCCESS Successfully found the requested > handle(s) > > and > > + returns them in Buffer. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +CoreLocateHandle ( > > + IN EFI_LOCATE_SEARCH_TYPE SearchType, > > + IN EFI_GUID *Protocol OPTIONAL, > > + IN VOID *SearchKey OPTIONAL, > > + IN OUT UINTN *BufferSize, > > + OUT EFI_HANDLE *Buffer > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + // > > + // Lock the protocol database > > + // > > + CoreAcquireProtocolLock (); > > + Status =3D InternalCoreLocateHandle(SearchType, Protocol, = SearchKey, > > +BufferSize, Buffer); > > + CoreReleaseProtocolLock (); > > + return Status; > > +} > > > > > > /** > > @@ -610,7 +641,6 @@ Done: > > return Status; > > } > > > > - > > /** > > Function returns an array of handles that support the requested > protocol > > in a buffer allocated from pool. This is a version of CoreLocateHandle() > @@ > > -657,7 +687,12 @@ CoreLocateHandleBuffer ( > > BufferSize =3D 0; > > *NumberHandles =3D 0; > > *Buffer =3D NULL; > > - Status =3D CoreLocateHandle ( > > + > > + // > > + // Lock the protocol database > > + // > > + CoreAcquireProtocolLock(); > > + Status =3D InternalCoreLocateHandle ( > > SearchType, > > Protocol, > > SearchKey, > > @@ -674,15 +709,17 @@ CoreLocateHandleBuffer ( > > if (Status !=3D EFI_INVALID_PARAMETER) { > > Status =3D EFI_NOT_FOUND; > > } > > + CoreReleaseProtocolLock (); > > return Status; > > } > > > > *Buffer =3D AllocatePool (BufferSize); > > if (*Buffer =3D=3D NULL) { > > + CoreReleaseProtocolLock (); > > return EFI_OUT_OF_RESOURCES; > > } > > > > - Status =3D CoreLocateHandle ( > > + Status =3D InternalCoreLocateHandle ( > > SearchType, > > Protocol, > > SearchKey, > > @@ -695,6 +732,7 @@ CoreLocateHandleBuffer ( > > *NumberHandles =3D 0; > > } > > > > + CoreReleaseProtocolLock (); > > return Status; > > } > > > > -- > > 2.32.0.windows.2