public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Michael Kubacki" <mikuback@linux.microsoft.com>
To: devel@edk2.groups.io, lersek@redhat.com,
	michael.d.kinney@intel.com,
	"rsingh@ventanamicro.com" <rsingh@ventanamicro.com>,
	"Andrew Fish (afish@apple.com)" <afish@apple.com>,
	"quic_llindhol@quicinc.com" <quic_llindhol@quicinc.com>
Cc: "Ni, Ray" <ray.ni@intel.com>,
	Veeresh Sangolli <veeresh.sangolli@dellteam.com>
Subject: Re: [edk2-devel] [PATCH v2 4/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix NULL_RETURNS Coverity issue
Date: Mon, 20 Nov 2023 09:05:58 -0500	[thread overview]
Message-ID: <94443346-7305-4e5d-b1bd-d4274b764121@linux.microsoft.com> (raw)
In-Reply-To: <41d5de9a-a5e5-7f9b-e088-dd09798f73a5@redhat.com>

On 11/15/2023 5:10 AM, Laszlo Ersek wrote:
> On 11/14/23 20:37, Michael Kubacki wrote:
>> On 11/14/2023 11:21 AM, Michael D Kinney wrote:
>>> Hi Ranbir,
>>>
>>> First I want to recognize your efforts to collect Coverity issues and
>>> propose changes to address
>>>
>>> them.
>>>
>>> I still disagree with adding CpuDealLoop() for any static analysis
>>> issues.
>>>
>>> There have been previous discussions about adding a PANIC() or FATAL()
>>> macro that would
>>>
>>> perform platform specific actions if a condition is detected where the
>>> boot of the platform
>>>
>>> can not continue.  A platform get to make the choice to log or reboot
>>> or hang, etc.  Not the
>>>
>>> code that detected the condition.
>>>
>>> https://edk2.groups.io/g/devel/message/86597
>>> <https://edk2.groups.io/g/devel/message/86597>
>>>
>> After going through hundreds of edk2 static analysis findings, we found
>> a small number of cases where an interface such as PanicLib was useful
>> and recently added an implementation
>> https://github.com/microsoft/mu_basecore/blob/release/202302/MdePkg/Include/Library/PanicLib.h.
>>
>> For example, the return value from calls to MpInitLibWhoAmI() in
>> exception related code often goes unchecked and it's been used there.
>> Being able to separate the library instance implementation linked to a
>> given module from a more broad library class like DebugLib for these
>> cases has also been helpful.
> 
> Ah, great reminder that we have ANALYZER_UNREACHABLE. I've totally
> forgotten about that; my apologies.
> 
> ... I initially thought that a plain "CONST CHAR8  *Description" was not
> too flexible, but on second thought, it should be exactly right. Reason
> being, it's very easy to print. Format specifiers and variable arguments
> (PrintLib style) may be too complex to implement safely within
> PanicReport(). Arguably, no PanicReport() implementation should be
> obligated (by the interface) to depend on, or to reimplement, PrintLib.
> If the calling context permits, the caller can just use PrintLib to
> format the message to a local buffer (on the stack), and pass that to
> PanicReport.
> 
> So this looks very useful to me; can you upstream it?
> 
Thanks for taking a look. We definitely want to align with edk2 on a 
consistent way to handle these scenarios. We'll send a patch for further 
discussion and review.

We've waited to do so to allow the original author (Ken Lautner) to 
return from his time out of office to send that patch.

- Michael

> Laszlo
> 
> 
>>
>>> Unfortunately, in order to fix some of these static analysis issues
>>> correctly, we are going
>>>
>>> to have to identify the use of ASSERT() that really is a fatal
>>> condition that can not continue
>>>
>>> and introduce an implementation approach that provides a platform
>>> handler and
>>>
>>> satisfies the static analysis tools.
>>>
>>> We also have to evaluate if a return error status with a DEBUG_ERROR
>>> message would be a better
>>>
>>> choice than an ASSERT() that can be filtered out by build options.
>>>
>>> Best regards,
>>>
>>> Mike
>>>
>>> *From:* devel@edk2.groups.io <devel@edk2.groups.io> *On Behalf Of
>>> *Ranbir Singh
>>> *Sent:* Tuesday, November 14, 2023 7:08 AM
>>> *To:* Laszlo Ersek <lersek@redhat.com>
>>> *Cc:* devel@edk2.groups.io; Ni, Ray <ray.ni@intel.com>; Veeresh
>>> Sangolli <veeresh.sangolli@dellteam.com>
>>> *Subject:* Re: [edk2-devel] [PATCH v2 4/5]
>>> MdeModulePkg/Bus/Pci/PciBusDxe: Fix NULL_RETURNS Coverity issue
>>>
>>> On Mon, Nov 13, 2023 at 4:58 PM Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com>> wrote:
>>>
>>>      On 11/10/23 07:11, Ranbir Singh wrote:
>>>       > EFI_NOT_READY was listed as one of the error return values in the
>>>       > function header of StartPciDevices(). So, I considered it here.
>>>       >
>>>       > Maybe we can go by a dual approach, including CpuDeadLoop() in
>>>       > StartPciDevices() as well as add return value check at the call
>>>      site in
>>>       > PciBusDriverBindingStart().
>>>
>>>      I don't think this makes much sense, given that execution is not
>>>      supposed to continue past CpuDeadLoop(), so the new error check would
>>>      not be reached.
>>>
>>>      I think two options are realistic:
>>>
>>>      - replace the assert() with a CpuDeadLoop() -- this is my preference
>>>
>>>      - keep the assert, add the "if", and in the caller, handle the
>>>      EFI_NOT_READY error. This is workable too. (Keeping the assert is
>>> goog
>>>      because it shows that we don't expect the "if" to fire.)
>>>
>>>      Anyway, now that we have no way to verify the change against
>>> Coverity, I
>>>      don't know if this patch is worth the churn. :( As I said, this
>>> ASSERT()
>>>      is one of those few justified ones in edk2 core that can indeed never
>>>      fail, IMO.
>>>
>>>      Laszlo
>>>
>>> See, Does the following change look acceptable to you ?
>>>
>>>       ASSERT (RootBridge != NULL);
>>> +  if (RootBridge == NULL) {
>>>
>>> +    CpuDeadLoop ();
>>> +    return EFI_NOT_READY;
>>> +  }
>>>
>>> +
>>>
>>> which retains the existing assert, adds the NULL pointer check and
>>> includes CpuDeadLoop () within the if block. As a result of
>>> CpuDeadLoop (), the return statement afterwards will never reach
>>> execution (=> no need to handle this return value at the call sites),
>>> but will satisfy static analysis tools as the "RootBridge" dereference
>>> scenario doesn't arise thereafter.
>>>
>>>
>>>       >
>>>       > On Tue, Nov 7, 2023 at 10:18 PM Laszlo Ersek <lersek@redhat.com
>>>      <mailto:lersek@redhat.com>
>>>       > <mailto:lersek@redhat.com <mailto:lersek@redhat.com>>> wrote:
>>>       >
>>>       >     On 11/7/23 07:19, Ranbir Singh wrote:
>>>       >     > From: Ranbir Singh <Ranbir.Singh3@Dell.com
>>>      <mailto:Ranbir.Singh3@Dell.com>>
>>>       >     >
>>>       >     > The function StartPciDevices has a check
>>>       >     >
>>>       >     >     ASSERT (RootBridge != NULL);
>>>       >     >
>>>       >     > but this comes into play only in DEBUG mode. In Release
>>>      mode, there
>>>       >     > is no handling if the RootBridge value is NULL and the code
>>>      proceeds
>>>       >     > to unconditionally dereference "RootBridge" which will lead
>>>      to CRASH.
>>>       >     >
>>>       >     > Hence, for safety add NULL pointer checks always and return
>>>       >     > EFI_NOT_READY if RootBridge value is NULL which is one of
>>>      the return
>>>       >     > values as mentioned in the function description header.
>>>       >     >
>>>       >     > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4239
>>>      <https://bugzilla.tianocore.org/show_bug.cgi?id=4239>
>>>       >     <https://bugzilla.tianocore.org/show_bug.cgi?id=4239
>>>      <https://bugzilla.tianocore.org/show_bug.cgi?id=4239>>
>>>       >     >
>>>       >     > Cc: Ray Ni <ray.ni@intel.com <mailto:ray.ni@intel.com>
>>>      <mailto:ray.ni@intel.com <mailto:ray.ni@intel.com>>>
>>>       >     > Co-authored-by: Veeresh Sangolli
>>>      <veeresh.sangolli@dellteam.com <mailto:veeresh.sangolli@dellteam.com>
>>>       >     <mailto:veeresh.sangolli@dellteam.com
>>>      <mailto:veeresh.sangolli@dellteam.com>>>
>>>       >     > Signed-off-by: Ranbir Singh <Ranbir.Singh3@Dell.com
>>>      <mailto:Ranbir.Singh3@Dell.com>>
>>>       >     > Signed-off-by: Ranbir Singh <rsingh@ventanamicro.com
>>>      <mailto:rsingh@ventanamicro.com>
>>>       >     <mailto:rsingh@ventanamicro.com
>>>      <mailto:rsingh@ventanamicro.com>>>
>>>       >     > ---
>>>       >     >  MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c | 5 ++++-
>>>       >     >  1 file changed, 4 insertions(+), 1 deletion(-)
>>>       >     >
>>>       >     > diff --git
>>> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c
>>>       >     b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c
>>>       >     > index 581e9075ad41..3de80d98370e 100644
>>>       >     > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c
>>>       >     > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c
>>>       >     > @@ -772,7 +772,10 @@ StartPciDevices (
>>>       >     >    LIST_ENTRY     *CurrentLink;
>>>       >     >
>>>       >     >    RootBridge = GetRootBridgeByHandle (Controller);
>>>       >     > -  ASSERT (RootBridge != NULL);
>>>       >     > +  if (RootBridge == NULL) {
>>>       >     > +    return EFI_NOT_READY;
>>>       >     > +  }
>>>       >     > +
>>>       >     >    ThisHostBridge =
>>> RootBridge->PciRootBridgeIo->ParentHandle;
>>>       >     >
>>>       >     >    CurrentLink = mPciDevicePool.ForwardLink;
>>>       >
>>>       >     I don't think this is a good fix.
>>>       >
>>>       >     There is one call site, namely in PciBusDriverBindingStart().
>>>      That call
>>>       >     site does not check the return value. (Of course /s)
>>>       >
>>>       >     I think that this ASSERT() can indeed never fail. Therefore I
>>>      suggest
>>>       >     CpuDeadLoop() instead.
>>>       >
>>>       >     If you insist that CpuDeadLoop() is "too risky" here, then
>>>      the patch is
>>>       >     acceptable, but then the StartPciDevices() call site in
>>>       >     PciBusDriverBindingStart() must check the error properly: we
>>>      must not
>>>       >     install "gEfiPciEnumerationCompleteProtocolGuid", and the
>>>      function must
>>>       >     propagate the error outwards.
>>>       >
>>>       >     Laszlo
>>>       >
>>>
>>>
>>
> 
> 
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#111482): https://edk2.groups.io/g/devel/message/111482
Mute This Topic: https://groups.io/mt/102438320/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  reply	other threads:[~2023-11-20 14:06 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-07  6:19 [edk2-devel] [PATCH v2 0/5] BZ 4239: Fix MdeModulePkg/Bus/Pci/PciBusDxe issues pointed by Coverity Ranbir Singh
2023-11-07  6:19 ` [edk2-devel] [PATCH v2 1/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix DEADCODE Coverity issue Ranbir Singh
2023-11-07 16:21   ` Laszlo Ersek
2023-11-10  6:14     ` Ranbir Singh
2023-11-07  6:19 ` [edk2-devel] [PATCH v2 2/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix MISSING_BREAK Coverity issues Ranbir Singh
2023-11-07  8:15   ` Ni, Ray
2023-11-07 16:23   ` Laszlo Ersek
2023-11-07 17:59     ` Michael D Kinney
2023-11-08  3:51       ` Ranbir Singh
2023-11-08  4:05         ` Michael D Kinney
2023-11-08  4:29           ` Ranbir Singh
2023-11-13 11:24             ` Laszlo Ersek
2023-11-07  6:19 ` [edk2-devel] [PATCH v2 3/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix ARRAY_VS_SINGLETON " Ranbir Singh
2023-11-07 16:41   ` Laszlo Ersek
2023-11-10  5:59     ` Ranbir Singh
2023-11-07  6:19 ` [edk2-devel] [PATCH v2 4/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix NULL_RETURNS Coverity issue Ranbir Singh
2023-11-07 16:48   ` Laszlo Ersek
2023-11-10  6:11     ` Ranbir Singh
2023-11-13 11:28       ` Laszlo Ersek
2023-11-14 15:08         ` Ranbir Singh
2023-11-14 16:21           ` Michael D Kinney
2023-11-14 16:53             ` Ranbir Singh
2023-11-15 10:02               ` Laszlo Ersek
2023-11-14 19:37             ` Michael Kubacki
2023-11-15 10:10               ` Laszlo Ersek
2023-11-20 14:05                 ` Michael Kubacki [this message]
2023-11-15  9:50             ` Laszlo Ersek
2023-11-20  3:57               ` Ranbir Singh
2023-11-21 17:07                 ` Laszlo Ersek
2023-11-07  6:19 ` [edk2-devel] [PATCH v2 5/5] MdeModulePkg/Bus/Pci/PciBusDxe: Fix UNUSED_VALUE Coverity issues Ranbir Singh
2023-11-07 17:20   ` Laszlo Ersek
2023-11-10  6:31     ` Ranbir Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=94443346-7305-4e5d-b1bd-d4274b764121@linux.microsoft.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox