|
@@ -420,6 +420,13 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
|
|
|
struct path parent_path;
|
|
|
int h, ret = 0;
|
|
|
|
|
|
+ /*
|
|
|
+ * When we will be calling audit_add_to_parent, krule->watch might have
|
|
|
+ * been updated and watch might have been freed.
|
|
|
+ * So we need to keep a reference of watch.
|
|
|
+ */
|
|
|
+ audit_get_watch(watch);
|
|
|
+
|
|
|
mutex_unlock(&audit_filter_mutex);
|
|
|
|
|
|
/* Avoid calling path_lookup under audit_filter_mutex. */
|
|
@@ -428,8 +435,10 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
|
|
|
/* caller expects mutex locked */
|
|
|
mutex_lock(&audit_filter_mutex);
|
|
|
|
|
|
- if (ret)
|
|
|
+ if (ret) {
|
|
|
+ audit_put_watch(watch);
|
|
|
return ret;
|
|
|
+ }
|
|
|
|
|
|
/* either find an old parent or attach a new one */
|
|
|
parent = audit_find_parent(d_backing_inode(parent_path.dentry));
|
|
@@ -447,6 +456,7 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
|
|
|
*list = &audit_inode_hash[h];
|
|
|
error:
|
|
|
path_put(&parent_path);
|
|
|
+ audit_put_watch(watch);
|
|
|
return ret;
|
|
|
}
|
|
|
|