BrObject * BrObject_free(BrRuntime * run, BrObject * object) { char * ptr = (char *) object; if(!ptr) return NULL; ptr -= sizeof(BrHeader); if (run && run->free) run->free(run, ptr); else BrFree(run, ptr); return NULL; }
/** Decompresses a Brotli compressed source buffer. Extracts decompressed data to its original form. If the compressed source data specified by Source is successfully decompressed into Destination, then EFI_SUCCESS is returned. If the compressed source data specified by Source is not in a valid compressed data format, then EFI_INVALID_PARAMETER is returned. @param Source The source buffer containing the compressed data. @param SourceSize The size of source buffer. @param Destination The destination buffer to store the decompressed data. @param DestSize The destination buffer size. @param BuffInfo The pointer to the BROTLI_BUFF instance. @retval EFI_SUCCESS Decompression completed successfully, and the uncompressed buffer is returned in Destination. @retval EFI_INVALID_PARAMETER The source buffer specified by Source is corrupted (not in a valid compressed format). **/ EFI_STATUS BrotliDecompress ( IN CONST VOID* Source, IN UINTN SourceSize, IN OUT VOID* Destination, IN OUT UINTN DestSize, IN VOID * BuffInfo ) { UINT8 * Input; UINT8 * Output; const UINT8 * NextIn; UINT8 * NextOut; size_t TotalOut; size_t AvailableIn; size_t AvailableOut; BrotliResult Result; BrotliState * BroState; VOID * Temp; TotalOut = 0; AvailableOut = FILE_BUFFER_SIZE; Result = BROTLI_RESULT_ERROR; BroState = BrotliCreateState(BrAlloc, BrFree, BuffInfo); Temp = Destination; if (BroState == NULL) { return EFI_INVALID_PARAMETER; } Input = (UINT8 *)BrAlloc(BuffInfo, FILE_BUFFER_SIZE); Output = (UINT8 *)BrAlloc(BuffInfo, FILE_BUFFER_SIZE); if ((Input==NULL) || (Output==NULL)) { BrFree(BuffInfo, Input); BrFree(BuffInfo, Output); BrotliDestroyState(BroState); return EFI_INVALID_PARAMETER; } NextOut = Output; Result = BROTLI_RESULT_NEEDS_MORE_INPUT; while (1) { if (Result == BROTLI_RESULT_NEEDS_MORE_INPUT) { if (SourceSize == 0) { break; } if (SourceSize >= FILE_BUFFER_SIZE) { AvailableIn = FILE_BUFFER_SIZE; }else{ AvailableIn = SourceSize; } CopyMem(Input, Source, AvailableIn); Source = (VOID *)((UINT8 *)Source + AvailableIn); SourceSize -= AvailableIn; NextIn = Input; } else if (Result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) { CopyMem(Temp, Output, FILE_BUFFER_SIZE); AvailableOut = FILE_BUFFER_SIZE; Temp = (VOID *)((UINT8 *)Temp +FILE_BUFFER_SIZE); NextOut = Output; } else { break; /* Error or success. */ } Result = BrotliDecompressStream( &AvailableIn, &NextIn, &AvailableOut, &NextOut, &TotalOut, BroState ); } if (NextOut != Output) { CopyMem(Temp, Output, (size_t)(NextOut - Output)); } DestSize = TotalOut; BrFree(BuffInfo, Input); BrFree(BuffInfo, Output); BrotliDestroyState(BroState); return (Result == BROTLI_RESULT_SUCCESS) ? EFI_SUCCESS : EFI_INVALID_PARAMETER; }