On 1/15/20 6:54 AM, Dan Carpenter wrote: > What we are trying to do is change the '=' character to a NUL terminator > and then at the end of the function we restore it back to an '='. The > problem is there are two error paths where we jump to the end of the > function before we have replaced the '=' with NUL. We end up putting > the '=' in the wrong place (possibly one element before the start of > the buffer). Bleh. > Reported-by: syzbot+e64a13c5369a194d67df@xxxxxxxxxxxxxxxxxxxxxxxxx > Fixes: 095f1fc4ebf3 ("mempolicy: rework shmem mpol parsing and display") > Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> CC stable perhaps? Can this (tmpfs mount options parsing AFAICS?) become part of unprivileged operation in some scenarios? > --- > mm/mempolicy.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > index 067cf7d3daf5..1340c5c496b5 100644 > --- a/mm/mempolicy.c > +++ b/mm/mempolicy.c > @@ -2817,6 +2817,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) > char *flags = strchr(str, '='); > int err = 1, mode; > > + if (flags) > + *flags++ = '\0'; /* terminate mode string */ > + > if (nodelist) { > /* NUL-terminate mode or flags string */ > *nodelist++ = '\0'; > @@ -2827,9 +2830,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) > } else > nodes_clear(nodes); > > - if (flags) > - *flags++ = '\0'; /* terminate mode string */ > - > mode = match_string(policy_modes, MPOL_MAX, str); > if (mode < 0) > goto out; >