@@ -528,6 +528,7 @@ cvSubstituteContour( CvContourScanner scanner, CvSeq * new_contour )
528
528
}
529
529
}
530
530
531
+ static const int MAX_SIZE = 16 ;
531
532
532
533
/*
533
534
marks domain border with +/-<constant> and stores the contour into CvSeq.
@@ -544,7 +545,7 @@ icvFetchContour( schar *ptr,
544
545
int _method )
545
546
{
546
547
const schar nbd = 2 ;
547
- int deltas[16 ];
548
+ int deltas[MAX_SIZE ];
548
549
CvSeqWriter writer;
549
550
schar *i0 = ptr, *i1, *i3, *i4 = 0 ;
550
551
int prev_s = -1 , s, s_end;
@@ -588,8 +589,9 @@ icvFetchContour( schar *ptr,
588
589
for ( ;; )
589
590
{
590
591
s_end = s;
592
+ s = std::min (s, MAX_SIZE - 1 );
591
593
592
- for ( ;; )
594
+ while ( s < MAX_SIZE - 1 )
593
595
{
594
596
i4 = i3 + deltas[++s];
595
597
if ( *i4 != 0 )
@@ -654,8 +656,8 @@ icvFetchContour( schar *ptr,
654
656
static int
655
657
icvTraceContour ( schar *ptr, int step, schar *stop_ptr, int is_hole )
656
658
{
657
- int deltas[16 ];
658
- schar *i0 = ptr, *i1, *i3, *i4;
659
+ int deltas[MAX_SIZE ];
660
+ schar *i0 = ptr, *i1, *i3, *i4 = NULL ;
659
661
int s, s_end;
660
662
661
663
/* initialize local state */
@@ -682,7 +684,8 @@ icvTraceContour( schar *ptr, int step, schar *stop_ptr, int is_hole )
682
684
for ( ;; )
683
685
{
684
686
685
- for ( ;; )
687
+ s = std::min (s, MAX_SIZE - 1 );
688
+ while ( s < MAX_SIZE - 1 )
686
689
{
687
690
i4 = i3 + deltas[++s];
688
691
if ( *i4 != 0 )
@@ -709,9 +712,9 @@ icvFetchContourEx( schar* ptr,
709
712
int nbd,
710
713
CvRect* _rect )
711
714
{
712
- int deltas[16 ];
715
+ int deltas[MAX_SIZE ];
713
716
CvSeqWriter writer;
714
- schar *i0 = ptr, *i1, *i3, *i4;
717
+ schar *i0 = ptr, *i1, *i3, *i4 = NULL ;
715
718
CvRect rect;
716
719
int prev_s = -1 , s, s_end;
717
720
int method = _method - 1 ;
@@ -759,8 +762,9 @@ icvFetchContourEx( schar* ptr,
759
762
for ( ;; )
760
763
{
761
764
s_end = s;
765
+ s = std::min (s, MAX_SIZE - 1 );
762
766
763
- for ( ;; )
767
+ while ( s < MAX_SIZE - 1 )
764
768
{
765
769
i4 = i3 + deltas[++s];
766
770
if ( *i4 != 0 )
@@ -833,8 +837,8 @@ icvFetchContourEx( schar* ptr,
833
837
static int
834
838
icvTraceContour_32s ( int *ptr, int step, int *stop_ptr, int is_hole )
835
839
{
836
- int deltas[16 ];
837
- int *i0 = ptr, *i1, *i3, *i4;
840
+ int deltas[MAX_SIZE ];
841
+ int *i0 = ptr, *i1, *i3, *i4 = NULL ;
838
842
int s, s_end;
839
843
const int right_flag = INT_MIN;
840
844
const int new_flag = (int )((unsigned )INT_MIN >> 1 );
@@ -863,8 +867,9 @@ icvTraceContour_32s( int *ptr, int step, int *stop_ptr, int is_hole )
863
867
for ( ;; )
864
868
{
865
869
s_end = s;
870
+ s = std::min (s, MAX_SIZE - 1 );
866
871
867
- for ( ;; )
872
+ while ( s < MAX_SIZE - 1 )
868
873
{
869
874
i4 = i3 + deltas[++s];
870
875
if ( (*i4 & value_mask) == ccomp_val )
@@ -890,7 +895,7 @@ icvFetchContourEx_32s( int* ptr,
890
895
int _method,
891
896
CvRect* _rect )
892
897
{
893
- int deltas[16 ];
898
+ int deltas[MAX_SIZE ];
894
899
CvSeqWriter writer;
895
900
int *i0 = ptr, *i1, *i3, *i4;
896
901
CvRect rect;
@@ -925,7 +930,7 @@ icvFetchContourEx_32s( int* ptr,
925
930
s = (s - 1 ) & 7 ;
926
931
i1 = i0 + deltas[s];
927
932
}
928
- while ( (*i1 & value_mask) != ccomp_val && s != s_end );
933
+ while ( (*i1 & value_mask) != ccomp_val && s != s_end && ( s < MAX_SIZE - 1 ) );
929
934
930
935
if ( s == s_end ) /* single pixel domain */
931
936
{
@@ -945,12 +950,11 @@ icvFetchContourEx_32s( int* ptr,
945
950
{
946
951
s_end = s;
947
952
948
- for ( ;; )
953
+ do
949
954
{
950
955
i4 = i3 + deltas[++s];
951
- if ( (*i4 & value_mask) == ccomp_val )
952
- break ;
953
956
}
957
+ while ( (*i4 & value_mask) != ccomp_val && ( s < MAX_SIZE - 1 ) );
954
958
s &= 7 ;
955
959
956
960
/* check "right" bound */
0 commit comments