---
ell/key.c | 43 ++++++++++++++++++++++++++++++++++++-------
1 file changed, 36 insertions(+), 7 deletions(-)
diff --git a/ell/key.c b/ell/key.c
index 6117e31..60602f9 100644
--- a/ell/key.c
+++ b/ell/key.c
@@ -64,43 +64,72 @@ static const char * const key_type_names[] = {
static long kernel_add_key(const char *type, const char *description,
const void *payload, size_t len, int32_t keyring)
{
- return syscall(__NR_add_key, type, description, payload, len, keyring);
+ long result;
+
+ result = syscall(__NR_add_key, type, description, payload, len,
+ keyring);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_read_key(int32_t serial, const void *payload, size_t len)
{
- return syscall(__NR_keyctl, KEYCTL_READ, serial, payload, len);
+ long result;
+
+ result = syscall(__NR_keyctl, KEYCTL_READ, serial, payload, len);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_update_key(int32_t serial, const void *payload, size_t len)
{
- return syscall(__NR_keyctl, KEYCTL_UPDATE, serial, payload, len);
+ long result;
+
+ result = syscall(__NR_keyctl, KEYCTL_UPDATE, serial, payload, len);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_revoke_key(int32_t serial)
{
- return syscall(__NR_keyctl, KEYCTL_REVOKE, serial);
+ long result;
+
+ result = syscall(__NR_keyctl, KEYCTL_REVOKE, serial);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_link_key(int32_t key_serial, int32_t ring_serial)
{
- return syscall(__NR_keyctl, KEYCTL_LINK, key_serial, ring_serial);
+ long result;
+
+ result = syscall(__NR_keyctl, KEYCTL_LINK, key_serial, ring_serial);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_unlink_key(int32_t key_serial, int32_t ring_serial)
{
- return syscall(__NR_keyctl, KEYCTL_UNLINK, key_serial, ring_serial);
+ long result;
+
+ result = syscall(__NR_keyctl, KEYCTL_UNLINK, key_serial, ring_serial);
+
+ return result >= 0 ? result : -errno;
}
static long kernel_dh_compute(int32_t private, int32_t prime, int32_t base,
void *payload, size_t len)
{
+ long result;
+
struct keyctl_dh_params params = { .private = private,
.prime = prime,
.base = base };
- return syscall(__NR_keyctl, KEYCTL_DH_COMPUTE, ¶ms, payload, len,
+ result = syscall(__NR_keyctl, KEYCTL_DH_COMPUTE, ¶ms, payload, len,
NULL);
+
+ return result >= 0 ? result : -errno;
}
static bool setup_internal_keyring(void)
--
2.9.2