| 838 | } |
| 839 | |
| 840 | static int cbfs_payload_decompress(struct cbfs_payload_segment *segments, |
| 841 | struct buffer *buff, int num_seg) |
| 842 | { |
| 843 | struct buffer new_buffer; |
| 844 | struct buffer seg_buffer; |
| 845 | size_t new_buff_sz; |
| 846 | char *in_ptr; |
| 847 | char *out_ptr; |
| 848 | size_t new_offset; |
| 849 | decomp_func_ptr decompress; |
| 850 | |
| 851 | new_offset = num_seg * sizeof(*segments); |
| 852 | new_buff_sz = num_seg * sizeof(*segments); |
| 853 | |
| 854 | /* Find out and allocate the amount of memory occupied |
| 855 | * by the binary data */ |
| 856 | for (int i = 0; i < num_seg; i++) |
| 857 | new_buff_sz += segments[i].mem_len; |
| 858 | |
| 859 | if (buffer_create(&new_buffer, new_buff_sz, "decompressed_buff")) |
| 860 | return -1; |
| 861 | |
| 862 | in_ptr = buffer_get(buff) + new_offset; |
| 863 | out_ptr = buffer_get(&new_buffer) + new_offset; |
| 864 | |
| 865 | for (int i = 0; i < num_seg; i++) { |
| 866 | struct buffer tbuff; |
| 867 | size_t decomp_size; |
| 868 | |
| 869 | /* Segments BSS and ENTRY do not have binary data. */ |
| 870 | if (segments[i].type == PAYLOAD_SEGMENT_BSS || |
| 871 | segments[i].type == PAYLOAD_SEGMENT_ENTRY) { |
| 872 | continue; |
| 873 | } else if (segments[i].type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) { |
| 874 | memcpy(out_ptr, in_ptr, segments[i].len); |
| 875 | segments[i].offset = new_offset; |
| 876 | new_offset += segments[i].len; |
| 877 | in_ptr += segments[i].len; |
| 878 | out_ptr += segments[i].len; |
| 879 | segments[i].compression = CBFS_COMPRESS_NONE; |
| 880 | continue; |
| 881 | } |
| 882 | |
| 883 | /* The payload uses an unknown compression algorithm. */ |
| 884 | decompress = decompression_function(segments[i].compression); |
| 885 | if (decompress == NULL) { |
| 886 | ERROR("Unknown decompression algorithm: %u\n", |
| 887 | segments[i].compression); |
| 888 | return -1; |
| 889 | } |
| 890 | |
| 891 | if (buffer_create(&tbuff, segments[i].mem_len, "segment")) { |
| 892 | buffer_delete(&new_buffer); |
| 893 | return -1; |
| 894 | } |
| 895 | |
| 896 | if (decompress(in_ptr, segments[i].len, buffer_get(&tbuff), |
| 897 | (int) buffer_size(&tbuff), |
no test coverage detected