<div dir="ltr">
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times"><span class="gmail-s1" style="font-kerning:none">Hello, </span></p>
<p class="gmail-p2" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;min-height:14px"><span class="gmail-s1" style="font-kerning:none"></span><br></p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times"><span class="gmail-s1" style="font-kerning:none">There's a long standing bug when using Files.newInputStream() with unix non-regular files. (/dev/stdin , /dev/random/ etc). It was reported in <a href="https://bugs.openjdk.org/browse/JDK-8233451"><span class="gmail-s2" style="font-kerning:none;color:rgb(6,72,255)">JDK-8233451</span></a> but it doesn't seem like there's been much movement on it. It's causing repeated problems in our code base because it means reading from a piped input has to be treated differently than reading from any other input. We've made an effort to move away from using File inputs and using Paths everywhere, but this causes issues with that.</span></p>
<p class="gmail-p2" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;min-height:14px"><span class="gmail-s1" style="font-kerning:none"></span><br></p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times"><span class="gmail-s1" style="font-kerning:none">It's very easy to trigger:</span></p>
<p class="gmail-p3" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><font face="monospace"><span class="gmail-s1" style="font-kerning:none">InputStream inputStream </span><span class="gmail-s3" style="font-kerning:none">= </span><span class="gmail-s1" style="font-kerning:none">Files</span><span class="gmail-s3" style="font-kerning:none">.<i>newInputStream</i>(</span><span class="gmail-s1" style="font-kerning:none">Paths</span><span class="gmail-s3" style="font-kerning:none">.<i>get</i>(</span><span class="gmail-s4" style="font-kerning:none;color:rgb(17,109,18)">"/dev/stdin/"</span><span class="gmail-s3" style="font-kerning:none">));</span></font></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><font face="monospace"><span class="gmail-s6" style="font-kerning:none">inputStream</span><span class="gmail-s1" style="font-kerning:none">.available();<span class="gmail-Apple-converted-space" style=""> </span>// throws the following</span></font></p>
<p class="gmail-p5" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9);min-height:14px"><span class="gmail-s1" style="font-kerning:none"></span><br></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="monospace">java.io.IOException: Illegal seek</font></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="monospace"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.FileDispatcherImpl.seek0(Native Method)</font></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="monospace"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.FileDispatcherImpl.seek(FileDispatcherImpl.java:78)</font></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="monospace"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.FileChannelImpl.position(FileChannelImpl.java:344)</font></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="monospace"><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>at java.base/sun.nio.ch.ChannelInputStream.available(ChannelInputStream.java:114)</font></span></p>
<p class="gmail-p5" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9);min-height:14px"><span class="gmail-s1" style="font-kerning:none"></span><br></p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times"><span class="gmail-s1" style="font-kerning:none">The relevant line is here in FileChannelImpl.position();</span></p><p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times"><span class="gmail-s1" style="font-kerning:none"><br></span></p>
<p class="gmail-p6" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(121,121,121)"><span class="gmail-s1" style="font-kerning:none"><i style=""><font face="monospace"> // in append-mode then position is advanced to end before writing</font></i></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><font face="monospace"><span class="gmail-s6" style="font-kerning:none"> p </span><span class="gmail-s1" style="font-kerning:none">= (</span><span class="gmail-s6" style="font-kerning:none">append</span><span class="gmail-s1" style="font-kerning:none">) ? </span><span class="gmail-s5" style="font-kerning:none;color:rgb(114,0,130)">nd</span><span class="gmail-s1" style="font-kerning:none">.size(</span><span class="gmail-s5" style="font-kerning:none;color:rgb(114,0,130)">fd</span><span class="gmail-s1" style="font-kerning:none">) : </span><span class="gmail-s5" style="font-kerning:none;color:rgb(114,0,130)">nd</span><span class="gmail-s1" style="font-kerning:none">.seek(</span><span class="gmail-s5" style="font-kerning:none;color:rgb(114,0,130)">fd</span><span class="gmail-s1" style="font-kerning:none">, -</span><span class="gmail-s7" style="font-kerning:none;color:rgb(18,51,230)">1</span><span class="gmail-s1" style="font-kerning:none">);</span></font></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><font face="monospace"><span class="gmail-s1" style="font-kerning:none"><br></span></font></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none">Since the channel is an input it always has append == false which means it always results in a call to<span class="gmail-Apple-converted-space"> </span>nd.seek(fd, -1)</span></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><br></span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none">This throws the Illegal Seek exception.<span class="gmail-Apple-converted-space"> </span>However, I believe this is not ideal behavior, because a call to seek with a value of -1 should be interpreted as a request for the current file position rather than a request to seek.</span></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none"><font face="Times">From </font><font face="monospace">seeks</font><font face="Times"> documentation: "</font></span><span class="gmail-s1" style="font-family:Times;font-kerning:none">Sets or reports this file's position <b>If offset is -1, the current position is returned </b>otherwise the position is set to offset."</span></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><br></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)">It seems like returning either 0, -1, or a count of the number of bytes read from the channel so far would all be better behavior than throwing in this case.</p><p class="gmail-p5" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9);min-height:14px">It should be noted that calling position() on this channel is immediately fatal which is also extremely unexpected. </p><p class="gmail-p5" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9);min-height:14px"><br></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none">If changing that behavior isn't possible, it might make sense to have the default file system provider for Files.newInputStream return a different implementation when reading from a unix irregular file. The mismatch happens because it treating all files as seekable when they are strictly not. </span></p>
<p class="gmail-p5" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9);min-height:14px"><span class="gmail-s1" style="font-kerning:none"></span><br></p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none">Is there any way to get this on the radar?<span class="gmail-Apple-converted-space"> </span>It's been a continuous source of confusing errors in our codebase for years. </span></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><br></p><p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)">Thank you,</p>
<p class="gmail-p4" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:12px;line-height:normal;font-family:Times;color:rgb(9,9,9)"><span class="gmail-s1" style="font-kerning:none">Louis Bergelson</span></p><div><div><pre><div><pre><font face="Arial, Helvetica, sans-serif"><span style="white-space:normal"> </span></font></pre></div></pre></div></div></div>