/* The entry hook ensures that the return hook is only called for
accesses to /proc */
+static int print_once = 0;
+
static int lookup_slow_ret(struct kretprobe_instance *ri, struct pt_regs *regs)
{
- struct procprotect_ctx *ctx = (struct procprotect_ctx *) ri->data;
- int ret = regs->ax;
+ struct procprotect_ctx *ctx;
+ int ret;
+
+ if (!ri) {printk(KERN_CRIT "ri is 0x0");/* Race condition?*/ return 0;}
+ ctx = (struct procprotect_ctx *) ri->data;
+
+ if (!regs) {
+ if (!print_once++) {
+ printk(KERN_CRIT "Regs is 0x0");
+ }
+ return 0;
+ }
+
+ ret = regs->ax;
if (ret==0) {
- /* The kernel is going to honor the request. Here's where we step in */
- /*struct qstr *q = ctx->q;
- if (!strncmp(q->name,"sysrq-trigger",13)) {
- printk(KERN_CRIT "lookup_slow sysrqtrigger");
- }*/
struct path *p = ctx->path;
+ if (!p) {
+ if (!print_once++) {
+ printk(KERN_CRIT "P is 0x0");
+ }
+ return 0;
+ }
+ if (!p->dentry) {
+ if (!print_once++) {
+ printk(KERN_CRIT "P->dentry is 0x0");
+ }
+ return 0;
+ }
+
struct inode *inode = p->dentry->d_inode;
+ if (!inode) {
+ if (!print_once++) {
+ printk(KERN_CRIT "inode is 0x0");
+ }
+ return 0;
+ }
if (!run_acl(inode->i_ino)) {
regs->ax = -EPERM;
}