Issue #5530 has been updated by kosaki (Motohiro KOSAKI).

Assignee changed from kosaki (Motohiro KOSAKI) to drbrain (Eric Hodel)

Hi Eric,

Currently, rdoc seems failed to understand rb_define_file_const() in io.c and doesn't make correct File::Constant documentation.
Is there any workaround for it?

I don't understand
1) why rb_file_const() is necessary
2) why several constants of File::Constants are defined in io.c, but not file.c
3) why rdoc has a special knowledge for rb_curses_define_const and doesn't have for rb_define_file_const()

----------------------------------------
Bug #5530: SEEK_SET malfunctions when used with 'append' File.open mode
https://bugs.ruby-lang.org/issues/5530#change-32372

Author: jduck (Joshua J. Drake)
Status: Assigned
Priority: Normal
Assignee: drbrain (Eric Hodel)
Category: 
Target version: 2.0.0
ruby -v: all


The following code demonstrates the issue. As documented, IO#seek says "SEEK_SET" will move to a position relative to the start of the file. Using 'ab', it doesn't actually seek where it should. It's possible the documentation is just wrong here, either the code or documentation should change though.

<code lang=ruby>
#!/usr/bin/env ruby

modes = [ 'ab', 'wb', 'w+b', 'r+b' ]

filename = '/tmp/test.txt'
desired = "AABBBBAA"

modes.each { |mode|
        File.unlink(filename) rescue nil
        File.open(filename, "wb") { |fd|
                fd.write('AAAAAAAA')
        }

        File.open(filename, mode) { |fd|
                fd.seek(2, IO::SEEK_SET)
                fd.write("BBBB")
                fd.close
        }

        data = ''
        File.open(filename, "rb") { |fd|
                data = fd.read(fd.stat.size)
        }

        puts "%3s #{data.inspect}" % mode
}

File.unlink(filename)
puts ""
</code>

Output:
<pre>

fear:0:ruby$ rvm all ruby -v file_mode_test.rb
ruby 1.8.6 (2010-09-02 patchlevel 420) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"

ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"

ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"

ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"

ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\000\000BBBB"
w+b "\000\000BBBB"
r+b "AABBBBAA"

ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"

ruby 1.9.1p431 (2011-02-18 revision 30908) [x86_64-linux]
Error loading gem paths on load path in gem_prelude
can't modify frozen string
<internal:gem_prelude>:69:in `force_encoding'
<internal:gem_prelude>:69:in `set_home'
<internal:gem_prelude>:38:in `dir'
<internal:gem_prelude>:76:in `set_paths'
<internal:gem_prelude>:47:in `path'
<internal:gem_prelude>:286:in `push_all_highest_version_gems_on_load_path'
<internal:gem_prelude>:355:in `<compiled>'
 ab "AAAAAAAABBBB"
 wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"

ruby 1.9.3dev (2011-07-31 revision 32789) [x86_64-linux]
 ab "AAAAAAAABBBB"
 wb "\x00\x00BBBB"
w+b "\x00\x00BBBB"
r+b "AABBBBAA"

fear:0:ruby$
</pre>

The other modes behave as expected.

See also - http://dev.metasploit.com/redmine/issues/3199


-- 
http://bugs.ruby-lang.org/