@@ -601,7 +601,8 @@ static void SlowCopyContainerAnnotations(uptr src_beg, uptr src_end,
601601 uptr granule_end = granule_beg + granularity;
602602 uptr unpoisoned_bytes = 0 ;
603603
604- for (; dst_ptr != granule_end && dst_ptr != dst_end; ++dst_ptr, ++src_ptr)
604+ uptr end = Min (granule_end, dst_end);
605+ for (; dst_ptr != end; ++dst_ptr, ++src_ptr)
605606 if (!AddressIsPoisoned (src_ptr))
606607 unpoisoned_bytes = dst_ptr - granule_beg + 1 ;
607608 if (dst_ptr < dst_end || dst_ptr == dst_end_down ||
@@ -629,7 +630,8 @@ static void SlowReversedCopyContainerAnnotations(uptr src_beg, uptr src_end,
629630 uptr granule_beg = RoundDownTo (dst_ptr - 1 , granularity);
630631 uptr unpoisoned_bytes = 0 ;
631632
632- for (; dst_ptr != granule_beg && dst_ptr != dst_beg; --dst_ptr, --src_ptr)
633+ uptr end = Max (granule_beg, dst_beg);
634+ for (; dst_ptr != end; --dst_ptr, --src_ptr)
633635 if (unpoisoned_bytes == 0 && !AddressIsPoisoned (src_ptr - 1 ))
634636 unpoisoned_bytes = dst_ptr - granule_beg;
635637
@@ -716,6 +718,7 @@ void __sanitizer_copy_contiguous_container_annotations(const void *src_beg_p,
716718 //
717719 // The only remaining edge cases involve edge granules,
718720 // when the container starts or ends within a granule.
721+ uptr src_beg_up = RoundUpTo (src_beg, granularity);
719722 uptr src_end_up = RoundUpTo (src_end, granularity);
720723 bool copy_in_reversed_order = src_beg < dst_beg && dst_beg <= src_end_up;
721724 if (src_beg % granularity != dst_beg % granularity ||
@@ -739,11 +742,10 @@ void __sanitizer_copy_contiguous_container_annotations(const void *src_beg_p,
739742 CopyContainerFirstGranuleAnnotation (src_beg, dst_beg);
740743 }
741744
742- if (dst_end_down > dst_beg_up) {
743- uptr src_internal_beg = RoundUpTo (src_beg, granularity);
744- __builtin_memmove ((u8 *)MemToShadow (dst_beg_up),
745- (u8 *)MemToShadow (src_internal_beg),
746- (dst_end_down - dst_beg_up) / granularity);
745+ if (dst_beg_up < dst_end_down) {
746+ internal_memmove ((u8 *)MemToShadow (dst_beg_up),
747+ (u8 *)MemToShadow (src_beg_up),
748+ (dst_end_down - dst_beg_up) / granularity);
747749 }
748750
749751 if (copy_in_reversed_order) {
0 commit comments