This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #78716] Bogus read after seek beyond end of string
authorFather Chrysostomos <sprout@cpan.org>
Sat, 27 Nov 2010 13:40:53 +0000 (05:40 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 27 Nov 2010 15:41:47 +0000 (07:41 -0800)
This is a signedness problem that ffe0bb5ab did not take into account.
(STRLEN)-10 > 0 returns true for me.

ext/PerlIO-scalar/scalar.xs
ext/PerlIO-scalar/t/scalar.t

index b93b9e9..6fe551d 100644 (file)
@@ -150,7 +150,8 @@ PerlIOScalar_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
        PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
        SV *sv = s->var;
        char *p;
-       STRLEN len, got;
+       STRLEN len;
+       I32 got;
        p = SvPV(sv, len);
        got = len - (STRLEN)(s->posn);
        if (got <= 0)
index adc5b8e..1aee4b0 100644 (file)
@@ -16,7 +16,7 @@ use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); # Not 0, 1, 2 everywhere.
 
 $| = 1;
 
-use Test::More tests => 69;
+use Test::More tests => 70;
 
 my $fh;
 my $var = "aaa\n";
@@ -276,4 +276,11 @@ EOF
     is($s, ':F:S(GHI):O:F:R:F:R:F:R', 'tied actions - read');
 }
 
-
+# [perl #78716] Seeking beyond the end of the string, then reading
+{
+    my $str = '1234567890';
+    open my $strIn, '<', \$str;
+    seek $strIn, 15, 1;
+    is read($strIn, my $buffer, 5), 0,
+     'seek beyond end end of string followed by read';
+}