vapier 14/03/20 08:06:01 Modified: scanelf.c Log: scanelf: convert -E option to use array_t this avoids silently (and wrongly) truncating the options given to -E. it also makes the code a lot easier to handle. #504340 by David Binderman
Revision Changes Path 1.262 pax-utils/scanelf.c file : http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/scanelf.c?rev=1.262&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/scanelf.c?rev=1.262&content-type=text/plain diff : http://sources.gentoo.org/viewvc.cgi/gentoo-projects/pax-utils/scanelf.c?r1=1.261&r2=1.262 Index: scanelf.c =================================================================== RCS file: /var/cvsroot/gentoo-projects/pax-utils/scanelf.c,v retrieving revision 1.261 retrieving revision 1.262 diff -u -r1.261 -r1.262 --- scanelf.c 20 Mar 2014 07:59:27 -0000 1.261 +++ scanelf.c 20 Mar 2014 08:06:01 -0000 1.262 @@ -1,13 +1,13 @@ /* * Copyright 2003-2012 Gentoo Foundation * Distributed under the terms of the GNU General Public License v2 - * $Header: /var/cvsroot/gentoo-projects/pax-utils/scanelf.c,v 1.261 2014/03/20 07:59:27 vapier Exp $ + * $Header: /var/cvsroot/gentoo-projects/pax-utils/scanelf.c,v 1.262 2014/03/20 08:06:01 vapier Exp $ * * Copyright 2003-2012 Ned Ludd - <so...@gentoo.org> * Copyright 2004-2012 Mike Frysinger - <vap...@gentoo.org> */ -static const char rcsid[] = "$Id: scanelf.c,v 1.261 2014/03/20 07:59:27 vapier Exp $"; +static const char rcsid[] = "$Id: scanelf.c,v 1.262 2014/03/20 08:06:01 vapier Exp $"; const char argv0[] = "scanelf"; #include "paxinc.h" @@ -18,7 +18,7 @@ static int file_matches_list(const char *filename, char **matchlist); /* variables to control behavior */ -static char *match_etypes = NULL; +static array_t _match_etypes = array_init_decl, *match_etypes = &_match_etypes; static array_t _ldpaths = array_init_decl, *ldpaths = &_ldpaths; static char scan_ldpath = 0; static char scan_envpath = 0; @@ -1550,6 +1550,8 @@ static int scanelf_elf(const char *filename, int fd, size_t len) { int ret = 1; + size_t n; + const char *match_etype; elfobj *elf; /* verify this is real ELF */ @@ -1568,20 +1570,12 @@ break; default: break; } - if (match_etypes) { - char sbuf[126]; - strncpy(sbuf, match_etypes, sizeof(sbuf)); - if (strchr(match_etypes, ',') != NULL) { - char *p; - while ((p = strrchr(sbuf, ',')) != NULL) { - *p = 0; - if (etype_lookup(p+1) == get_etype(elf)) - goto label_ret; - } - } - if (etype_lookup(sbuf) != get_etype(elf)) - goto label_done; - } + + array_for_each(match_etypes, n, match_etype) + if (etype_lookup(match_etype) == get_etype(elf)) + goto label_ret; + if (array_cnt(match_etypes)) + goto label_done; label_ret: ret = scanelf_elfobj(elf); @@ -2080,6 +2074,16 @@ flags &= ~PF_NO##flag; \ flags |= PF_##flag; \ } +static void parse_delimited(array_t *arr, char *arg, const char *delim) +{ + char *ele = strtok(arg, delim); + if (!ele) /* edge case: -s '' */ + xarraypush_str(arr, ""); + while (ele) { + xarraypush_str(arr, ele); + ele = strtok(NULL, delim); + } +} static int parseargs(int argc, char *argv[]) { int i; @@ -2103,7 +2107,8 @@ from_file = optarg; break; case 'E': - match_etypes = optarg; + /* historically, this was comma delimited */ + parse_delimited(match_etypes, optarg, ","); break; case 'M': match_bits = atoi(optarg); @@ -2126,17 +2131,10 @@ case 'k': xarraypush_str(find_section_arr, optarg); break; - case 's': { + case 's': /* historically, this was comma delimited */ - char *this_sym = strtok(optarg, ","); - if (!this_sym) /* edge case: -s '' */ - xarraypush_str(find_sym_arr, ""); - while (this_sym) { - xarraypush_str(find_sym_arr, this_sym); - this_sym = strtok(NULL, ","); - } + parse_delimited(find_sym_arr, optarg, ","); break; - } case 'N': xarraypush_str(find_lib_arr, optarg); break;