On Wed, Jul 01, 2020 at 08:05:58PM -0700, Stephen Hemminger wrote: > If cfgfile is give a line with comment character at the start > of the line, it will dereference outside of the buffer. > > Detected with address sanitizer: > > SUMMARY: AddressSanitizer: stack-buffer-underflow > lib/librte_cfgfile/rte_cfgfile.c:194 in rte_cfgfile_load_with_params > Shadow bytes around the buggy address: > 0x200fff79f6a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f6b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f6c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f6d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f6e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > =>0x200fff79f6f0: 00 00 00 00 f1 f1 f1[f1]00 00 00 00 00 00 00 00 > 0x200fff79f700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 0x200fff79f720: 04 f2 f2 f2 f3 f3 f3 f3 00 00 00 00 00 00 00 00 > 0x200fff79f730: 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 f2 > 0x200fff79f740: f2 f2 f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 > Shadow byte legend (one shadow byte represents 8 application bytes): > Addressable: 00 > Partially addressable: 01 02 03 04 05 06 07 > Heap left redzone: fa > Freed heap region: fd > Stack left redzone: f1 > Stack mid redzone: f2 > Stack right redzone: f3 > Stack after return: f5 > Stack use after scope: f8 > Global redzone: f9 > Global init order: f6 > Poisoned by user: f7 > Container overflow: fc > Array cookie: ac > Intra object redzone: bb > ASan internal: fe > Left alloca redzone: ca > Right alloca redzone: cb > ==2189==ABORTING > > Fixes: a6a47ac9c2c9 ("cfgfile: rework load function") > Cc: jacekx.piase...@intel.com > CC: sta...@dpdk.org > Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > --- > lib/librte_cfgfile/rte_cfgfile.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_cfgfile/rte_cfgfile.c > b/lib/librte_cfgfile/rte_cfgfile.c > index 714717dd9007..160d78826e7c 100644 > --- a/lib/librte_cfgfile/rte_cfgfile.c > +++ b/lib/librte_cfgfile/rte_cfgfile.c > @@ -191,7 +191,8 @@ rte_cfgfile_load_with_params(const char *filename, int > flags, > } > /* skip parsing if comment character found */ > pos = memchr(buffer, params->comment_character, len); > - if (pos != NULL && (*(pos-1) != '\\')) { > + if (pos != NULL && > + (pos == buffer || *(pos-1) != '\\')) { > *pos = '\0'; > len = pos - buffer; > } > --
Good catch by the tool. Reviewed-by: Bruce Richardson <bruce.richard...@intel.com>