mirror of
https://gitlab.com/apparmor/apparmor.git
synced 2025-03-06 09:21:00 +01:00
59 lines
1.3 KiB
Diff
59 lines
1.3 KiB
Diff
---
|
|
security/apparmor/main.c | 23 ++++++++++++++---------
|
|
1 file changed, 14 insertions(+), 9 deletions(-)
|
|
|
|
--- a/security/apparmor/main.c
|
|
+++ b/security/apparmor/main.c
|
|
@@ -172,15 +172,18 @@ escape:
|
|
static char *aa_get_name(struct dentry *dentry, struct vfsmount *mnt,
|
|
char **buffer, int check)
|
|
{
|
|
- char *name;
|
|
+ char *buf = NULL, *name;
|
|
int is_dir, size = 256;
|
|
|
|
is_dir = (check & AA_CHECK_DIR) ? 1 : 0;
|
|
|
|
for (;;) {
|
|
- char *buf = kmalloc(size, GFP_KERNEL);
|
|
- if (!buf)
|
|
- return ERR_PTR(-ENOMEM);
|
|
+ char *b = krealloc(buf, size, GFP_KERNEL);
|
|
+
|
|
+ name = ERR_PTR(-ENOMEM);
|
|
+ if (!b)
|
|
+ break;
|
|
+ buf = b;
|
|
|
|
name = d_namespace_path(dentry, mnt, buf, size - is_dir);
|
|
|
|
@@ -195,8 +198,8 @@ static char *aa_get_name(struct dentry *
|
|
* This dentry is not connected to the
|
|
* namespace root -- reject access.
|
|
*/
|
|
- kfree(buf);
|
|
- return ERR_PTR(-ENOENT);
|
|
+ name = ERR_PTR(-ENOENT);
|
|
+ break;
|
|
}
|
|
if (is_dir && name[1] != '\0') {
|
|
/*
|
|
@@ -212,13 +215,15 @@ static char *aa_get_name(struct dentry *
|
|
return name;
|
|
}
|
|
if (PTR_ERR(name) != -ENAMETOOLONG)
|
|
- return name;
|
|
+ break;
|
|
|
|
- kfree(buf);
|
|
size <<= 1;
|
|
+ name = ERR_PTR(-ENAMETOOLONG);
|
|
if (size > apparmor_path_max)
|
|
- return ERR_PTR(-ENAMETOOLONG);
|
|
+ break;
|
|
}
|
|
+ kfree(buf);
|
|
+ return name;
|
|
}
|
|
|
|
static inline void aa_put_name_buffer(char *buffer)
|