| @@ -1109,13 +1109,18 @@ out: · 1108 unmodified lines |
| 1109 | } | 1109 | } |
| 1110 | | 1110 | |
| 1111 | #ifdef CONFIG_SECCOMP_FILTER | 1111 | #ifdef CONFIG_SECCOMP_FILTER |
| 1112 | static int seccomp_notify_release(struct inode *inode, struct file *file) | 1112 | static void seccomp_notify_free(struct seccomp_filter *filter) |
| | 1113 | { |
| | 1114 | kfree(filter->notif); |
| | 1115 | filter->notif = NULL; |
| | 1116 | } |
| | 1117 | |
| | 1118 | static void seccomp_notify_detach(struct seccomp_filter *filter) |
| 1113 | { | 1119 | { |
| 1114 | struct seccomp_filter *filter = file->private_data; | | |
| 1115 | struct seccomp_knotif *knotif; | 1120 | struct seccomp_knotif *knotif; |
| 1116 | | 1121 | |
| 1117 | if (!filter) | 1122 | if (!filter) |
| 1118 | return 0; | 1123 | return; |
| 1119 | | 1124 | |
| 1120 | mutex_lock(&filter->notify_lock); | 1125 | mutex_lock(&filter->notify_lock); |
| 1121 | | 1126 | |
| @@ -1139,9 +1144,15 @@ static int seccomp_notify_release(struct inode *inode, struct file *file) · 17 unmodified lines |
| 1139 | complete(&knotif->ready); | 1144 | complete(&knotif->ready); |
| 1140 | } | 1145 | } |
| 1141 | | 1146 | |
| 1142 | kfree(filter->notif); | 1147 | seccomp_notify_free(filter); |
| 1143 | filter->notif = NULL; | | |
| 1144 | mutex_unlock(&filter->notify_lock); | 1148 | mutex_unlock(&filter->notify_lock); |
| | 1149 | } |
| | 1150 | |
| | 1151 | static int seccomp_notify_release(struct inode *inode, struct file *file) |
| | 1152 | { |
| | 1153 | struct seccomp_filter *filter = file->private_data; |
| | 1154 | |
| | 1155 | seccomp_notify_detach(filter); |
| 1145 | __put_seccomp_filter(filter); | 1156 | __put_seccomp_filter(filter); |
| 1146 | return 0; | 1157 | return 0; |
| 1147 | } | 1158 | } |
| @@ -1488,7 +1499,7 @@ static struct file *init_listener(struct seccomp_filter *filter) · 340 unmodified lines |
| 1488 | | 1499 | |
| 1489 | out_notif: | 1500 | out_notif: |
| 1490 | if (IS_ERR(ret)) | 1501 | if (IS_ERR(ret)) |
| 1491 | kfree(filter->notif); | 1502 | seccomp_notify_free(filter); |
| 1492 | out: | 1503 | out: |
| 1493 | return ret; | 1504 | return ret; |
| 1494 | } | 1505 | } |
| @@ -1581,6 +1592,7 @@ out_put_fd: · 86 unmodified lines |
| 1581 | listener_f->private_data = NULL; | 1592 | listener_f->private_data = NULL; |
| 1582 | fput(listener_f); | 1593 | fput(listener_f); |
| 1583 | put_unused_fd(listener); | 1594 | put_unused_fd(listener); |
| | 1595 | seccomp_notify_detach(prepared); |
| 1584 | } else { | 1596 | } else { |
| 1585 | fd_install(listener, listener_f); | 1597 | fd_install(listener, listener_f); |
| 1586 | ret = listener; | 1598 | ret = listener; |