创建文件时文件名中出现特殊字符(/\等)的处理
因为想了解一下文件系统和试试内核的文件名加密,看了一下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;
} 是不是内核根本就不处理,而文件名中不能出现某些字符的限制是应用所加的呢?
呵呵
这种可能性好像不存在,一定是我还没有弄清楚sys_open对这些字符的处理在哪里
如果我们在sys_open里允许出现某个目前还不运行出现的字符,而不影响内核,比如\
而在sys_readdir返回的时候,去掉\后面的字符不返回给用户,这样如果不是你创建的文件,你就不知道文件名是什么了。呵呵.好像是有一点作用。
这样对内核的修改很少了
只有sys_open里去掉对\的限制
和在sys_readdir返回前去掉\后面的字符串就可以了
改动不会超过50行,就可以实现内核的文件名加密了 丢人哪
linux的文件名中的字符没有任何限制,从0x01到0xff都是合法的。
我对linux是如此的不熟悉,以至犯了如此弱智的问题。
受Windows影响太大了
呵呵
页:
[1]