Avoid clobbering `errno` from `realpath` call in `__mount`
The __mount logic calls `realpath`, which can set errno in some cases (e.g. if a file is not found or the input string is malformed). The __mount algorithm here is attempting to use errno as signal of the `mount` syscall's success, which is not accurate if the value is clobbered.
This CL fixes the issue by clearing the errno explicitly just before the `mount` call. This ensures that any errno set is from the `mount` call itself. The existing `save_errno` field handles the logic for reading the previous invocation's errno value.
Bug: b/379929394
Change-Id: I840171079a71a1e7927fcc30d6c0863fab6c7e00
diff --git a/fs_mgr/fs_mgr.cpp b/fs_mgr/fs_mgr.cpp
index 9f52f44..88e26cf 100644
--- a/fs_mgr/fs_mgr.cpp
+++ b/fs_mgr/fs_mgr.cpp
@@ -858,6 +858,10 @@
if (!android::base::Realpath(source, &real_source)) {
real_source = source;
}
+
+ // Clear errno prior to calling `mount`, to avoid clobbering with any errno that
+ // may have been set from prior calls (e.g. realpath).
+ errno = 0;
ret = mount(real_source.c_str(), target.c_str(), entry.fs_type.c_str(), mountflags,
opts.c_str());
save_errno = errno;