2424#include <stdint.h>
2525#include <string.h>
2626#include <stdio.h>
27+ #include <stdlib.h>
2728
2829#include "delta.h"
2930#define WC_RSA_BLINDING
3536#define DIFF_SIZE 8192
3637
3738
38-
3939START_TEST (test_wb_patch_init_invalid )
4040{
4141 WB_PATCH_CTX ctx ;
@@ -142,11 +142,67 @@ START_TEST(test_wb_diff_init_invalid)
142142}
143143END_TEST
144144
145- static void initialize_buffers (uint8_t * src_a , uint8_t * src_b )
145+ START_TEST (test_wb_diff_match_extends_to_src_b_end )
146+ {
147+ WB_DIFF_CTX diff_ctx ;
148+ uint8_t src_a [BLOCK_HDR_SIZE + 2 ] = {0 };
149+ uint8_t src_b [BLOCK_HDR_SIZE + 1 ] = {0 };
150+ uint8_t patch [DELTA_BLOCK_SIZE ] = {0 };
151+ int ret ;
152+
153+ memset (src_a , 0x41 , sizeof (src_a ));
154+ memset (src_b , 0x41 , sizeof (src_b ));
155+
156+ ret = wb_diff_init (& diff_ctx , src_a , sizeof (src_a ), src_b , sizeof (src_b ));
157+ ck_assert_int_eq (ret , 0 );
158+
159+ ret = wb_diff (& diff_ctx , patch , sizeof (patch ));
160+ ck_assert_int_gt (ret , 0 );
161+ }
162+ END_TEST
163+
164+ START_TEST (test_wb_diff_self_match_extends_to_src_b_end )
165+ {
166+ WB_DIFF_CTX diff_ctx ;
167+ uint8_t * src_a ;
168+ uint8_t * src_b ;
169+ uint8_t patch [DELTA_BLOCK_SIZE ] = {0 };
170+ int sector_size_ret ;
171+ size_t sector_size ;
172+ int ret ;
173+
174+ sector_size_ret = wb_diff_get_sector_size ();
175+ ck_assert_int_gt (sector_size_ret , BLOCK_HDR_SIZE );
176+ sector_size = (size_t )sector_size_ret ;
177+
178+ src_a = calloc (1 , sector_size + BLOCK_HDR_SIZE );
179+ src_b = calloc (1 , sector_size + BLOCK_HDR_SIZE + 1 );
180+ ck_assert_ptr_nonnull (src_a );
181+ ck_assert_ptr_nonnull (src_b );
182+
183+ ret = wb_diff_init (& diff_ctx , src_a , sector_size + BLOCK_HDR_SIZE ,
184+ src_b , sector_size + BLOCK_HDR_SIZE + 1 );
185+ ck_assert_int_eq (ret , 0 );
186+
187+ memset (src_a + sector_size , 0x11 , BLOCK_HDR_SIZE );
188+ memset (src_b , 0x22 , BLOCK_HDR_SIZE + 1 );
189+ memset (src_b + sector_size , 0x22 , BLOCK_HDR_SIZE + 1 );
190+ diff_ctx .off_b = sector_size ;
191+
192+ ret = wb_diff (& diff_ctx , patch , sizeof (patch ));
193+ ck_assert_int_gt (ret , 0 );
194+
195+ free (src_a );
196+ free (src_b );
197+ }
198+ END_TEST
199+
200+ static void initialize_buffers (uint8_t * src_a , uint8_t * src_b , size_t size )
146201{
147202 uint32_t pseudo_rand = 0 ;
148- uint8_t tmp [128 ];
149- for (int i = 0 ; i < SRC_SIZE ; ++ i ) {
203+ size_t i ;
204+
205+ for (i = 0 ; i < size ; ++ i ) {
150206 src_a [i ] = pseudo_rand % 256 ;
151207 src_b [i ] = pseudo_rand % 256 ;
152208 if ((i % 100 ) == 42 ) {
@@ -158,24 +214,24 @@ static void initialize_buffers(uint8_t *src_a, uint8_t *src_b)
158214 }
159215
160216 /* Introduce differences */
161- src_b [100 ] = src_a [100 ] + 1 ;
162- src_b [200 ] = src_a [200 ] + 2 ;
217+ if (size > 100 ) {
218+ src_b [100 ] = src_a [100 ] + 1 ;
219+ }
220+ if (size > 200 ) {
221+ src_b [200 ] = src_a [200 ] + 2 ;
222+ }
163223
164224 /* 10-bytes difference across two blocks */
165- for (int i = 1020 ; i < 1040 ; ++ i ) {
225+ for (int i = 1020 ; i < 1040 && ( size_t ) i < size ; ++ i ) {
166226 src_b [i ] = src_a [i ] + 3 ;
167227 }
168228
169-
170- /* Copy a sequence from A to B, behind */
171- src_a [510 ] = ESC ;
172- memcpy (src_b + 4090 , src_a + 500 , 20 );
173-
174-
175- /* Copy a sequence from B to itself, ahead */
176- src_b [1022 ] = ESC ;
177- memcpy (tmp , src_b + 1020 , 30 );
178- memcpy (src_b + 7163 , tmp , 30 );
229+ if (size > 510 ) {
230+ src_a [510 ] = ESC ;
231+ }
232+ if (size > 1022 ) {
233+ src_b [1022 ] = ESC ;
234+ }
179235
180236}
181237
@@ -192,7 +248,7 @@ START_TEST(test_wb_patch_and_diff)
192248 uint32_t p_written = 0 ;
193249
194250
195- initialize_buffers (src_a , src_b );
251+ initialize_buffers (src_a , src_b , SRC_SIZE );
196252
197253 ret = wb_diff_init (& diff_ctx , src_a , SRC_SIZE , src_b , SRC_SIZE );
198254 ck_assert_int_eq (ret , 0 );
@@ -224,7 +280,7 @@ START_TEST(test_wb_patch_and_diff)
224280 ck_assert_int_eq (i , SRC_SIZE ); // The patched length should match the buffer size
225281
226282 /* Verify that the patched destination matches src_b */
227- for (int i = 0 ; i < SRC_SIZE ; ++ i ) {
283+ for (i = 0 ; i < SRC_SIZE ; ++ i ) {
228284 ck_assert_uint_eq (patched_dst [i ], src_b [i ]);
229285 }
230286}
@@ -247,6 +303,8 @@ Suite *patch_diff_suite(void)
247303 tcase_add_test (tc_wolfboot_delta , test_wb_patch_resume_bounds_invalid );
248304 tcase_add_test (tc_wolfboot_delta , test_wb_patch_resume_large_len );
249305 tcase_add_test (tc_wolfboot_delta , test_wb_patch_trailing_escape_invalid );
306+ tcase_add_test (tc_wolfboot_delta , test_wb_diff_match_extends_to_src_b_end );
307+ tcase_add_test (tc_wolfboot_delta , test_wb_diff_self_match_extends_to_src_b_end );
250308 tcase_add_test (tc_wolfboot_delta , test_wb_patch_and_diff );
251309 suite_add_tcase (s , tc_wolfboot_delta );
252310
0 commit comments