Author: brooks
Date: Tue May  2 21:20:27 2017
New Revision: 317707
URL: https://svnweb.freebsd.org/changeset/base/317707

Log:
  Correct an out-of-bounds read in regcomp when the RE is bad.
  
  When passed the invalid regular expression "a**", the error is
  eventually detected and seterr() is called. It sets p->error
  appropriatly and p->next and p->end to nuls which is a never used char
  nuls[10] which is zeros due to .bss initialization. Unfortunatly,
  p_ere_exp() and p_simp_re() both have fall through cases where they set
  the error, decrement p->next and access it which means a read from what
  ever .bss variable comes before nuls.
  
  Found with regex_test:repet_multi and CHERI bounds checking.
  
  Reviewed by:  ngie, pfg, emaste
  Obtained from:        CheriBSD
  Sponsored by: DARPA, AFRL
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D10541

Modified:
  head/lib/libc/regex/regcomp.c

Modified: head/lib/libc/regex/regcomp.c
==============================================================================
--- head/lib/libc/regex/regcomp.c       Tue May  2 21:09:07 2017        
(r317706)
+++ head/lib/libc/regex/regcomp.c       Tue May  2 21:20:27 2017        
(r317707)
@@ -444,6 +444,8 @@ p_ere_exp(struct parse *p)
                (void)REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT);
                /* FALLTHROUGH */
        default:
+               if (p->error != 0)
+                       return;
                p->next--;
                wc = WGETNEXT();
                ordinary(p, wc);
@@ -651,6 +653,8 @@ p_simp_re(struct parse *p,
                (void)REQUIRE(starordinary, REG_BADRPT);
                /* FALLTHROUGH */
        default:
+               if (p->error != 0)
+                       return(0);      /* Definitely not $... */
                p->next--;
                wc = WGETNEXT();
                ordinary(p, wc);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to