Merge "KeyUtil: use static local variable in isFsKeyringSupported()"
This commit is contained in:
commit
256b23b1c5
1 changed files with 28 additions and 31 deletions
37
KeyUtil.cpp
37
KeyUtil.cpp
|
@ -63,40 +63,37 @@ bool generateStorageKey(const KeyGeneration& gen, KeyBuffer* key) {
|
|||
}
|
||||
}
|
||||
|
||||
// Return true if the kernel supports the ioctls to add/remove fscrypt keys
|
||||
// directly to/from the filesystem.
|
||||
bool isFsKeyringSupported(void) {
|
||||
static bool initialized = false;
|
||||
static bool supported;
|
||||
|
||||
if (!initialized) {
|
||||
static bool isFsKeyringSupportedImpl() {
|
||||
android::base::unique_fd fd(open("/data", O_RDONLY | O_DIRECTORY | O_CLOEXEC));
|
||||
|
||||
// FS_IOC_ADD_ENCRYPTION_KEY with a NULL argument will fail with ENOTTY
|
||||
// if the ioctl isn't supported. Otherwise it will fail with another
|
||||
// error code such as EFAULT.
|
||||
// FS_IOC_ADD_ENCRYPTION_KEY with a NULL argument will fail with ENOTTY if
|
||||
// the ioctl isn't supported. Otherwise it will fail with another error
|
||||
// code such as EFAULT.
|
||||
//
|
||||
// Note that there's no need to check for FS_IOC_REMOVE_ENCRYPTION_KEY,
|
||||
// since it's guaranteed to be available if FS_IOC_ADD_ENCRYPTION_KEY is.
|
||||
// There's also no need to check for support on external volumes separately
|
||||
// from /data, since either the kernel supports the ioctls on all
|
||||
// fscrypt-capable filesystems or it doesn't.
|
||||
errno = 0;
|
||||
(void)ioctl(fd, FS_IOC_ADD_ENCRYPTION_KEY, NULL);
|
||||
if (errno == ENOTTY) {
|
||||
LOG(INFO) << "Kernel doesn't support FS_IOC_ADD_ENCRYPTION_KEY. Falling back to "
|
||||
"session keyring";
|
||||
supported = false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
if (errno != EFAULT) {
|
||||
PLOG(WARNING) << "Unexpected error from FS_IOC_ADD_ENCRYPTION_KEY";
|
||||
}
|
||||
LOG(DEBUG) << "Detected support for FS_IOC_ADD_ENCRYPTION_KEY";
|
||||
supported = true;
|
||||
android::base::SetProperty("ro.crypto.uses_fs_ioc_add_encryption_key", "true");
|
||||
return true;
|
||||
}
|
||||
// There's no need to check for FS_IOC_REMOVE_ENCRYPTION_KEY, since it's
|
||||
// guaranteed to be available if FS_IOC_ADD_ENCRYPTION_KEY is. There's
|
||||
// also no need to check for support on external volumes separately from
|
||||
// /data, since either the kernel supports the ioctls on all
|
||||
// fscrypt-capable filesystems or it doesn't.
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
// Return true if the kernel supports the ioctls to add/remove fscrypt keys
|
||||
// directly to/from the filesystem.
|
||||
bool isFsKeyringSupported(void) {
|
||||
static bool supported = isFsKeyringSupportedImpl();
|
||||
return supported;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue