Project

General

Profile

Actions

Bug #5530

closed

SEEK_SET malfunctions when used with 'append' File.open mode

Added by jduck (Joshua J. Drake) over 9 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
all
Backport:
[ruby-core:40573]

Description

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.

#!/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 ""

Output:

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 `'
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$

The other modes behave as expected.

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


Files

file-const.patch (1.43 KB) file-const.patch kosaki (Motohiro KOSAKI), 11/19/2012 04:59 PM
file_constants_null.patch (704 Bytes) file_constants_null.patch zzak (Zachary Scott), 11/20/2012 02:45 PM
Actions

Also available in: Atom PDF