dongni386 发表于 2005-6-11 11:18:27

创建文件时文件名中出现特殊字符(/\等)的处理

因为想了解一下文件系统和试试内核的文件名加密,看了一下create,open,readdir。有些问题不明白
创建文件时文件名中出现特殊字符好像没有处理
sys_create调用过程好像是这样:
sys_create->
sys_open->
filp_open->
open_namei->
lookup_hash->
d_alloc

/**
* d_alloc        -        allocate a dcache entry
* @parent: parent of entry to allocate
* @name: qstr of the name
*
* Allocates a dentry. It returns %NULL if there is insufficient memory
* available. On a success the dentry is returned. The name passed in is
* copied and the copy passed in may be reused after this call.
*/

struct dentry * d_alloc(struct dentry * parent, const struct qstr *name)
{
        char * str;
        struct dentry *dentry;

        dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL);
        if (!dentry)
                return NULL;

        if (name->len > DNAME_INLINE_LEN-1) {
                str = kmalloc(NAME_ALLOC_LEN(name->len), GFP_KERNEL);
                if (!str) {
                        kmem_cache_free(dentry_cache, dentry);
                        return NULL;
                }
        } else
                str = dentry->d_iname;

        memcpy(str, name->name, name->len);
        str = 0;

        atomic_set(&dentry->d_count, 1);
        dentry->d_flags = 0;
        dentry->d_inode = NULL;
        dentry->d_parent = NULL;
        dentry->d_sb = NULL;
        dentry->d_name.name = str;
        dentry->d_name.len = name->len;
        dentry->d_name.hash = name->hash;
        dentry->d_op = NULL;
        dentry->d_fsdata = NULL;
        INIT_LIST_HEAD(&dentry->d_vfsmnt);
        INIT_LIST_HEAD(&dentry->d_hash);
        INIT_LIST_HEAD(&dentry->d_lru);
        INIT_LIST_HEAD(&dentry->d_subdirs);
        INIT_LIST_HEAD(&dentry->d_alias);
        if (parent) {
                dentry->d_parent = dget(parent);
                dentry->d_sb = parent->d_sb;
                spin_lock(&dcache_lock);
                list_add(&dentry->d_child, &parent->d_subdirs);
                spin_unlock(&dcache_lock);
        } else
                INIT_LIST_HEAD(&dentry->d_child);

        dentry_stat.nr_dentry++;
        return dentry;
}

dongni386 发表于 2005-6-11 11:34:30

是不是内核根本就不处理,而文件名中不能出现某些字符的限制是应用所加的呢?
呵呵
这种可能性好像不存在,一定是我还没有弄清楚sys_open对这些字符的处理在哪里

如果我们在sys_open里允许出现某个目前还不运行出现的字符,而不影响内核,比如\
而在sys_readdir返回的时候,去掉\后面的字符不返回给用户,这样如果不是你创建的文件,你就不知道文件名是什么了。呵呵.好像是有一点作用。
这样对内核的修改很少了
只有sys_open里去掉对\的限制
和在sys_readdir返回前去掉\后面的字符串就可以了
改动不会超过50行,就可以实现内核的文件名加密了

dongni386 发表于 2005-6-11 17:55:56

丢人哪
linux的文件名中的字符没有任何限制,从0x01到0xff都是合法的。
我对linux是如此的不熟悉,以至犯了如此弱智的问题。
受Windows影响太大了
呵呵
页: [1]
查看完整版本: 创建文件时文件名中出现特殊字符(/\等)的处理