# \[Bug #2575\] a test fail for IO#readpartial is broken on \*BSD

**URL:** <https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249>\
**Category:** Development\
**Created:** [January 8, 2010, 4:40am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249 "2010-01-08T04:40:28Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 8, 2010, 4:40am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/1 "2010-01-08T04:40:28Z")

</div>

Bug #2575: a test fail for IO#readpartial is broken on \*BSD  
[http://redmine.ruby-lang.org/issues/show/2575](http://redmine.ruby-lang.org/issues/show/2575)

e$B5/I\<\<Te(B: Takahiro K.  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$B%+%F%4%je(B: core  
ruby -v: ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-netbsdelf]

IO#readpartiale$B$N%F%9%H$K\<:GT$7$^$9!#3NG’$Oe(BNetBSD 5.0\_STABLE,  
current (5.99.22)e$B$He(BFreeBSD  
7.2-STABLEe$B!"$$$:$l$be(Bi386e$B4D6-$G9T$$$^$7$?!#e(B

test/ruby/test\_io.rb e$B$Ne(B test\_readpartial\_pos() e$B$K!"e(B

```
  open("foo", "w") {|f| f << "abc" }
  open("foo") {|f|
    f.seek(0)
    assert_equal("ab", f.readpartial(2))
    assert_equal(2, f.pos)
  }

```

e$B$H$$$C$?%F%9%H$,$"$j$^$9!#$3$3$G!“e(Bf.pose$B$N7k2L$,%\<%m$H$J$C$F%F%9%H$K\<:GT$7$^$9!#D\>A0$Ne(Bf.seek(0)e$B$r:o=|$9$k$H%F%9%H$K@.8y$9$k$h$&$K$J$j$^$9$,!”$3$NM-L5$G7k2L$,JQ$o$C$F$O$J$j$^$;$s!#e(B

io.ce$B$Ne(Bio\_getpartial()e$B$G$O!"e(B

1. 

read\_buffered\_data()e$B$Ge(BFILEe$B9=B$BN$KFI$_9~$_:Q$_$N%G!\<%?$rFI$s$G$_$k!#e(B  
2. e$BFI$_9~$_:Q$\_$N%G!\<%?$,$J$1$l$P!"e(B  
2.1 read(2)e$B$G%G!\<%?$re(BFILEe$B9=B$BN$KFI$\_9~$`!#e(B  
2.2  
e$B8e$Ge(Bfflush(3)e$B$r8F$S=P$7$Fe(BFILEe$B9=B$BN$NFbMF$N@09g@-$,\<h$le(B(e$B$k$3$H$re(B  
e$B4|BT$7$F$$e(B)e$B$k!#e(B

e$B$H$$$C$?$3$H$r$7$F$$$^$9!#e(B2.1e$B$N=hM}$O!"e(B

merge revision(s) 21913:  
\* io.c (io\_getpartial): fflush after read for updating pos in  
FILE.  
not portable, I guess. [ruby-core:21561]

e$B$H%3%\_%C%H$5$l$F$$$^$9!#$3$3$G?dB,$5$l$F$$$k$h$&$K\<B:]$K0?“@-$O$”$j$^$;$s!#$=$b$=$b!“e(Bfflush(3)e$B$G9=B$BN$NFbMF$,E,@Z$K$J$5$l$k$H4|BT$9$k$3$H$KL5M}$,$”$k5$$b$7$^$9!#e(B

\*BSDe$B$Ne(BFILEe$B9=B$BNe(B(DragonFlye$B$OITL@e(B)e$B$K$O!"e(B

o e$B%U%!%$%kCf$N%\*%U%;%C%H$r\<($99=B$BN%a%s%Pe(B \_offset  
e$B$,$"$j$^$9!#e(B  
o  
e$B9=B$BN%a%s%Pe(B\_flagse$B$N%U%i%C%0CM$K$O!“e(B\_offsete$B$NCM$,\<B:]$KM-8z$+$I$&$+$re(B  
e$B\<($9e(B \_\_SOFF e$B$H$$$&CM$,$”$j$^$9!#e(B

e$B$=$7$F!"$3$NLdBj$O0J2\<$N$h$&$K@bL@$G$-$^$9!#e(B

(1)  
f.seek(0)e$B$r8F$S=P$9$He(Bfseeko(3)e$B$,8F$S=P$5$l$F!"e(B\_offsete$B$KCM$He(B\_\_SOFFe$B$,e(B  
e$B%U%i%C%0$,@\_Dj$5$l$^$9!#$3$N$H$-$Ne(B \_offset  
e$B$,8e$Ne(Bf.telle$B$NLa$jCM$H$J$Ce(B  
e$B$F$$$^$9!#e(B

(2)  
f.seek(0)e$B$r8F$S=P$5$J$$$H!"e(Bf.telle$B$N8F$S=P$5$l$?;~E@$Ge(B\_offsete$B$KCM$He(B  
\_\_SOFFe$B$,@\_Dj$5$l$k$?$a!"4|BT$7$?CM$,JV$k$3$H$K$J$j$^$9!#e(B

e$B2r7h:v$H$7$F$O!“e(Bfflush(3)e$B$N8F$S=P$7$KBe$($Fe(B\_\_SOFFe$B$r%”%s%;%C%H$7$F$+$ie(Bftello(3)e$B$r8F$S=P$9$H$$$C$?$3$H$,9M$($i$l$^$9!#\<h$j4:$($:$N%Q%C%A$G!"LdBj$,2r7h$9$k$3$H$r3NG’$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 8, 2010, 6:03am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/2 "2010-01-08T06:03:00Z")

</div>

In message [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
on Fri, 8 Jan 2010 12:40:04 +0900,  
Takahiro K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> e$B2r7h:v$H$7$F$O!“e(Bfflush(3)e$B$N8F$S=P$7$KBe$($Fe(B\_\_SOFFe$B$r%”%s%;%C%H$7$F$+$ie(B  
> ftello(3)e$B$r8F$S=P$9$H$$$C$?$3$H$,9M$($i$l$^$9!#\<h$j4:$($:$N%Q%C%A$G!"e(B  
> e$BLdBj$,2r7h$9$k$3$H$r3NG’$7$^$7$?!#e(B  
> e$B$3$NLdBj$O2r7h$7$^$9$,!"2r7h$7$F$$$k$N$O%\*%U%;%C%H$@$1$G!"e(B  
> read\_buffered\_data()e$BJU$j$K$Oe(Bfread(3)e$B8F$S=P$7$F$k%3!\<%I$be(B  
> e$BB8:\_$7$^$9!#e(B

e$BI{:nMQ$b$“$k$G$7$g$&$7!”:G=_E_$K$Oe(BRuby  
1.9e$B$Ge(Bstdioe$B\<N$F$k$He(B  
e$B$$$&OC$K7k$SIU$/$N$G$7$g$&!#e(B

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 11, 2010, 6:17pm UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/3 "2010-01-11T18:17:45Z")

</div>

2010e$BG/e(B1e$B7ne(B8e$BF|e(B14:02 Takahiro K.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$BI{:nMQ$b$“$k$G$7$g$&$7!”:G=_E_$K$Oe(BRuby 1.9e$B$Ge(Bstdioe$B\<N$F$k$He(B  
> e$B$$$&OC$K7k$SIU$/$N$G$7$g$&!#e(B

e$B$($'!"e(B1.9 e$B$G$O2r7h$7$F$$$F!"e(Bstdio  
e$B$r;H$&8B$j@5$7$$2r7h$OL5M}$J$N$G!"e(B  
1.8 e$B$G$O!"J]\<i2DG=$JHO0O$G:Y9)$9$k$H$$$&46$8$G$9$+$M!#e(B

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 12, 2010, 7:18am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/4 "2010-01-12T07:18:37Z")

</div>

e$B%A%1%C%He(B #2575 e$B$,99?7$5$l$^$7$?!#e(B (by Takahiro K.)

[ruby-dev:40051]  
e$B$KE:IU$N%Q%C%A$G8=\>]$,2r7h$9$k$3$H$r3NG’$7$^$7$?!#e(B  
e$B:,K\E\*$J860x$O!"e(BBug  
#1872e$B$G!"e(Btimere$B%9%l%C%I4X78$+2?$+$N4X78$G82:\_2=$7$?$H9M$($i$l$^$9!#e(B

* * *

[http://redmine.ruby-lang.org/issues/show/2575](http://redmine.ruby-lang.org/issues/show/2575)

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 12, 2010, 9:45am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/5 "2010-01-12T09:45:30Z")

</div>

In message [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
on Tue, 12 Jan 2010 15:18:06 +0900,  
Takahiro K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> [ruby-dev:40051] e$B$KE:IU$N%Q%C%A$G8=\>]$,2r7h$9$k$3$H$r3NG’$7$^$7$?!#e(B  
> e$B$H!"=q$-$^$7$?$,!"e(B

> e$B:,K\E\*$J860x$O!"e(BBug #1872e$B$G!“e(Btimere$B%9%l%C%I4X78$+2?$+$N4X78$G82:\_2=$7e(B  
> e$B$?$H9M$($i$l$^$9!#e(B  
> e$BC1=c$J%P%C%/%/%)!\<%H$de(Bsystem()e$B$N\<B9T$G$NLdBj$O2r\>C$7$^$7$?$,!”$d$O$j!"e(B

test\_local\_barrier(TC\_Thread):

e$B$G;I$5$k$H$-$,$"$k$h$&$G$9!#e(B

–  
e$B?@8Me(B e$BN4Gne(B(e$B$+$s$Ye(B e$B$?$+$R$me(B) at e$B;E;v\>le(B

P.S.  
e$B;I$5$C$?%W%m%;%9$re(B kill -KILL e$B$G=_N;$5$;$F!"e(Bmake test-all  
e$B$r=_$o$i$;$?e(B  
e$B$“$H$K!”?F$J$7$H$J$C$?e(Brubye$B$N%W%m%;%9$,e(B10e$B8D$/$i$$;D$j!“e(Bparkede$B$J\>uBVe(B  
(pthread\_joine$B$+2?$+e(B)e$B$H$J$C$F$^$9!#e(BNetBSD current  
(5.99.22)e$B\<+BN$b2x$7$$e(B  
e$B$H$3$m$O$”$k$N$G!"\<h$j4:$($:e(B 5.99.23  
e$B$K$7$F$+$i:F3NG’$9$kM=Dj$G$9!#e(B

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [January 14, 2010, 3:45am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/6 "2010-01-14T03:45:58Z")

</div>

e$B%A%1%C%He(B #2575 e$B$,99?7$5$l$^$7$?!#e(B (by Takahiro K.)

e$B?=$7Lu$"$j$^$;$s$,!"e(Bredminee$B$KEPO?$5$l$?!"e(B

[ruby-dev:40055]e$B$K$h$k%3%a%s%He(B#2  
[ruby-dev:40056]e$B$K$h$k%3%a%s%He(B#3)

e$B$K$D$$$F$O!"e(BIO#readpartiale$B$NLdBj$H$OL54X78$G$7$?!#e(B

* * *

[http://redmine.ruby-lang.org/issues/show/2575](http://redmine.ruby-lang.org/issues/show/2575)

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [February 5, 2010, 9:26am UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/7 "2010-02-05T09:26:26Z")

</div>

e$B%A%1%C%He(B #2575 e$B$,99?7$5$l$^$7$?!#e(B (by Takahiro K.)

e$B%U%!%$%ke(B io.c.diff e$BDI2Ce(B

Hi John.

Dose your patch solve the partial read problem on FreeBSD without  
io.c.diff,  
or your patch provide additional fix?

## Anyway, I rewrite slightly your patch and merged my updated fix to attached file.

[http://redmine.ruby-lang.org/issues/show/2575](http://redmine.ruby-lang.org/issues/show/2575)

---

<div class="post-metadata">

**Author:** ![Takahiro\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/76d3ee/32.png) [@Takahiro\_K](https://www.ruby-forum.com/u/Takahiro_K)\
**Post date:** [February 4, 2010, 10:42pm UTC](https://www.ruby-forum.com/t/bug-2575-a-test-fail-for-io-readpartial-is-broken-on-bsd/181249/8 "2010-02-04T22:42:01Z")

</div>

e$B%A%1%C%He(B #2575 e$B$,99?7$5$l$^$7$?!#e(B (by John Bader)

I have issues with that on FreeBSD. I ran unicorn and it delivered only  
partial responses. The maintainer fixed this with:

diff --git a/io.c b/io.c  
index 375cbc8…d4d28e5 100644  
— a/io.c  
+++ b/io.c  
@@ -122,6 +122,9 @@ extern void Init\_File \_((void));

# endif

#endif

+#define preserving\_errno(stmts) \

- do {int saved\_errno = errno; stmts; errno = saved\_errno;} while (0)
- 

VALUE rb\_cIO;  
VALUE rb\_eEOFError;  
VALUE rb\_eIOError;  
@@ -490,7 +493,7 @@ io\_fwrite(str, fptr)  
r = write(fileno(f), RSTRING(str)-\>ptr+offset, l);  
TRAP\_END;  
#if BSD\_STDIO

- fseeko(f, lseek(fileno(f), (off\_t)0, SEEK\_CUR), SEEK\_SET);

- preserving\_errno(fseeko(f, lseek(fileno(f), (off\_t)0, SEEK\_CUR),  
SEEK\_SET));  
#endif  
if (r == n) return len;  
if (0 \<= r) {

* * *

## This resolved the issue for me. I applied the patch to the FreeBSD ruby18 port and reinstalled.

[http://redmine.ruby-lang.org/issues/show/2575](http://redmine.ruby-lang.org/issues/show/2575)
