Reviewed-by: Bob Feng <bob.c.feng@intel.com><br /><br />On Fri, May 14, 2021 at 02:04 PM, Yuwei Chen wrote:<br />
<blockquote>REF: <a href="https://bugzilla.tianocore.org/show_bug.cgi?id=2946" target="_blank" rel="noopener">https://bugzilla.tianocore.org/show_bug.cgi?id=2946</a><br /><br />Currenly, when using the Brotli tool to compress data, the output<br />compressed binary file does not record complete compressed data<br />when size of input file is too large, which makes the data loss and<br />will trigger decompress-check issue.<br /><br />The Brotli document mentioned:<br />The brotli tool use BrotliEncoderCompressStream method to compresses<br />input stream to output stream. Under some circumstances (e.g. lack of<br />output stream capacity) the BrotliEncoderOperation would require<br />several calls to BrotliEncoderCompressStream. The method must be<br />called again until both input stream is depleted and encoder has no<br />more output after the method is called.<br /><br />This patch fixes this issue based on the Brotli document.<br /><br />Cc: Bob Feng <bob.c.feng@intel.com><br />Cc: Liming Gao <gaoliming@byosoft.com.cn><br />Signed-off-by: Yuwei Chen <yuwei.chen@intel.com><br />---<br />.../Source/C/BrotliCompress/BrotliCompress.c | 61 ++++++++++++-------<br />1 file changed, 38 insertions(+), 23 deletions(-)<br /><br />diff --git a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c<br />index 5a1400fda310..62a6aed3dbd0 100644<br />--- a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c<br />+++ b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c<br />@@ -156,6 +156,7 @@ int CompressFile(char *InputFile, uint8_t *InputBuffer, char *OutputFile, uint8_<br />uint8_t *NextOut;<br />uint8_t *Input;<br />uint8_t *Output;<br />+ size_t TotalOut;<br />size_t OutSize;<br />uint32_t SizeHint;<br />BROTLI_BOOL IsOk;<br />@@ -214,39 +215,53 @@ int CompressFile(char *InputFile, uint8_t *InputBuffer, char *OutputFile, uint8_<br />IsEof = !HasMoreInput(InputFileHandle);<br />}<br /><br />- if (!BrotliEncoderCompressStream(EncodeState,<br />- IsEof ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS,<br />- &AvailableIn, &NextIn, &AvailableOut, &NextOut, NULL)) {<br />- printf("Failed to compress data [%s]\n", InputFile);<br />- IsOk = BROTLI_FALSE;<br />- goto Finish;<br />- }<br />- if (AvailableOut == 0) {<br />- OutSize = (size_t)(NextOut - Output);<br />- if (OutSize > 0) {<br />- fwrite(Output, 1, OutSize, OutputFileHandle);<br />- if (ferror(OutputFileHandle)) {<br />- printf("Failed to write output [%s]\n", OutputFile);<br />+ if (!IsEof){<br />+ do{<br />+ if (!BrotliEncoderCompressStream(EncodeState,<br />+ BROTLI_OPERATION_FLUSH,<br />+ &AvailableIn, &NextIn, &AvailableOut, &NextOut, &TotalOut)) {<br />+ printf("Failed to compress data [%s]\n", InputFile);<br />IsOk = BROTLI_FALSE;<br />goto Finish;<br />}<br />+ OutSize = (size_t)(NextOut - Output);<br />+ if (OutSize > 0) {<br />+ fwrite(Output, 1, OutSize, OutputFileHandle);<br />+ if (ferror(OutputFileHandle)) {<br />+ printf("Failed to write output [%s]\n", OutputFile);<br />+ IsOk = BROTLI_FALSE;<br />+ goto Finish;<br />+ }<br />+ }<br />+ NextOut = Output;<br />+ AvailableOut = kFileBufferSize;<br />}<br />- AvailableOut = kFileBufferSize;<br />- NextOut = Output;<br />+ while (AvailableIn > 0 || BrotliEncoderHasMoreOutput(EncodeState));<br />}<br />- if (BrotliEncoderIsFinished(EncodeState)) {<br />- OutSize = (size_t)(NextOut - Output);<br />- if (OutSize > 0) {<br />- fwrite(Output, 1, OutSize, OutputFileHandle);<br />- if (ferror(OutputFileHandle)) {<br />- printf("Failed to write output [%s]\n", OutputFile);<br />+ else{<br />+ do{<br />+ if (!BrotliEncoderCompressStream(EncodeState,<br />+ BROTLI_OPERATION_FINISH,<br />+ &AvailableIn, &NextIn, &AvailableOut, &NextOut, &TotalOut)) {<br />+ printf("Failed to compress data [%s]\n", InputFile);<br />IsOk = BROTLI_FALSE;<br />goto Finish;<br />}<br />- AvailableOut = 0;<br />+ OutSize = (size_t)(NextOut - Output);<br />+ if (OutSize > 0) {<br />+ fwrite(Output, 1, OutSize, OutputFileHandle);<br />+ if (ferror(OutputFileHandle)) {<br />+ printf("Failed to write output [%s]\n", OutputFile);<br />+ IsOk = BROTLI_FALSE;<br />+ goto Finish;<br />+ }<br />+ }<br />+ NextOut = Output;<br />+ AvailableOut = kFileBufferSize;<br />}<br />+ while (AvailableIn > 0 || BrotliEncoderHasMoreOutput(EncodeState));<br />}<br />- if (IsEof) {<br />+ if (BrotliEncoderIsFinished(EncodeState)){<br />break;<br />}<br />}<br />-- <br />2.27.0.windows.1</blockquote>


 <div width="1" style="color:white;clear:both">_._,_._,_</div> <hr>   Groups.io Links:<p>   You receive all messages sent to this group.    <p> <a target="_blank" href="https://edk2.groups.io/g/devel/message/75108">View/Reply Online (#75108)</a> |    |  <a target="_blank" href="https://groups.io/mt/82817984/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>    <a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> | <a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |  <a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>  [edk2-devel-archive@redhat.com]<br> <div width="1" style="color:white;clear:both">_._,_._,_</div>