Guarded against some hypothetically possible errors
[procprotect.git] / procprotect.c
index 42166f5..1c3e803 100644 (file)
@@ -91,8 +91,16 @@ static int lookup_fast_entry(struct kretprobe_instance *ri, struct pt_regs *regs
     int ret = -1;
     struct procprotect_ctx *ctx;
     struct nameidata *nd = (struct nameidata *) regs->di;
-    struct dentry *parent = nd->path.dentry;
-    struct inode *pinode = parent->d_inode;
+    struct dentry *parent;
+    struct inode *pinode;
+       
+       if (!nd) return ret;
+       parent = nd->path.dentry;
+
+       if (!parent) return ret;
+       pinode = parent->d_inode;
+
+       if (!pinode || !pinode->i_sb || !current || !current->nsproxy) return ret;
 
     if (pinode->i_sb->s_magic == PROC_SUPER_MAGIC
             && current->nsproxy->mnt_ns!=init_task.nsproxy->mnt_ns) {  
@@ -132,9 +140,13 @@ static int lookup_slow_entry(struct kretprobe_instance *ri, struct pt_regs *regs
     struct procprotect_ctx *ctx;
     struct nameidata *nd = (struct nameidata *) regs->di;
     struct path *p = (struct path *) regs->si;
+    struct dentry *parent;
+       struct inode *pinode;
 
-    struct dentry *parent = nd->path.dentry;
-    struct inode *pinode = parent->d_inode;
+       if (!nd) return;
+       parent = nd->path.dentry;
+    if (!parent) return;
+       pinode= parent->d_inode;
 
     if (pinode->i_sb->s_magic == PROC_SUPER_MAGIC
             && current->nsproxy->mnt_ns!=init_task.nsproxy->mnt_ns) {  
@@ -293,11 +305,6 @@ static void add_entry(char *pathname) {
         }
     }
 
-       if (!once_only) {
-               once_only=1;
-               if (init_probes()==-1)
-                       printk(KERN_CRIT "Could not install procprotect probes. Reload module to retry.");
-       }
 }
 
 
@@ -339,6 +346,12 @@ int procfile_write(struct file *file, const char *buffer, unsigned long count, v
         pathname[count]='\0';
 
     add_entry(pathname);       
+               
+       if (!once_only) {
+               once_only=1;
+               if (init_probes()==-1)
+                       printk(KERN_CRIT "Could not install procprotect probes. Reload module to retry.");
+       }
     printk(KERN_CRIT "Length of buffer=%d",strlen(pathname));
     return count;
 }