Changeset d091007 in mainline
- Timestamp:
- 2021-06-04T16:58:15Z (3 years ago)
- Branches:
- master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3c8c580
- Parents:
- da15002
- Location:
- boot/generic
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/generic/include/gzip.h
rda15002 rd091007 30 30 #define LIBCOMPRESS_GZIP_H_ 31 31 32 #include <stdbool.h> 32 33 #include <stddef.h> 33 size_t gzip_size(const void *, size_t); 34 35 extern bool gzip_check(const void *, size_t); 36 extern size_t gzip_size(const void *, size_t); 34 37 extern int gzip_expand(const void *, size_t, void *, size_t); 35 38 -
boot/generic/src/gzip.c
rda15002 rd091007 63 63 } __attribute__((packed)) gzip_footer_t; 64 64 65 size_t gzip_size(const void *src, size_t srclen) 65 /** Check GZIP signature 66 * 67 * Checks whether the source buffer start with a GZIP signature. 68 * 69 * @param[in] src Source data buffer. 70 * @param[in] srclen Source buffer size (bytes). 71 * 72 * @return True if GZIP signature found. 73 * @return False if no GZIP signature found. 74 * 75 */ 76 bool gzip_check(const void *src, size_t srclen) 66 77 { 78 if ((srclen < (sizeof(gzip_header_t) + sizeof(gzip_footer_t)))) 79 return false; 80 67 81 gzip_header_t header; 68 gzip_footer_t footer;69 70 if ((srclen < sizeof(header)) || (srclen < sizeof(footer)))71 return 0;72 73 82 memcpy(&header, src, sizeof(header)); 74 memcpy(&footer, src + srclen - sizeof(footer), sizeof(footer));75 83 76 84 if ((header.id1 != GZIP_ID1) || … … 78 86 (header.method != GZIP_METHOD_DEFLATE) || 79 87 ((header.flags & (~GZIP_FLAGS_MASK)) != 0)) 88 return false; 89 90 return true; 91 } 92 93 /** Get uncompressed size 94 * 95 * Note that the uncompressed size is read from the GZIP footer 96 * (and not calculated by acutally decompressing the GZip archive). 97 * Thus the source of the GZip archive needs to be trusted. 98 * 99 * @param[in] src Source data buffer. 100 * @param[out] srclen Source buffer size (bytes). 101 * 102 * @return Uncompressed size. 103 * 104 */ 105 size_t gzip_size(const void *src, size_t srclen) 106 { 107 if (!gzip_check(src, srclen)) 80 108 return 0; 109 110 gzip_footer_t footer; 111 memcpy(&footer, src + srclen - sizeof(footer), sizeof(footer)); 81 112 82 113 return uint32_t_le2host(footer.size); … … 85 116 /** Expand GZIP compressed data 86 117 * 87 * The routine allocates the output buffer based88 * onthe size encoded in the input stream. This118 * The routine compares the output buffer size with 119 * the size encoded in the input stream. This 89 120 * effectively limits the size of the uncompressed 90 121 * data to 4 GiB (expanding input streams that actually … … 108 139 int gzip_expand(const void *src, size_t srclen, void *dest, size_t destlen) 109 140 { 141 if (!gzip_check(src, srclen)) 142 return EINVAL; 143 144 /* Decode header and footer */ 145 110 146 gzip_header_t header; 147 memcpy(&header, src, sizeof(header)); 148 111 149 gzip_footer_t footer; 112 113 if ((srclen < sizeof(header)) || (srclen < sizeof(footer)))114 return EINVAL;115 116 /* Decode header and footer */117 118 memcpy(&header, src, sizeof(header));119 150 memcpy(&footer, src + srclen - sizeof(footer), sizeof(footer)); 120 121 if ((header.id1 != GZIP_ID1) ||122 (header.id2 != GZIP_ID2) ||123 (header.method != GZIP_METHOD_DEFLATE) ||124 ((header.flags & (~GZIP_FLAGS_MASK)) != 0))125 return EINVAL;126 151 127 152 if (destlen != uint32_t_le2host(footer.size)) -
boot/generic/src/payload.c
rda15002 rd091007 61 61 { 62 62 char *e = (char *) ext(s); 63 if ( e != NULL && str_cmp(e, ".gz") == 0)63 if ((e != NULL) && (str_cmp(e, ".gz") == 0)) 64 64 *e = '\0'; 65 }66 67 static bool isgzip(const char *s)68 {69 const char *e = ext(s);70 return e != NULL && str_cmp(e, ".gz") == 0;71 65 } 72 66 … … 82 76 { 83 77 const char *name; 84 const uint8_t *data;85 78 size_t packed_size; 86 size_t unpacked_size;87 79 88 80 if (!tar_info(*cstart, cend, &name, &packed_size)) 89 81 return false; 90 82 91 data = *cstart + TAR_BLOCK_SIZE;83 const uint8_t *data = *cstart + TAR_BLOCK_SIZE; 92 84 *cstart += TAR_BLOCK_SIZE + ALIGN_UP(packed_size, TAR_BLOCK_SIZE); 93 85 94 bool gz = isgzip(name); 95 96 unpacked_size = gz ? gzip_size(data, packed_size) : packed_size; 86 bool gz = gzip_check(data, packed_size); 87 size_t unpacked_size = gz ? gzip_size(data, packed_size) : packed_size; 97 88 98 89 /* Components must be page-aligned. */ … … 156 147 while (tar_info(start, payload_end, &name, &packed_size)) { 157 148 sz = ALIGN_UP(sz, PAGE_SIZE); 158 if ( isgzip(name))149 if (gzip_check(start + TAR_BLOCK_SIZE, packed_size)) 159 150 sz += gzip_size(start + TAR_BLOCK_SIZE, packed_size); 160 151 else
Note:
See TracChangeset
for help on using the changeset viewer.