History

[PATCH] sg.c: fix a memory leak in devices seq_file implementation

I know that scsi procfs is legacy code but this is a fix for a memory leak. While reading through sg.c I realized that the implementation of /proc/scsi/sg/devices with seq_file is leaking memory due to freeing the pointer returned by the next() iterator method. Since next() might return NULL or an error this is wrong. This patch fixes it through using the seq_files private field for holding the reference to the iterator object. Here is a small bash script to trigger the leak. Use slabtop to watch the size-32 usage grow and grow. #!/bin/sh while true; do cat /proc/scsi/sg/devices > /dev/null done

Jan Blunck committed 21 years ago

Commit 729d70f1 parent 8126fdb1 file · +6 −7Browse files

Unified · Split

drivers/scsi/sg.c+6−7
@@ -2971,23 +2971,22 @@ static void * dev_seq_start(struct seq_file *s, loff_t *pos) · 2970 unmodified lines
2971{2971{
2972 struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);2972 struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);
2973 2973
2974 s->private = it;
2974 if (! it)2975 if (! it)
2975 return NULL;2976 return NULL;
2977
2976 if (NULL == sg_dev_arr)2978 if (NULL == sg_dev_arr)
2977 goto err1;2979 return NULL;
2978 it->index = *pos;2980 it->index = *pos;
2979 it->max = sg_last_dev();2981 it->max = sg_last_dev();
2980 if (it->index >= it->max)2982 if (it->index >= it->max)
2981 goto err1;2983 return NULL;
2982 return it;2984 return it;
2983err1:
2984 kfree(it);
2985 return NULL;
2986}2985}
2987 2986
2988static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)2987static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)
2989{2988{
2990 struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;2989 struct sg_proc_deviter * it = s->private;
2991 2990
2992 *pos = ++it->index;2991 *pos = ++it->index;
2993 return (it->index < it->max) ? it : NULL;2992 return (it->index < it->max) ? it : NULL;
@@ -2995,7 +2994,7 @@ static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos) · 1 unmodified line
2995 2994
2996static void dev_seq_stop(struct seq_file *s, void *v)2995static void dev_seq_stop(struct seq_file *s, void *v)
2997{2996{
2998 kfree (v);2997 kfree(s->private);
2999}2998}
3000 2999
3001static int sg_proc_open_dev(struct inode *inode, struct file *file)3000static int sg_proc_open_dev(struct inode *inode, struct file *file)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t