asmlinkage long compat_sys_add_key(const char __user *_type, const char __user *_description, const void __user *_payload, u32 plen, u32 ringid) { return sys_add_key(_type, _description, _payload, plen, ringid); }
/* * stress_key * stress key operations */ int stress_key( uint64_t *const counter, const uint32_t instance, const uint64_t max_ops, const char *name) { (void)instance; (void)name; pid_t ppid = getppid(); key_serial_t keys[MAX_KEYS]; do { size_t i, n = 0; char description[64]; char payload[64]; /* Add as many keys as we are allowed */ for (n = 0; n < MAX_KEYS; n++) { snprintf(description, sizeof(description), "stress-ng-key-%u-%" PRIu32 "-%zu", ppid, instance, n); snprintf(payload, sizeof(payload), "somedata-%zu", n); keys[n] = sys_add_key("user", description, payload, strlen(payload), KEY_SPEC_PROCESS_KEYRING); if (keys[n] < 0) { if ((errno != ENOMEM) && (errno != EDQUOT)) pr_failed_err(name, "add_key"); break; } #if defined(KEYCTL_SET_TIMEOUT) if (sys_keyctl(KEYCTL_SET_TIMEOUT, keys[n], 1) < 0) pr_failed_err(name, "keyctl KEYCTL_SET_TIMEOUT"); #endif } /* And manipulate the keys */ for (i = 0; i < n; i++) { snprintf(description, sizeof(description), "stress-ng-key-%u-%" PRIu32 "-%zu", ppid, instance, i); #if defined(KEYCTL_DESCRIBE) if (sys_keyctl(KEYCTL_DESCRIBE, keys[i], description) < 0) pr_failed_err(name, "keyctl KEYCTL_DESCRIBE"); if (!opt_do_run) break; #endif snprintf(payload, sizeof(payload), "somedata-%zu", n); #if defined(KEYCTL_UPDATE) if (sys_keyctl(KEYCTL_UPDATE, keys[i], payload, strlen(payload)) < 0) { if ((errno != ENOMEM) && (errno != EDQUOT)) pr_failed_err(name, "keyctl KEYCTL_UPDATE"); } if (!opt_do_run) break; #endif #if defined(KEYCTL_READ) memset(payload, 0, sizeof(payload)); if (sys_keyctl(KEYCTL_READ, keys[i], payload, sizeof(payload)) < 0) pr_failed_err(name, "keyctl KEYCTL_READ"); if (!opt_do_run) break; #endif #if defined(KEYCTL_CLEAR) (void)sys_keyctl(KEYCTL_CLEAR, keys[i]); #endif #if defined(KEYCTL_INVALIDATE) (void)sys_keyctl(KEYCTL_INVALIDATE, keys[i]); #endif (*counter)++; } /* If we hit too many errors and bailed out early, clean up */ while (i < n) { #if defined(KEYCTL_CLEAR) (void)sys_keyctl(KEYCTL_CLEAR, keys[i]); #endif #if defined(KEYCTL_INVALIDATE) (void)sys_keyctl(KEYCTL_INVALIDATE, keys[i]); #endif i++; } } while (opt_do_run && (!max_ops || *counter < max_ops)); return EXIT_SUCCESS; }