On 10/22/2013 01:21 PM, Michal Privoznik wrote:
Currently, if access(path, mode) is invoked, we check if @path has
this
special prefix SYSFS_PREFIX. If it does, we modify the path a bit and
call realaccess. If it doesn't we act just like a wrapper and call
realaccess directly. However, we are mocking fopen() as well. And as one
can clearly see there, fopen("/proc/cgroups") will succeed. Hence, we
have an error in our mocked access(): We need to check whether @path is
not equal to /proc/cgroups as it may not exists on real system we're
running however we definitely know how to fopen() it.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tests/vircgroupmock.c | 8 ++++++++
1 file changed, 8 insertions(+)
Close.
diff --git a/tests/vircgroupmock.c b/tests/vircgroupmock.c
index adc1718..6d7083d 100644
--- a/tests/vircgroupmock.c
+++ b/tests/vircgroupmock.c
@@ -498,6 +498,14 @@ int access(const char *path, int mode)
}
ret = realaccess(newpath, mode);
free(newpath);
+ } else if (STREQ(path, "/proc/cgroups") ||
+ STREQ(path, "/proc/self/cgroup")) {
+ /* These files are readable for all. */
+ ret = (mode == F_OK || mode & R_OK) ? 0 : -1;
Our mock means the files are readable for all, but not writable for all.
I'd feel safer with:
ret = (mode == F_OK || mode == R_OK) ? 0 : -1;
so that we explicitly reject attempts to probe for other combinations
like 'mode == (R_OK|X_OK)'.
+ } else if (STREQ(path, "/proc/mounts")) {
+ /* This one is accessible anytime for anybody. In fact, it's just
+ * a symlink to /proc/self/mounts. */
+ ret = 0;
} else {
ret = realaccess(path, mode);
}
ACK if that change still passes testing (but there may be fallout from
mocking non-writable, which in turn would require a v2).
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org