Skip to content

Commit b180574

Browse files
committed
Addressed copilot's comments
1 parent 96228bd commit b180574

2 files changed

Lines changed: 35 additions & 11 deletions

File tree

src/delta.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ int wb_patch(WB_PATCH_CTX *ctx, uint8_t *dst, uint32_t len)
106106
uint32_t src_off;
107107
uint16_t sz;
108108
uint32_t copy_sz;
109+
uint32_t resume_sz;
109110
if (!ctx)
110111
return -1;
111112
if (len < BLOCK_HDR_SIZE)
@@ -115,13 +116,13 @@ int wb_patch(WB_PATCH_CTX *ctx, uint8_t *dst, uint32_t len)
115116
uint8_t *pp = patch_read_cache(ctx);
116117
if (ctx->matching) {
117118
/* Resume matching block from previous sector */
118-
sz = ctx->blk_sz;
119-
if (sz > len)
120-
sz = len;
119+
resume_sz = ctx->blk_sz;
120+
if (resume_sz > len)
121+
resume_sz = len;
121122
if (ctx->blk_off > ctx->src_size ||
122-
sz > ctx->src_size - ctx->blk_off)
123+
resume_sz > ctx->src_size - ctx->blk_off)
123124
return -1;
124-
memcpy(dst + dst_off, ctx->src_base + ctx->blk_off, sz);
125+
memcpy(dst + dst_off, ctx->src_base + ctx->blk_off, resume_sz);
125126
if (ctx->blk_sz > len) {
126127
ctx->blk_sz -= len;
127128
ctx->blk_off += len;
@@ -130,7 +131,7 @@ int wb_patch(WB_PATCH_CTX *ctx, uint8_t *dst, uint32_t len)
130131
ctx->blk_sz = 0;
131132
ctx->matching = 0;
132133
}
133-
dst_off += sz;
134+
dst_off += resume_sz;
134135
continue;
135136
}
136137
if (*pp == ESC) {
@@ -145,6 +146,9 @@ int wb_patch(WB_PATCH_CTX *ctx, uint8_t *dst, uint32_t len)
145146
src_off = (hdr->off[0] << 16) + (hdr->off[1] << 8) +
146147
hdr->off[2];
147148
sz = (hdr->sz[0] << 8) + hdr->sz[1];
149+
if (src_off > ctx->src_size ||
150+
sz > ctx->src_size - src_off)
151+
return -1;
148152
ctx->matching = 1;
149153
if (sz > (len - dst_off)) {
150154
copy_sz = len - dst_off;
@@ -153,9 +157,6 @@ int wb_patch(WB_PATCH_CTX *ctx, uint8_t *dst, uint32_t len)
153157
} else {
154158
copy_sz = sz;
155159
}
156-
if (src_off > ctx->src_size ||
157-
copy_sz > ctx->src_size - src_off)
158-
return -1;
159160
memcpy(dst + dst_off, ctx->src_base + src_off, copy_sz);
160161
if (sz == copy_sz) {
161162
/* End of the block, reset counters and matching state */

tools/unit-tests/unit-delta.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ START_TEST(test_wb_patch_src_bounds_invalid)
5959
/* ESC + header with src_off beyond src_size */
6060
patch[0] = ESC;
6161
patch[1] = 0x00; /* off[0] */
62-
patch[2] = 0x10; /* off[1] -> 0x001000 */
63-
patch[3] = 0x00; /* off[2] */
62+
patch[2] = 0x10; /* off[1] -> 0x0010FF */
63+
patch[3] = 0xFF; /* off[2] */
6464
patch[4] = 0x00; /* sz[0] */
6565
patch[5] = 0x10; /* sz[1] -> 16 */
6666

@@ -92,6 +92,28 @@ START_TEST(test_wb_patch_resume_bounds_invalid)
9292
}
9393
END_TEST
9494

95+
START_TEST(test_wb_patch_resume_large_len)
96+
{
97+
WB_PATCH_CTX patch_ctx;
98+
uint8_t src[SRC_SIZE] = {0};
99+
uint8_t patch[PATCH_SIZE] = {0};
100+
uint8_t dst[DST_SIZE] = {0};
101+
uint32_t len = 70000;
102+
int ret;
103+
104+
src[0] = 0xA5;
105+
ret = wb_patch_init(&patch_ctx, src, SRC_SIZE, patch, BLOCK_HDR_SIZE);
106+
ck_assert_int_eq(ret, 0);
107+
108+
patch_ctx.matching = 1;
109+
patch_ctx.blk_off = 0;
110+
patch_ctx.blk_sz = 70000;
111+
112+
ret = wb_patch(&patch_ctx, dst, len);
113+
ck_assert_int_eq(ret, -1);
114+
}
115+
END_TEST
116+
95117
START_TEST(test_wb_diff_init_invalid)
96118
{
97119
WB_DIFF_CTX ctx;
@@ -207,6 +229,7 @@ Suite *patch_diff_suite(void)
207229
tcase_add_test(tc_wolfboot_delta, test_wb_diff_init_invalid);
208230
tcase_add_test(tc_wolfboot_delta, test_wb_patch_src_bounds_invalid);
209231
tcase_add_test(tc_wolfboot_delta, test_wb_patch_resume_bounds_invalid);
232+
tcase_add_test(tc_wolfboot_delta, test_wb_patch_resume_large_len);
210233
tcase_add_test(tc_wolfboot_delta, test_wb_patch_and_diff);
211234
suite_add_tcase(s, tc_wolfboot_delta);
212235

0 commit comments

Comments
 (0)