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 */