[bsdgrep] fgrepcomp(), ignore case and segfault with unicode locale

From: Test Rat <ttsestt_at_gmail.com>
Date: Fri, 12 Aug 2011 01:11:36 +0400
A quick test

  $ env -i bsdgrep -Fi without_nls usr.bin/grep/grep.c
  $ env -i gnugrep -Fi without_nls usr.bin/grep/grep.c
  #ifndef WITHOUT_NLS
  #ifndef WITHOUT_NLS
  #ifndef WITHOUT_NLS

shows that bsd fgrep already fails to ignore case. And if you throw
a few more options to the mix it'd crash, e.g.

  $ env -i LC_CTYPE=en_US.UTF-8 TERM=xterm bsdgrep --color -Fir without_nls usr.bin/grep/
  [...]
  Program received signal SIGSEGV, Segmentation fault.
  0x0000000801007ff2 in memchr (s=0x61167a, c=10, n=18446744073707490297) at /usr/src/lib/libc/string/memchr.c:48
  48                              if (*p++ == (unsigned char)c)
  (gdb) bt
  #0  0x0000000801007ff2 in memchr (s=0x61167a, c=10, n=18446744073707490297) at /usr/src/lib/libc/string/memchr.c:48
  #1  0x0000000801007b03 in __sfvwrite (fp=0x801247770, uio=0x7fffffffd8f0) at /usr/src/lib/libc/stdio/fvwrite.c:170
  #2  0x0000000801007698 in fwrite (buf=0x608c03, size=18446744073709551606, count=1, fp=0x801247770)
      at /usr/src/lib/libc/stdio/fwrite.c:95
  #3  0x0000000000405498 in printline (line=0x7fffffffdb70, sep=58, matches=0x7fffffffd990, m=9)
      at /usr/src/usr.bin/grep/util.c:500
  #4  0x0000000000404f51 in procline (l=0x7fffffffdb70, nottext=0) at /usr/src/usr.bin/grep/util.c:381
  #5  0x000000000040489f in procfile (fn=0x80140b600 "usr.bin/grep/nls/es_ES.ISO8859-1.msg") at /usr/src/usr.bin/grep/util.c:239
  #6  0x00000000004044d7 in grep_tree (argv=0x7fffffffdd30) at /usr/src/usr.bin/grep/util.c:163
  #7  0x0000000000403ea9 in main (argc=5, argv=0x7fffffffdd10) at /usr/src/usr.bin/grep/grep.c:689
  (gdb) bt f
  #0  0x0000000801007ff2 in memchr (s=0x61167a, c=10, n=18446744073707490297) at /usr/src/lib/libc/string/memchr.c:48
          p = (const unsigned char *) 0x800000 <Error reading address 0x800000: Bad address>
  #1  0x0000000801007b03 in __sfvwrite (fp=0x801247770, uio=0x7fffffffd8f0) at /usr/src/lib/libc/stdio/fvwrite.c:170
          len = 18446744073709516159
          p = 0x61167a ""
          iov = (struct __siov *) 0x7fffffffd8f0
          w = 880
          s = 880
          nl = 0x611679 "\n"
          nlknown = 0
          nldist = 0
  #2  0x0000000801007698 in fwrite (buf=0x608c03, size=18446744073709551606, count=1, fp=0x801247770)
      at /usr/src/lib/libc/stdio/fwrite.c:95
          n = 18446744073709551606
          uio = {uio_iov = 0x7fffffffd8e0, uio_iovcnt = 1, uio_resid = -35457}
          iov = {iov_base = 0x608c03, iov_len = 18446744073709551606}
  #3  0x0000000000405498 in printline (line=0x7fffffffdb70, sep=58, matches=0x7fffffffd990, m=9)
      at /usr/src/usr.bin/grep/util.c:500
          a = 99
          i = 9
          n = 1
  #4  0x0000000000404f51 in procline (l=0x7fffffffdb70, nottext=0) at /usr/src/usr.bin/grep/util.c:381
          matches = {{rm_so = 0, rm_eo = 11}, {rm_so = 11, rm_eo = 22}, {rm_so = 22, rm_eo = 33}, {rm_so = 33, rm_eo = 44}, {
      rm_so = 44, rm_eo = 55}, {rm_so = 55, rm_eo = 66}, {rm_so = 66, rm_eo = 77}, {rm_so = 77, rm_eo = 88}, {rm_so = 88,
      rm_eo = 99}, {rm_so = 21131328, rm_eo = 8}, {rm_so = -9696, rm_eo = 32767}, {rm_so = 16101362, rm_eo = 8}, {rm_so = 21131328,
      rm_eo = 8}, {rm_so = 16103767, rm_eo = 0}, {rm_so = 37, rm_eo = 0}, {rm_so = 8, rm_eo = 0}, {rm_so = -9632, rm_eo = 32767}, {
      rm_so = -8944, rm_eo = 32767}, {rm_so = -9664, rm_eo = 32767}, {rm_so = 16103767, rm_eo = 8}, {rm_so = 6327289, rm_eo = 0}, {
      rm_so = 437, rm_eo = 0}, {rm_so = -9584, rm_eo = 10}, {rm_so = 6327200, rm_eo = 0}, {rm_so = -9776, rm_eo = 0}, {
      rm_so = 6327290, rm_eo = 0}, {rm_so = -9536, rm_eo = 32767}, {rm_so = 4204252, rm_eo = 0}, {rm_so = -9584, rm_eo = 32767}, {
      rm_so = 6327200, rm_eo = 0}, {rm_so = -9352, rm_eo = 32767}, {rm_so = 21004392, rm_eo = 8}}
          pmatch = {rm_so = 88, rm_eo = 99}
          st = 99
          i = 1
          c = 1
          m = 9
          r = 0
  #5  0x000000000040489f in procfile (fn=0x80140b600 "usr.bin/grep/nls/es_ES.ISO8859-1.msg") at /usr/src/usr.bin/grep/util.c:239
          f = (struct file *) 0x801408068
          sb = {st_dev = 745804815, st_ino = 171971, st_mode = 33188, st_nlink = 1, st_uid = 1001, st_gid = 1001,
    st_rdev = 4294967295, st_atim = {tv_sec = 1292381124, tv_nsec = 0}, st_mtim = {tv_sec = 1280426577, tv_nsec = 0}, st_ctim = {
      tv_sec = 1292381124, tv_nsec = 165601426}, st_size = 526, st_blocks = 2, st_blksize = 4096, st_flags = 0, st_gen = 0,
    st_lspare = 0, st_birthtim = {tv_sec = 1292381124, tv_nsec = 165601426}}
          ln = {off = 0, len = 89,
    dat = 0x608ba0 "$ $FreeBSD: head/usr.bin/grep/nls/es_ES.ISO8859-1.msg 210622 2010-07-29 18:02:57Z gabor $\n$\n$set 1\n$quote \"\n1 \"(entrada estdar)\"\n2 \"no se puede leer el fichero comprimido bzip2\"\n3 \"opci desconocid"...,
    file = 0x801427040 "usr.bin/grep/nls/es_ES.ISO8859-1.msg", line_no = 1}
          s = 32768
          c = 0
          t = 8
  #6  0x00000000004044d7 in grep_tree (argv=0x7fffffffdd30) at /usr/src/usr.bin/grep/util.c:163
          fts = (FTS *) 0x80141b300
          p = (FTSENT *) 0x801424240
          d = 0x7fffffffdc10 "Àÿÿ\177"
          dir = 0x0
          c = 0
          fts_flags = 14
          ok = true
  #7  0x0000000000403ea9 in main (argc=5, argv=0x7fffffffdd10) at /usr/src/usr.bin/grep/grep.c:689
          aargv = (char **) 0x7fffffffdd30
          eargv = (char **) 0x80060eda0
          eopts = 0x0
          ep = 0x7fffffffdcc0 "ÿÿÿ\177"
          l = 34378972320
          aargc = 1
          eargc = 0
          i = 1
          c = -1
          lastc = 114
          needpattern = 1
          newarg = 1
          prevoptind = 3

--
no local bsdgrep changes
Received on Thu Aug 11 2011 - 19:11:44 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:16 UTC