@@ -83,8 +83,8 @@ static void *delta_against(void *buf, unsigned long size, struct object_entry *e
8383
8484 if (!otherbuf )
8585 die ("unable to read %s" , sha1_to_hex (entry -> delta -> sha1 ));
86- delta_buf = diff_delta (buf , size , otherbuf , othersize , & delta_size );
87- if (delta_size != entry -> delta_size )
86+ delta_buf = diff_delta (buf , size , otherbuf , othersize , & delta_size , ~ 0UL );
87+ if (! delta_buf || delta_size != entry -> delta_size )
8888 die ("delta size changed" );
8989 free (buf );
9090 free (otherbuf );
@@ -292,6 +292,7 @@ static int try_delta(struct unpacked *cur, struct unpacked *old)
292292 struct object_entry * cur_entry = cur -> entry ;
293293 struct object_entry * old_entry = old -> entry ;
294294 unsigned long size , oldsize , delta_size ;
295+ long max_size ;
295296 void * delta_buf ;
296297
297298 /* Don't bother doing diffs between different types */
@@ -300,6 +301,8 @@ static int try_delta(struct unpacked *cur, struct unpacked *old)
300301
301302 /* Size is guaranteed to be larger than or equal to oldsize */
302303 size = cur_entry -> size ;
304+ if (size < 50 )
305+ return -1 ;
303306 oldsize = old_entry -> size ;
304307 if (size - oldsize > oldsize / 4 )
305308 return -1 ;
@@ -311,15 +314,14 @@ static int try_delta(struct unpacked *cur, struct unpacked *old)
311314 * more space-efficient (deletes don't have to say _what_ they
312315 * delete).
313316 */
314- delta_buf = diff_delta (cur -> data , size , old -> data , oldsize , & delta_size );
317+ max_size = size / 2 - 20 ;
318+ if (cur_entry -> delta )
319+ max_size = cur_entry -> delta_size - 1 ;
320+ delta_buf = diff_delta (cur -> data , size , old -> data , oldsize , & delta_size , max_size );
315321 if (!delta_buf )
316- die ("unable to create delta" );
317- if (delta_size + 20 < size / 2 ) {
318- if (!cur_entry -> delta || cur_entry -> delta_size > delta_size ) {
319- cur_entry -> delta = old_entry ;
320- cur_entry -> delta_size = delta_size ;
321- }
322- }
322+ return 0 ;
323+ cur_entry -> delta = old_entry ;
324+ cur_entry -> delta_size = delta_size ;
323325 free (delta_buf );
324326 return 0 ;
325327}
0 commit comments