2014-09-26 33 views
3

在對內核泄漏進行靜態分析時,我遇到了一個有趣的場景,我無法找到變量的de分配。 分配在以下功能發生(使用kmalloc的調用),如下:linux內核中潛在的內存泄漏?

static int mounts_open_common(struct inode *inode, struct file *file, 
       int (*show)(struct seq_file *, struct vfsmount *)){ 
    struct proc_mounts *p; 

    //some code// 
    *p = kmalloc(sizeof(struct proc_mounts), GFP_KERNEL);** 
    file->private_data = &p->m;//the allocated variable is escaped to file structure 
    //some code 

} 

我希望這個分配的內存固定在:

static int mounts_release(struct inode *inode, struct file *file) 
{ 
    struct proc_mounts *p = proc_mounts(file->private_data); 
    path_put(&p->root); 
    put_mnt_ns(p->ns); 
    return seq_release(inode, file); 
} 

但似乎這個功能訪問分配變量來釋放一些內部成員,但不是變量'p'本身。 那麼這個變量的內存在哪裏被釋放?如果它應該在mounts_release函數中釋放,那麼它可能會發生內存泄漏。

+0

什麼是seq_release(inode,file);電話呢? – 2014-09-26 19:01:25

+0

據我所知,mounts_release()函數應該釋放與掛載設備相關的內存! – dsingh 2014-09-26 19:04:41

回答

6

如果你看看seq_release:

int seq_release(struct inode *inode, struct file *file) 
{ 
     struct seq_file *m = file->private_data; 
     kvfree(m->buf); 
     kfree(m); 
     return 0; 
} 

它用途不同呢kfree(file->private_data)

現在,file->private_data成立於mounts_open_common作爲

file->private_data = &p->m; 

這就是p這是kmalloc'd在你的問題。 m成員不是一個指針,所以不應該被允許被釋放。然而,它的struct proc_mounts

struct proc_mounts { 
     struct seq_file m; 
     struct mnt_namespace *ns; 
     struct path root; 
     int (*show)(struct seq_file *, struct vfsmount *); 
     void *cached_mount; 
     u64 cached_event; 
     loff_t cached_index; 
}; 

所以seq_release()執行kfree()在m成員的地址的1件,這是因爲與p = kmalloc(sizeof(struct proc_mounts), GFP_KERNEL);

得到我想這是不是很友好的同一地址一個靜態分析器。但沒有內存泄漏。

+0

在seq_release()函數中明確指出m是seq_file類型的指針,所以kfree(m)將釋放由該指針分配的內存(我認爲它將在seq_open()函數中分配,正如我們原來的mounts_open_common ()函數)而不是變量p指向的父結構proc_point。 – dsingh 2014-10-02 02:01:21

+0

另外,linux使用container_of宏從其子成員中提取父指針。你可以在generic_create_cred()/ generic_free_cred函數中檢查............. – dsingh 2014-10-02 02:03:06

+0

不能使用類型與第一個結構體成員類型相同的變量,它指向第一個成員的地址的結構來釋放整個父結構。 – dsingh 2014-10-02 02:05:42