Linux Archive

Linux Archive (
-   ArchLinux Pacman Development (
-   -   Ensure we have a root partition when checking space (

Allan McRae 03-17-2011 10:27 AM

Ensure we have a root partition when checking space
On 17/03/11 20:16, Dan McGee wrote:

Partially addresses the "why doesn't CheckSpace work in a chroot" issue.
We can't make it work, but we can at least detect when it won't work by
the lack of a root partition to bucket the stragglers into. Check the
last item in the mountpoint list to ensure it is our root device, and if
not, bail out with an error.

Signed-off-by: Dan McGee<>

For maint? Allan, Eric, enjoy, I think this should help address things, but
testing it out in a chroot would be much appreciated.

This looks good. I will do some testing with it later, but it seems
fine for a maint release.

But... lets look for an extreme edge case! Using "pacman -r <dir>"
does not necessarily need the / partition to be found, just the one
containing <dir>. I'm not sure such a set-up is possible, so I am
happy ignoring it until someone actually reports it...

As an asdie, with this check, we should never encounter the error when a
file can not be matched to a mountpoint. So that string update should
never be seen. :P

lib/libalpm/diskspace.c | 14 +++++++++++++-
1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
index 892b1aa..19eaeea 100644
--- a/lib/libalpm/diskspace.c
+++ b/lib/libalpm/diskspace.c
@@ -61,7 +61,7 @@ static int mount_point_cmp(const void *p1, const void *p2)

static alpm_list_t *mount_point_list(void)
- alpm_list_t *mount_points = NULL;
+ alpm_list_t *mount_points = NULL, *ptr;
alpm_mountpoint_t *mp;

#if defined HAVE_GETMNTENT
@@ -124,6 +124,10 @@ static alpm_list_t *mount_point_list(void)

mount_points = alpm_list_msort(mount_points, alpm_list_count(mount_points),
+ for(ptr = mount_points; ptr != NULL; ptr = ptr->next) {
+ mp = ptr->data;
+ _alpm_log(PM_LOG_DEBUG, "mountpoint: %s
", mp->mount_dir);
+ }

@@ -256,6 +260,7 @@ cleanup:
int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
alpm_list_t *mount_points, *i;
+ alpm_mountpoint_t *last;
size_t replaces = 0, current = 0, numtargs;
int abort = 0;
alpm_list_t *targ;
@@ -266,6 +271,13 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
_alpm_log(PM_LOG_ERROR, _("could not determine filesystem mount points"));
+ /* due to sorting, the last entry in our mountpoint list should be '/' */
+ i = alpm_list_last(mount_points);
+ last = i->data;
+ if(strcmp("/", last->mount_dir) != 0) {
+ _alpm_log(PM_LOG_ERROR, _("could not determine root filesystem mount"));
+ return(-1);
+ }

replaces = alpm_list_count(trans->remove);
if(replaces) {

All times are GMT. The time now is 04:29 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.