Mark Asselstine:
> As stated in tools/objtool/Documentation/stack-validation.txt the use
> of "Dynamic jumps and jumps to undefined symbols" has several
> conditions, neither of which we meet. The use of .label to dictate
> which label we 'goto' can be implemented in several ways that will be
> 'safe' from the stack validation point of view. Here we drop the
> .label and instead are able to use the .flags to decide which label to
> goto. This results in the same end result while ensuring we are a good
> citizen with respect to the stack validation.
Thank you for the patch.
Actually I made very similar fix when linux-v4.6-rc1 was released (two
years ago), but the commit stays in my local development branch and has
not released. It was my GIT-work mistake.
Here is my fix, and I am going to release on next Monday.
J. R. Okajima
diff --git a/fs/aufs/cpup.c b/fs/aufs/cpup.c
index 9ff0963..3c74d6f 100644
--- a/fs/aufs/cpup.c
+++ b/fs/aufs/cpup.c
@@ -366,18 +366,15 @@ static int au_cp_regular(struct au_cp_generic *cpg)
struct dentry *dentry;
int force_wr;
struct file *file;
- void *label;
} *f, file[] = {
{
.bindex = cpg->bsrc,
.flags = O_RDONLY | O_NOATIME | O_LARGEFILE,
- .label = &&out
},
{
.bindex = cpg->bdst,
.flags = O_WRONLY | O_NOATIME | O_LARGEFILE,
.force_wr = !!au_ftest_cpup(cpg->flags, RWDST),
- .label = &&out_src
}
};
struct super_block *sb;
@@ -391,8 +388,12 @@ static int au_cp_regular(struct au_cp_generic *cpg)
f->file = au_h_open(cpg->dentry, f->bindex, f->flags,
/*file*/NULL, f->force_wr);
err = PTR_ERR(f->file);
- if (IS_ERR(f->file))
- goto *f->label;
+ if (IS_ERR(f->file)) {
+ if (i == SRC)
+ goto out;
+ else
+ goto out_src;
+ }
}
/* try stopping to update while we copyup */