Author: Martin Pitt Description: Check that sysfs is actually mounted in sysfs_get_mnt_path() and fail if not. Fixes behavioural breakage compared to 1.3. Forwarded: yes Index: sysfsutils-2.1.0+repack/lib/sysfs_utils.c =================================================================== --- sysfsutils-2.1.0+repack.orig/lib/sysfs_utils.c 2006-08-07 07:08:01.000000000 +0200 +++ sysfsutils-2.1.0+repack/lib/sysfs_utils.c 2010-08-06 19:03:58.276747000 +0200 @@ -22,6 +22,7 @@ */ #include "libsysfs.h" #include "sysfs.h" +#include /** * sysfs_remove_trailing_slash: Removes any trailing '/' in the given path @@ -53,6 +54,9 @@ { static char sysfs_path[SYSFS_PATH_MAX] = ""; const char *sysfs_path_env; + FILE *mnt; + struct mntent *mntent; + int ret; if (len == 0 || mnt_path == NULL) return -1; @@ -64,12 +68,31 @@ if (sysfs_path_env != NULL) { safestrcpymax(mnt_path, sysfs_path_env, len); sysfs_remove_trailing_slash(mnt_path); - return 0; + } else { + safestrcpymax(mnt_path, SYSFS_MNT_PATH, len); } - safestrcpymax(mnt_path, SYSFS_MNT_PATH, len); } - return 0; + /* check that mount point is indeed mounted */ + ret = -1; + if ((mnt = setmntent(SYSFS_PROC_MNTS, "r")) == NULL) { + dprintf("Error getting mount information\n"); + return -1; + } + while ((mntent = getmntent(mnt)) != NULL) { + if (strcmp(mntent->mnt_type, SYSFS_FSTYPE_NAME) == 0 && + strcmp(mntent->mnt_dir, mnt_path) == 0) { + ret = 0; + break; + } + } + + endmntent(mnt); + + if (ret < 0) + errno = ENOENT; + + return ret; } /**