public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Yonghong Zhu <yonghong.zhu@intel.com>
To: edk2-devel@lists.01.org
Cc: zhijufan <zhijux.fan@intel.com>, Liming Gao <liming.gao@intel.com>
Subject: [Patch] BaseTools: do basic check in FvImage with header size and signature
Date: Sat, 29 Sep 2018 16:46:49 +0800	[thread overview]
Message-ID: <1538210809-19672-1-git-send-email-yonghong.zhu@intel.com> (raw)

From: zhijufan <zhijux.fan@intel.com>

Add some basic check in FvImage with header size and signature.

Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=1181
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
---
 BaseTools/Source/Python/GenFds/Fv.py | 44 ++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/BaseTools/Source/Python/GenFds/Fv.py b/BaseTools/Source/Python/GenFds/Fv.py
index 0d005eb..510f283 100644
--- a/BaseTools/Source/Python/GenFds/Fv.py
+++ b/BaseTools/Source/Python/GenFds/Fv.py
@@ -193,36 +193,40 @@ class FV (FvClassObject):
                                                 )
 
             #
             # Write the Fv contents to Buffer
             #
-            if os.path.isfile(FvOutputFile):
+            if os.path.isfile(FvOutputFile) and os.path.getsize(FvOutputFile) >= 0x48:
                 FvFileObj = open(FvOutputFile, 'rb')
-                GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)
-                GenFdsGlobalVariable.SharpCounter = 0
-
-                Buffer.write(FvFileObj.read())
-                FvFileObj.seek(0)
                 # PI FvHeader is 0x48 byte
                 FvHeaderBuffer = FvFileObj.read(0x48)
-                # FV alignment position.
-                FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
-                if FvAlignmentValue >= 0x400:
-                    if FvAlignmentValue >= 0x100000:
-                        if FvAlignmentValue >= 0x1000000:
-                        #The max alignment supported by FFS is 16M.
-                            self.FvAlignment = "16M"
+                Signature = FvHeaderBuffer[0x28:0x32]
+                if Signature and Signature.startswith('_FVH'):
+                    GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)
+                    GenFdsGlobalVariable.SharpCounter = 0
+
+                    Buffer.write(FvFileObj.read())
+                    FvFileObj.seek(0)
+                    # FV alignment position.
+                    FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
+                    if FvAlignmentValue >= 0x400:
+                        if FvAlignmentValue >= 0x100000:
+                            if FvAlignmentValue >= 0x1000000:
+                            #The max alignment supported by FFS is 16M.
+                                self.FvAlignment = "16M"
+                            else:
+                                self.FvAlignment = str(FvAlignmentValue / 0x100000) + "M"
                         else:
-                            self.FvAlignment = str(FvAlignmentValue / 0x100000) + "M"
+                            self.FvAlignment = str(FvAlignmentValue / 0x400) + "K"
                     else:
-                        self.FvAlignment = str(FvAlignmentValue / 0x400) + "K"
+                        # FvAlignmentValue is less than 1K
+                        self.FvAlignment = str (FvAlignmentValue)
+                    FvFileObj.close()
+                    GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile
+                    GenFdsGlobalVariable.LargeFileInFvFlags.pop()
                 else:
-                    # FvAlignmentValue is less than 1K
-                    self.FvAlignment = str (FvAlignmentValue)
-                FvFileObj.close()
-                GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile
-                GenFdsGlobalVariable.LargeFileInFvFlags.pop()
+                    GenFdsGlobalVariable.ErrorLogger("Invalid FV file %s." % self.UiFvName)
             else:
                 GenFdsGlobalVariable.ErrorLogger("Failed to generate %s FV file." %self.UiFvName)
         return FvOutputFile
 
     ## _GetBlockSize()
-- 
2.6.1.windows.1



             reply	other threads:[~2018-09-29  8:46 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-29  8:46 Yonghong Zhu [this message]
2018-10-10  5:40 ` [Patch] BaseTools: do basic check in FvImage with header size and signature Zhu, Yonghong

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=1538210809-19672-1-git-send-email-yonghong.zhu@intel.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