📄
字号:
iput(inode);<br> error = -EEXIST;<br> }<br> }<br> else if (IS_RDONLY(dir))<br> error = -EROFS;<br> else if (!dir->i_op || !dir->i_op->create)<br> error = -EACCES;<br> else if ((error = permission(dir,MAY_WRITE | MAY_EXEC)) != 0)<br> <font FACE="宋体" size="4"> </font>; /* error is already set! */<br> else {<br> dir->i_count++; /* create eats the dir */<br> if (dir->i_sb && dir->i_sb->dq_op)<br> dir->i_sb->dq_op->initialize(dir, -1);<br> error = dir->i_op->create(dir, basename, namelen, mode, res_inode);<br> up(&dir->i_sem);<br> iput(dir);<br> return error; <br> }<br> up(&dir->i_sem);<br> } <br> else <br> error = lookup(dir, basename, namelen, &inode);<br> if (error) {<br> iput(dir);<br> return error;<br> }<br> error = follow_link(dir,inode,flag,mode,&inode);<br> if (error)<br> return error;<br> if (S_ISDIR(inode->i_mode) && (flag & 2)) {<br> iput(inode);<br> return -EISDIR;<br> }<br> if ((error = permission(inode,ACC_MODE(flag))) != 0) {<br> iput(inode);<br> return error;<br> }<br> if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {<br> /*<br> *Allow opens of Unix domain sockets and FIFOs for write on<br> * read-only filesystems. Their data does not live on the disk.<br> *<br> * If there was something like IS_NODEV(inode) for<br> * pipes and/or sockets I'd check it here.<br> */<br> flag &= ~O_TRUNC;<br> }<br> else if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {<br> if (IS_NODEV(inode)) {<br> iput(inode);<br> return -EACCES;<br> } <br> flag &= ~O_TRUNC;<br> }<br> else {<br> if (IS_RDONLY(inode) && (flag & 2)) {<br> iput(inode);<br> return -EROFS;<br> }<br> }</em></p> <p><em>/*<br> * An append-only file must be opened in append mode for writing<br> * Additionally, we must disallow O_TRUNC -- cevans<br> */<br> if (IS_APPEND(inode) && (((flag & FMODE_WRITE) && !(flag & O_APPEND)) || (flag & O_TRUNC))) {<br> iput(inode);<br> return -EPERM;<br> }if (flag & O_TRUNC) {<br> if ((error = get_write_access(inode))) {<br> iput(inode);<br> return error;<br> }<br> /*<br> * Refuse to truncate files with mandatory locks held on them<br> */<br> error = locks_verify_locked(inode);<br> if (error) {<br> iput(inode);<br> return error;<br> }<br> if (inode->i_sb && inode->i_sb->dq_op)<br> inode->i_sb->dq_op->initialize(inode, -1);<br> error = do_truncate(inode, 0);<br> put_write_access(inode);<br> if (error) {<br> iput(inode);<br> return error;<br> }<br> } else<br> if (flag & FMODE_WRITE)<br> if (inode->i_sb && inode->i_sb->dq_op)<br> inode->i_sb->dq_op->initialize(inode, -1);<br> *res_inode = inode;<br> return 0;</em><br> }</p> </blockquote> </font> </blockquote> <font FACE="宋体" SIZE="3" COLOR="#7f0000"><p><img src="dot2.jpg" alt="dot2.bmp (278 bytes)" WIDTH="10" HEIGHT="11"> </font><font FACE="宋体" color="#0080C0" size="4"><em><strong>函数prepare_binprm():</strong></em></font><font FACE="宋体" SIZE="3" COLOR="#7f0000"></p> <p>/* this function is in file linux/fs/exec.c */</font><br> <font FACE="宋体" SIZE="2">/* <br> * 从 inode 中得到信息填充到 binprm 结构中。<br> * 检查文件是否可执行,然后读出开头的 512 bytes<br> */<br> int prepare_binprm(struct linux_binprm *bprm)<br> {<br> int mode;<br> int retval,id_change;<br> mode = bprm->inode->i_mode;<br> if (!S_ISREG(mode)) /* must be regular file */<br> return -EACCES;<br> if (!(mode & 0111)) /* with at least _one_ execute bit set */<br> return -EACCES;<br> if (IS_NOEXEC(bprm->inode)) /* FS mustn't be mounted noexec */<br> return -EACCES;<br> if (!bprm->inode->i_sb)<br> return -EACCES;<br> if ((retval = permission(bprm->inode, MAY_EXEC)) != 0)<br> return retval;<br> /* better not execute files which are being written to */<br> if (bprm->inode->i_writecount > 0)<br> return -ETXTBSY;<br> bprm->e_uid = current->euid;<br> bprm->e_gid = current->egid;<br> id_change = 0;<br> /* Set-uid? */<br> if (mode & S_ISUID) {<br> bprm->e_uid = bprm->inode->i_uid;<br> if (bprm->e_uid != current->euid)<br> id_change = 1;<br> }<br> /* Set-gid? */<br> /*<br> * If setgid is set but no group execute bit then this<br> * is a candidate for mandatory locking, not a setgid<br> * executable.<br> */<br> if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {<br> bprm->e_gid = bprm->inode->i_gid;<br> if (!in_group_p(bprm->e_gid))<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -