55 if(
buf[7] & 0x80) y = -y;
64 if(patchfile_size < 32)
return -1;
65 memcpy(header, patchfile_bin, 32);
68 if(memcmp(header,
"BSDIFF40", 8) != 0)
return -1;
70 int64_t newsize =
offtin(header + 24);
71 if(newsize < 0)
return -1;
75 int bspatch_mem(
const uint8_t* oldfile_bin,
const int64_t oldfile_size,
const uint8_t* patchfile_bin,
const int64_t patchfile_size, uint8_t* newfile_bin) {
76 int64_t oldsize = oldfile_size;
78 int64_t bzctrllen, bzdatalen;
80 const uint8_t* old = oldfile_bin;
81 uint8_t*
new = newfile_bin;
82 int64_t oldpos, newpos;
85 int64_t cpOffset, dpOffset, epOffset;
103 if(patchfile_size < 32)
return -1;
104 memcpy(header, patchfile_bin, 32);
107 if(memcmp(header,
"BSDIFF40", 8) != 0)
return -1;
110 bzctrllen =
offtin(header + 8);
111 bzdatalen =
offtin(header + 16);
112 newsize =
offtin(header + 24);
113 if((bzctrllen < 0) || (bzdatalen < 0) || (newsize < 0))
return -1;
116 cpOffset =
sizeof(header);
117 dpOffset =
sizeof(header) + bzctrllen;
118 epOffset =
sizeof(header) + bzctrllen + bzdatalen;
122 int64_t block_offset_bz2[
NUM_BLOCKS] = {cpOffset, dpOffset, epOffset};
123 int64_t block_size_bz2[
NUM_BLOCKS] = {bzctrllen, bzdatalen, patchfile_size - epOffset};
124 uint8_t* p_decompressed_block_original[
NUM_BLOCKS] = {NULL, NULL, NULL};
125 uint8_t* p_decompressed_block[
NUM_BLOCKS] = {NULL, NULL, NULL};
126 uint8_t* p_decompressed_block_end[
NUM_BLOCKS] = {NULL, NULL, NULL};
129 unsigned int decompressed_size = (
unsigned int)newsize * 4;
130 p_decompressed_block_original[i] = malloc(decompressed_size);
133 if((ret = BZ2_bzBuffToBuffDecompress(
134 (
char*)p_decompressed_block_original[i], &decompressed_size, (
char*)patchfile_bin + block_offset_bz2[i], (
unsigned int)block_size_bz2[i], 0, 0))
142 p_decompressed_block_original[i] = realloc(p_decompressed_block_original[i], decompressed_size);
145 p_decompressed_block[i] = p_decompressed_block_original[i];
146 p_decompressed_block_end[i] = p_decompressed_block[i] + decompressed_size;
150 free(p_decompressed_block_original[i]);
159 while(newpos < newsize) {
161 for(i = 0; i <= 2; i++) {
177 if(newpos + ctrl[0] > newsize) {
179 free(p_decompressed_block_original[i]);
189 memcpy(
new + newpos, p_decompressed_block[
DIFF_BLOCK], ctrl[0]);
193 for(i = 0; i < ctrl[0]; i++) {
194 if((oldpos + i >= 0) && (oldpos + i < oldsize)) {
195 new[newpos + i] += old[oldpos + i];
204 if(newpos + ctrl[1] > newsize) {
212 free(p_decompressed_block_original[i]);
216 memcpy(
new + newpos, p_decompressed_block[
EXTRA_BLOCK], ctrl[1]);
226 free(p_decompressed_block_original[i]);