1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-08-04 15:49:42 +02:00

df: reduce memory usage when filtering mount entries

Avoid Valgrind reports of "definitely lost" items
and while at it, free all discarded mount entries
to minimize the amount of memory used.

* src/df.c (filter_mount_list): Use the newly exported
free_mount_entry() from gnulib to free all mount entries
as they're discarded.
This commit is contained in:
Anton Ovchinnikov
2013-07-11 13:44:24 +01:00
committed by Pádraig Brady
parent 27712763e3
commit 3ebc58cc43
+21 -9
View File
@@ -613,10 +613,11 @@ filter_mount_list (void)
struct devlist *devlist_head = NULL;
/* Sort all 'wanted' entries into the list devlist_head. */
for (me = mount_list; me; me = me->me_next)
for (me = mount_list; me;)
{
struct stat buf;
struct devlist *devlist;
struct mount_entry *discard_me = NULL;
if (-1 == stat (me->me_mountdir, &buf))
{
@@ -635,25 +636,36 @@ filter_mount_list (void)
if (devlist)
{
discard_me = me;
/* Let the shorter mountdir win. */
if (! strchr (devlist->me->me_devname, '/')
|| (strlen (devlist->me->me_mountdir)
> strlen (me->me_mountdir)))
{
/* FIXME: free ME - the others are also not free()d. */
discard_me = devlist->me;
devlist->me = me;
}
continue; /* ... with the loop over the mount_list. */
}
}
}
/* Add the device number to the global list devlist. */
devlist = xmalloc (sizeof *devlist);
devlist->me = me;
devlist->dev_num = buf.st_dev;
devlist->next = devlist_head;
devlist_head = devlist;
if (discard_me)
{
me = me->me_next;
free_mount_entry (discard_me);
}
else
{
/* Add the device number to the global list devlist. */
devlist = xmalloc (sizeof *devlist);
devlist->me = me;
devlist->dev_num = buf.st_dev;
devlist->next = devlist_head;
devlist_head = devlist;
me = me->me_next;
}
}
/* Finally rebuild the mount_list from the devlist. */