[Crash-utility] [PATCH v2] Fixed the segment fault when ikconfig passed nonstandard values

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Fri Jan 15 08:57:52 UTC 2021


> -----Original Message-----
> 在 2021年01月05日 20:12, crash-utility-request at redhat.com 写道:
> > From: Jackie Liu <liuyun01 at kylinos.cn>
> >
> > Some strange reasons may cause kcore to collect some strange
> > entries of ikconfig, such as CONFIG_SECU+[some hex data] causes
> > the 'val' to be NULL, and then crashes when strdup.
> >
> > CONFIG_SECU+[some hex data] to be **strings that don't
> > contain the delimitor string '='** and then strtok_r() interprets
> > it as consisting of a single token, hence val resulting in having NULL.
> >
> 
> Thank you for the fix.
> 
> Acked-by: Lianbo Jiang <lijiang at redhat.com>
> 

Queued for the next version:
https://github.com/crash-utility/crash/commit/5a0488049917ba2790d59108f3def16825528974

Thanks,
Kazu

> > [d.hatayama at fujitsu.com: rewrite comment]
> > Suggested-by: HAGIO KAZUHITO(?? ??) <k-hagio-ab at nec.com>
> > Signed-off-by: Jackie Liu <liuyun01 at kylinos.cn>
> > ---
> >  kernel.c | 14 +++++++++++---
> >  1 file changed, 11 insertions(+), 3 deletions(-)
> >
> > diff --git a/kernel.c b/kernel.c
> > index 9871637..c8182a6 100644
> > --- a/kernel.c
> > +++ b/kernel.c
> > @@ -10236,7 +10236,7 @@ static struct ikconfig_list {
> >  	char *val;
> >  } *ikconfig_all;
> >
> > -static void add_ikconfig_entry(char *line, struct ikconfig_list *ent)
> > +static int add_ikconfig_entry(char *line, struct ikconfig_list *ent)
> >  {
> >  	char *tokptr, *name, *val;
> >
> > @@ -10244,8 +10244,16 @@ static void add_ikconfig_entry(char *line, struct ikconfig_list *ent)
> >  	sscanf(name, "CONFIG_%s", name);
> >  	val = strtok_r(NULL, "", &tokptr);
> >
> > +	if (!val) {
> > +		if (CRASHDEBUG(2))
> > +			error(WARNING, "invalid ikconfig entry: %s\n", line);
> > +		return FALSE;
> > +	}
> > +
> >  	ent->name = strdup(name);
> >  	ent->val = strdup(val);
> > +
> > +	return TRUE;
> >  }
> >
> >  static int setup_ikconfig(char *config)
> > @@ -10265,8 +10273,8 @@ static int setup_ikconfig(char *config)
> >  			ent++;
> >
> >  		if (STRNEQ(ent, "CONFIG_")) {
> > -			add_ikconfig_entry(ent,
> > -					 &ikconfig_all[kt->ikconfig_ents++]);
> > +			if (add_ikconfig_entry(ent, &ikconfig_all[kt->ikconfig_ents]))
> > +				kt->ikconfig_ents++;
> >  			if (kt->ikconfig_ents == IKCONFIG_MAX) {
> >  				error(WARNING, "ikconfig overflow.\n");
> >  				return 1;
> > -- 2.17.1





More information about the Crash-utility mailing list