--- star-1.5/star/checkerr.c.orig-segv 2006-10-31 18:06:25.000000000 +0100 +++ star-1.5/star/checkerr.c 2007-08-27 11:42:39.000000000 +0200 @@ -183,44 +183,45 @@ LOCAL struct eflags { */ LOCAL UInt32_t errflags(eflag, doexit) - char *eflag; - BOOL doexit; + char *eflag; + BOOL doexit; { - register char *p = eflag; - char *ef = _endword(eflag); - char ec; - register struct eflags *ep; - register int slen; - register UInt32_t nflags = 0; - - ec = *ef; - *ef = '\0'; - do { - for (ep = eflags; ep->fname; ep++) { - slen = strlen(ep->fname); - if ((strncmp(ep->fname, p, slen) == 0) && - (p[slen] == '|' || p[slen] == ' ' || - p[slen] == '\0')) { - nflags |= ep->fval; - break; - } - } - if (ep->fname == NULL) { - if (doexit) - comerrno(EX_BAD, "Bad flag '%s'\n", p); - *ef = ec; /* Restore old character */ - return (0); - } - p = strchr(p, '|'); - } while (p && *p++ == '|'); - - *ef = ec; /* Restore old character */ - if ((nflags & ~(UInt32_t)(E_ABORT|E_WARN)) == 0) { - if (doexit) - comerrno(EX_BAD, "Bad error condition '%s'.\n", eflag); - return (0); - } - return (nflags); + register struct eflags *ep; + register int slen; + register UInt32_t nflags = 0; + char *curflags; + char *curflag; + + curflags = strdup (eflag); + *_endword(curflags) = '\0'; + curflag = strtok (curflags, "|"); + + while (curflag != NULL) { + for (ep = eflags; ep->fname; ep++) { + slen = strlen (ep->fname); + if ((strncmp (ep->fname, curflag, slen)) == 0) { + nflags |= ep->fval; + goto next; + } + } + + if (doexit) + comerrno (EX_BAD, "Bad flag '%s' \n", curflag); + + free (curflags); + return (0); + next: + curflag = strtok (NULL, "|"); + } + + free (curflags); + + if ((nflags & ~(UInt32_t)(E_ABORT|E_WARN)) == 0) { + if (doexit) + comerrno(EX_BAD, "Bad error condition '%s'.\n", eflag); + return (0); + } + return (nflags); } LOCAL ec_t *