staticvoid fei_post_handler(struct kprobe *kp, struct pt_regs *regs, unsignedlong flags)
{ /* * A dummy post handler is required to prohibit optimizing, because * jump optimization does not support execution path overriding.
*/
}
mutex_lock(&fei_lock); /* * Since this operation can be done after retval file is removed, * It is safer to check the attr is still valid before accessing * its member.
*/ if (!fei_attr_is_valid(attr)) {
err = -ENOENT; goto out;
}
if (attr->kp.addr) { if (adjust_error_retval((unsignedlong)attr->kp.addr,
val) != retv)
err = -EINVAL;
} if (!err)
attr->retval = val;
out:
mutex_unlock(&fei_lock);
mutex_lock(&fei_lock); /* Here we also validate @attr to ensure it still exists. */ if (!fei_attr_is_valid(attr))
err = -ENOENT; else
*val = attr->retval;
mutex_unlock(&fei_lock);
/* cut off if it is too long */ if (count > KSYM_NAME_LEN)
count = KSYM_NAME_LEN;
buf = memdup_user_nul(buffer, count); if (IS_ERR(buf)) return PTR_ERR(buf);
sym = strstrip(buf);
mutex_lock(&fei_lock);
/* Writing just spaces will remove all injection points */ if (sym[0] == '\0') {
fei_attr_remove_all();
ret = count; goto out;
} /* Writing !function will remove one injection point */ if (sym[0] == '!') {
attr = fei_attr_lookup(sym + 1); if (!attr) {
ret = -ENOENT; goto out;
}
fei_attr_remove(attr);
ret = count; goto out;
}
addr = kallsyms_lookup_name(sym); if (!addr) {
ret = -EINVAL; goto out;
} if (!within_error_injection_list(addr)) {
ret = -ERANGE; goto out;
} if (fei_attr_lookup(sym)) {
ret = -EBUSY; goto out;
}
attr = fei_attr_new(sym, addr); if (!attr) {
ret = -ENOMEM; goto out;
}
ret = register_kprobe(&attr->kp); if (ret) {
fei_attr_free(attr); goto out;
}
fei_debugfs_add_attr(attr);
list_add_tail(&attr->list, &fei_attr_list);
ret = count;
out:
mutex_unlock(&fei_lock);
kfree(buf); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.