2016-01-26 46 views
1

在FreeBSD,chmod +t file是特權操作,如果file不是一個目錄:在FreeBSD上,爲什麼chmod + t在非目錄上是特權操作?

$ echo >test 
$ chmod +t test 
chmod: test: Inappropriate file type or format 
$ su 
Password: 
# chmod +t test 
# ls -l test 
-rw-r--r-T 1 fuz wheel 1 Jan 26 12:44 test 

CHMOD(2)文件此行爲:

[EFTYPE]   The effective user ID is not the super-user, the mode 
        includes the sticky bit (S_ISVTX), and path does not 
        refer to a directory. 

同時,(7)解釋瞭如果file不是目錄,那麼S_ISVTX將被忽略:

A special file mode, called the sticky bit (mode S_ISTXT), is used to 
indicate special treatment for directories. It is ignored for regular 
files. See chmod(2) or the file <sys/stat.h> for an explanation of file 
modes. 

爲什麼在FreeBSD上將一個非目錄標記爲粘滯是一項特權操作,其歷史或技術原因是什麼?爲什麼在這個地方發明了一個額外的錯誤代碼EFTYPE它應該是EPERMENOTDIR

+1

從歷史上看,最初的Unix不允許這樣做。 [V7 chmod](http://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/man/man2/chmod.2)手冊頁說:「設置此位的能力限於超級用戶 由於交換空間被圖像消耗 「。我不能說爲什麼後代選擇保留這種禁止,即使他們不支持這些功能。 OpenBSD也禁止非root用戶在文件上設置粘滯位,返回EFTYPE。 Solaris默默地忽略非root用戶嘗試設置文件上的粘滯位(chmod()返回0,但不起作用)。 –

+0

@MarkPlotnick你可以把它變成答案嗎?這回答了我的問題。 – fuz

回答

3

歷史上,原來的Unix不允許這樣做。該V7 chmod man page

能夠設置該位被限制爲超級用戶,因爲交換空間圖形消耗

如果用戶試圖設置的V7 chmod system call沒有返回一個錯誤粘滯位,雖然,它只是默默地關掉了位:

if (u.u_uid) 
    uap->fmode &= ~ISVTX; 

這種行爲延續不變的BSD系統。 4.3BSD有這個代碼,它默默地關閉ISVTX位非目錄的非root用戶:

if (u.u_uid) { 
    if ((ip->i_mode & IFMT) != IFDIR) 
     mode &= ~ISVTX; 
    ... 
} 

中的代碼4.4BSD改爲返回錯誤EFTYPE,雖然4.4BSD chmod man page沒有提到它。我不知道它爲什麼會改變。

if (cred->cr_uid) { 
    if (vp->v_type != VDIR && (mode & ISVTX)) 
     return (EFTYPE); 
    ... 
} 

FreeBSD 1.0包含相同的代碼,4.4BSD。

if (cred->cr_uid) { 
    if (vp->v_type != VDIR && (mode & ISVTX)) 
     return (EFTYPE); 
    ... 
} 

這已經延續到當前版本。 FreeBSD 10.2具有這樣的:

if (vp->v_type != VDIR && (mode & S_ISTXT)) { 
    if (priv_check_cred(cred, PRIV_VFS_STICKYFILE, 0)) 
     return (EFTYPE); 
} 

OpenBSD具有類似於代碼:

if (cred->cr_uid) { 
    if (vp->v_type != VDIR && (mode & S_ISTXT)) 
     return (EFTYPE); 
    ... 
} 

的Solaris 10默默地忽略由非超級用戶嘗試設置粘着位上的文件。 (我將在可用時添加源代碼片段。)

0

什麼是歷史或技術原因,爲什麼在FreeBSD上標記非目錄爲粘性是一項特權操作?

爲什麼它不是?首先,這顯然不是一種有意義的操作,因此應該向用戶報告爲失敗,以表明他做錯了什麼。此外,允許它未來的任何未使用的標誌或領域的證明 - 它可能用於未來的某些事情,而不是提出安全性或一致性風險,它應該處於可預測的狀態。

爲什麼在這個應該是EPERM或ENOTDIR的地方發明了額外的錯誤代碼EFTYPE?

參見errno(2)。 EFTYPE不是專門爲這種情況發明的,具有更廣泛的含義,並且比EPERM更適合這種情況,而ENOTDIR具有完全不相關的目的。

+0

我測試的所有其他系統都允許任意用戶將文件設置爲粘滯。這與二進制文件的粘性位的歷史意義(在交換空間中保留二進制文件)是一致的。 FreeBSD是唯一的異常。您的帖子沒有給出合理的解釋,也沒有提供其聲明的來源。 Downvote。 – fuz

+0

哦,是的,'chmod'(及其變體)是唯一一個將'errno'設置爲'EFTYPE'的系統調用。 – fuz

+0

系統調用不是唯一使用標準錯誤代碼的地方。 – Elisey

相關問題