Tcl Source Code

View Ticket
Login
Ticket UUID: cdd157d4849df09ab1d594938aa0d2f4694d643
Title: file copy -force does an invalid call to open
Type: Bug Version: 8.6
Submitter: Tomo Created on: 2016-07-18 14:52:40
Subsystem: 37. File System Assigned To: nobody
Priority: 5 Medium Severity: Minor
Status: Open Last Modified: 2016-07-24 12:52:53
Resolution: None Closed By: nobody
    Closed on:
Description:
The following TCL command:

file copy -force in.txt out.txt

will produce this call to "open" syscall:

open("out.txt", O_WRONLY|O_CREAT|O_TRUNC, 0100664) = 6

We can see that beside the mode ("664") there is the S_IFREG flag (0100000, regular flag) which is set. According to open man page, there shouldn't be any other bit in "mode" than the permission bits (see http://man7.org/linux/man-pages/man2/open.2.html "According to POSIX, the effect when other bits are set in mode is unspecified...")

I found that some filesystem doesn't like this bit to be set.

I see that "file copy -force" do a stat on the file before doing the open and I suspect TCL to blindly reuse the flag gained by the stat command but it should only use the lower bits.
User Comments: dkf added on 2016-07-24 12:52:53:

We certainly shouldn't be setting the file type descriptor bits. There's literally no reason at all for handing those over.


Tomo added on 2016-07-21 14:50:41:
I would say that we can keep all bits in the 07777 mask. Upper bits are informative bits for stat command.

It shouldn't break anything.

What do you think ?

aspect added on 2016-07-19 03:58:01:
> I suspect TCL to blindly reuse the flag gained by the stat command but it should only use the lower bits.

This appears to be the case:

  http://core.tcl.tk/tcl/artifact/1b60acbf412a1ef8?ln=574

This looks like the right place to mask the permissions parameter, but we should be careful.  To quote more fully from the Linux manual:

> According to POSIX, the effect when other bits (than 0777) are set in
> mode is unspecified.  On Linux, the following bits are also honored in
> mode:

(refers to mode & 07000 - setu/gid and sticky bits).

Should [file copy] on Linux also copy these bits?  What about other unixes?

This smells like one of those dusty under-specified corners of POSIX where
the right thing for all platforms is not always going to be obvious.