diff --git a/FileCheck.xs b/FileCheck.xs index df1918c..5577395 100644 --- a/FileCheck.xs +++ b/FileCheck.xs @@ -230,8 +230,8 @@ int _overload_ft_stat(pTHX_ Stat_t *stat, int *size) { croak( "Overload::FileCheck::_check need to return an array ref" ); av_size = AvFILL(stat_array); - if ( av_size > 0 && av_size != ( STAT_T_MAX - 1 ) ) - croak( "Overload::FileCheck::_check: Array should contain 13 elements" ); + if ( av_size >= 0 && av_size != ( STAT_T_MAX - 1 ) ) + croak( "Overload::FileCheck::_check: Array should contain 0 or 13 elements, got %d", av_size + 1 ); *size = av_size; /* store the av_size */ if ( av_size > 0 ) { diff --git a/lib/Overload/FileCheck.pm b/lib/Overload/FileCheck.pm index 34acb3c..4ca1f2b 100644 --- a/lib/Overload/FileCheck.pm +++ b/lib/Overload/FileCheck.pm @@ -348,7 +348,7 @@ sub _check_from_stat { }, # Existence and size (computed directly from cached stat) - e => sub { return CHECK_IS_NULL unless scalar @stat; _to_bool( $stat[ST_MODE] ) }, # file exists + e => sub { return CHECK_IS_NULL unless scalar @stat; CHECK_IS_TRUE }, # file exists (stat success implies existence) s => sub { $stat[ST_SIZE] }, # nonzero size (returns bytes); fallback breaks on symlinks # File type checks via mode bits (using @stat — follows symlinks) diff --git a/t/mock-all-from-stat_basic.t b/t/mock-all-from-stat_basic.t index 2d0c143..18577a7 100644 --- a/t/mock-all-from-stat_basic.t +++ b/t/mock-all-from-stat_basic.t @@ -134,8 +134,8 @@ __DATA__ -S 'my.socket' !-s 'my.socket' -# a zero stat -!-e 'zero' +# a zero stat (stat succeeded with all-zero fields — file exists but has no type) +-e 'zero' !-f 'zero' !-l 'zero' !-d 'zero'