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
29712971 {
29722972 struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);
29732973
2974+ s->private = it;
29742975 if (! it)
29752976 return NULL;
2977+
29762978 if (NULL == sg_dev_arr)
2977− goto err1;
2979+ return NULL;
29782980 it->index = *pos;
29792981 it->max = sg_last_dev();
29802982 if (it->index >= it->max)
2981− goto err1;
2983+ return NULL;
29822984 return it;
2983−err1:
2984− kfree(it);
2985− return NULL;
29862985 }
29872986
29882987 static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)
29892988 {
2990− struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2989+ struct sg_proc_deviter * it = s->private;
29912990
29922991 *pos = ++it->index;
29932992 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
29952994
29962995 static void dev_seq_stop(struct seq_file *s, void *v)
29972996 {
2998− kfree (v);
2997+ kfree(s->private);
29992998 }
30002999
30013000 static 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