mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
File#path: Raise IOError when a file is O_TMPFILE
File#path for a file opened with O_TMPFILE has no meaning. A filepath returned by this method isn't guarranteed about its accuracy, but files opened with O_TMPFILE are known its recorded path has no meaning. So let them not to return any pathname. After a discussion in ruby-core, just returning Qnil makes guessing the root cause difficult. Instead, this patch makes the method to raise an error. Other consideration is calling fnctl(2) on rb_file_path, but it adds a overhead, and it's difficult to determine O_TMPFILE status after fd has been closed. [Feature #13568] * io.c(rb_file_open_generic): Set Qnil to fptr->pathv when opening a file using O_TMPFILE * file.c(rb_file_path): Raise IOError when fptr->pathv is Qnil * file.c(rb_file_path): [DOC] Update for the new behavior git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59704 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
5f3c228f39
commit
75cda5e22f
3 changed files with 31 additions and 4 deletions
11
file.c
11
file.c
|
@ -379,7 +379,10 @@ apply2files(void (*func)(const char *, VALUE, void *), int argc, VALUE *argv, vo
|
||||||
* not normalize the name.
|
* not normalize the name.
|
||||||
*
|
*
|
||||||
* The pathname may not point the file corresponding to <i>file</i>.
|
* The pathname may not point the file corresponding to <i>file</i>.
|
||||||
* e.g. file has been moved, deleted, or created with <code>File::TMPFILE</code> option.
|
* For instance, pathname becomes inaccurate when file has been moved or deleted.
|
||||||
|
*
|
||||||
|
* This method raises <code>IOError</code> for a <i>file</i> created using
|
||||||
|
* <code>File::Constants::TMPFILE</code> because they don't have a pathname.
|
||||||
*
|
*
|
||||||
* File.new("testfile").path #=> "testfile"
|
* File.new("testfile").path #=> "testfile"
|
||||||
* File.new("/tmp/../tmp/xxx", "w").path #=> "/tmp/../tmp/xxx"
|
* File.new("/tmp/../tmp/xxx", "w").path #=> "/tmp/../tmp/xxx"
|
||||||
|
@ -393,7 +396,11 @@ rb_file_path(VALUE obj)
|
||||||
|
|
||||||
fptr = RFILE(rb_io_taint_check(obj))->fptr;
|
fptr = RFILE(rb_io_taint_check(obj))->fptr;
|
||||||
rb_io_check_initialized(fptr);
|
rb_io_check_initialized(fptr);
|
||||||
if (NIL_P(fptr->pathv)) return Qnil;
|
|
||||||
|
if (NIL_P(fptr->pathv)) {
|
||||||
|
rb_raise(rb_eIOError, "File is unnamed (TMPFILE?)");
|
||||||
|
}
|
||||||
|
|
||||||
return rb_obj_taint(rb_str_dup(fptr->pathv));
|
return rb_obj_taint(rb_str_dup(fptr->pathv));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
io.c
12
io.c
|
@ -5833,6 +5833,7 @@ static VALUE
|
||||||
rb_file_open_generic(VALUE io, VALUE filename, int oflags, int fmode,
|
rb_file_open_generic(VALUE io, VALUE filename, int oflags, int fmode,
|
||||||
const convconfig_t *convconfig, mode_t perm)
|
const convconfig_t *convconfig, mode_t perm)
|
||||||
{
|
{
|
||||||
|
VALUE pathv;
|
||||||
rb_io_t *fptr;
|
rb_io_t *fptr;
|
||||||
convconfig_t cc;
|
convconfig_t cc;
|
||||||
if (!convconfig) {
|
if (!convconfig) {
|
||||||
|
@ -5848,8 +5849,15 @@ rb_file_open_generic(VALUE io, VALUE filename, int oflags, int fmode,
|
||||||
MakeOpenFile(io, fptr);
|
MakeOpenFile(io, fptr);
|
||||||
fptr->mode = fmode;
|
fptr->mode = fmode;
|
||||||
fptr->encs = *convconfig;
|
fptr->encs = *convconfig;
|
||||||
fptr->pathv = rb_str_new_frozen(filename);
|
pathv = rb_str_new_frozen(filename);
|
||||||
fptr->fd = rb_sysopen(fptr->pathv, oflags, perm);
|
#ifdef O_TMPFILE
|
||||||
|
if (!(oflags & O_TMPFILE)) {
|
||||||
|
fptr->pathv = pathv;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
fptr->pathv = pathv;
|
||||||
|
#endif
|
||||||
|
fptr->fd = rb_sysopen(pathv, oflags, perm);
|
||||||
io_check_tty(fptr);
|
io_check_tty(fptr);
|
||||||
if (fmode & FMODE_SETENC_BY_BOM) io_set_encoding_by_bom(io);
|
if (fmode & FMODE_SETENC_BY_BOM) io_set_encoding_by_bom(io);
|
||||||
|
|
||||||
|
|
|
@ -468,4 +468,16 @@ class TestFile < Test::Unit::TestCase
|
||||||
assert_file.not_exist?(path)
|
assert_file.not_exist?(path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_open_tempfile_path
|
||||||
|
Dir.mktmpdir(__method__.to_s) do |tmpdir|
|
||||||
|
File.open(tmpdir, File::RDWR | File::TMPFILE) do |io|
|
||||||
|
io.write "foo"
|
||||||
|
io.flush
|
||||||
|
assert_equal 3, io.size
|
||||||
|
assert_raise(IOError) { io.path }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end if File::Constants.const_defined?(:TMPFILE)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue