<<< Date Index >>>     <<< Thread Index >>>

Re: [Mutt] #2714: Segfaults when trying to read header cache if cwd



#2714: Segfaults when trying to read header cache if cwd does not exist.

Changes (by brendan):

  * status:  new => closed
  * resolution:  => fixed

Old description:

> {{{
>
> Hi,
>
> the attached patch looks sane to me.
>
> Christoph
>
> Reply-To: Daniel Burrows <dburrows@xxxxxxxxxx>, 386003@xxxxxxxxxxxxxxx
> Date: Mon, 04 Sep 2006 08:57:44 -0700
> From: Daniel Burrows <dburrows@xxxxxxxxxx>
> To: Debian Bug Tracking System <submit@xxxxxxxxxxxxxxx>
>
> Package: mutt
> Version: 1.5.13-1
> Severity: normal
> Tags: patch
>
>   If I create a directory, cd to it, and delete it, then run mutt, I get
> a segfault:
>
> Reading /home/daniel/Mail/INBOX...Segmentation fault
>
>   Backtrace:
> #0  mutt_hcache_open (
>     path=0x810e260 "/home/daniel/.mutt/header_cache/0e22bb19e355e524ac163
> 08aeab641c5", folder=0x816f048 "/home/daniel/Mail/INBOX") at
> ../hcache.c:985
> #1  0x0808f640 in maildir_delayed_parsing (ctx=0x81443c8, md=0x0)
>     at ../mh.c:953
> #2  0x0808f967 in mh_read_dir (ctx=0x81443c8, subdir=0x80fde3b "new")
>     at ../mh.c:1039
> #3  0x0808f99e in maildir_read_dir (ctx=0x81443c8) at ../mh.c:1051
> #4  0x0809323c in mx_open_mailbox (path=0xaf86f728
> "/home/daniel/Mail/INBOX",
>     flags=0, pctx=0x0) at ../mx.c:708
> #5  0x080879fe in main (argc=1, argv=0xaf86f914) at ../main.c:966
>
>   The relevant code fragment is:
>
>  ---- snip ----
>   ret = (*h->env->open)(h->env, NULL, DB_INIT_MPOOL | DB_CREATE |
> DB_PRIVATE,
>         0600);
>   if (!ret)
>   {
>     ret = db_create(&h->db, h->env, 0);
>     if (ret)
>     {
>       h->env->close(h->env, 0);
>       mx_unlock_file(h->lockfile, h->fd, 0);
>       close(h->fd);
>       FREE(&h);
>       return NULL;
>     }
>   }
>
>   if (stat(path, &sb) != 0 && errno == ENOENT)
>   {
>     createflags |= DB_EXCL;
>     h->db->set_pagesize(h->db, pagesize);
>   }
>
>   ret = (*h->db->open)(h->db, NULL, path, folder, DB_BTREE, createflags,
> 0600);
>  ----- snip -----
>
>   The last line is the one that crashes.  In that line, h->db is NULL.
> I've traced through the code, and what happens is that the call to
> h->env->open fails (with a non-zero return code).  mutt does not handle
> this case; it simply leaves h->db set to NULL and blithely tries to
> dereference it a few lines later.
>
>   I see two bugs here:
>
>     (1) why should opening the header cache database
> (/home/daniel/.mutt/header_cache) fail when the cwd doesn't exist?  This
> seems rather unintuitive.
>
>     (2) obviously, mutt needs to handle failure of h->env->open more
>         gracefully than crashing.  I suggest the attached patch;
>         it just uses the same unwinding code for both a failure of
>         env->open and db_create.  When I apply it, mutt seems to work
>         fine (maybe it's slower because of not using the header cache,
>         but I haven't particularly noticed that yet).
>
>   Daniel
>
> -- System Information:
> Debian Release: testing/unstable
>   APT prefers unstable
>   APT policy: (500, 'unstable'), (1, 'experimental'), (1, 'unstable')
> Architecture: i386 (i686)
> Shell:  /bin/sh linked to /bin/bash
> Kernel: Linux 2.6.17-2-686
> Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
>
> Versions of packages mutt depends on:
> ii  esmtp-run [mail-transpo 0.5.1-4          User configurable relay-only
> MTA
> ii  libc6                   2.3.6.ds1-4      GNU C Library: Shared
> libraries
> ii  libdb4.4                4.4.20-8         Berkeley v4.4 Database
> Libraries [
> ii  libgnutls13             1.4.2-1          the GNU TLS library -
> runtime libr
> ii  libidn11                0.6.5-1          GNU libidn library,
> implementation
> ii  libncursesw5            5.5-2            Shared libraries for
> terminal hand
> ii  libsasl2                2.1.19.dfsg1-0.2 Authentication abstraction
> library
>
> Versions of packages mutt recommends:
> ii  locales                      2.3.6.ds1-4 GNU C Library: National
> Language (
> ii  mime-support                 3.37-1      MIME files 'mime.types' &
> 'mailcap
>
> -- no debconf information
>
> --- hcache.c    2006-05-18 11:44:29.000000000 -0700
> +++ hcache.c.new        2006-09-04 08:56:55.000000000 -0700
> @@ -966,14 +966,15 @@
>    if (!ret)
>    {
>      ret = db_create(&h->db, h->env, 0);
> -    if (ret)
> -    {
> -      h->env->close(h->env, 0);
> -      mx_unlock_file(h->lockfile, h->fd, 0);
> -      close(h->fd);
> -      FREE(&h);
> -      return NULL;
> -    }
> +  }
> +
> +  if (ret)
> +  {
> +    h->env->close(h->env, 0);
> +    mx_unlock_file(h->lockfile, h->fd, 0);
> +    close(h->fd);
> +    FREE(&h);
> +    return NULL;
>    }
>
>    if (stat(path, &sb) != 0 && errno == ENOENT)
>

> Christoph
> --
> cb@xxxxxxxx | http://www.df7cb.de/
>
> >Fix:
>
> Unknown
> }}}

New description:

 {{{

 Hi,

 the attached patch looks sane to me.

 Christoph

 Reply-To: Daniel Burrows <dburrows@xxxxxxxxxx>, 386003@xxxxxxxxxxxxxxx
 Date: Mon, 04 Sep 2006 08:57:44 -0700
 From: Daniel Burrows <dburrows@xxxxxxxxxx>
 To: Debian Bug Tracking System <submit@xxxxxxxxxxxxxxx>

 Package: mutt
 Version: 1.5.13-1
 Severity: normal
 Tags: patch

   If I create a directory, cd to it, and delete it, then run mutt, I get
 a segfault:

 Reading /home/daniel/Mail/INBOX...Segmentation fault

   Backtrace:
 #0  mutt_hcache_open (
     path=0x810e260 "/home/daniel/.mutt/header_cache/0e22bb19e355e524ac163
 08aeab641c5", folder=0x816f048 "/home/daniel/Mail/INBOX") at
 ../hcache.c:985
 #1  0x0808f640 in maildir_delayed_parsing (ctx=0x81443c8, md=0x0)
     at ../mh.c:953
 #2  0x0808f967 in mh_read_dir (ctx=0x81443c8, subdir=0x80fde3b "new")
     at ../mh.c:1039
 #3  0x0808f99e in maildir_read_dir (ctx=0x81443c8) at ../mh.c:1051
 #4  0x0809323c in mx_open_mailbox (path=0xaf86f728
 "/home/daniel/Mail/INBOX",
     flags=0, pctx=0x0) at ../mx.c:708
 #5  0x080879fe in main (argc=1, argv=0xaf86f914) at ../main.c:966

   The relevant code fragment is:

  ---- snip ----
   ret = (*h->env->open)(h->env, NULL, DB_INIT_MPOOL | DB_CREATE |
 DB_PRIVATE,
         0600);
   if (!ret)
   {
     ret = db_create(&h->db, h->env, 0);
     if (ret)
     {
       h->env->close(h->env, 0);
       mx_unlock_file(h->lockfile, h->fd, 0);
       close(h->fd);
       FREE(&h);
       return NULL;
     }
   }

   if (stat(path, &sb) != 0 && errno == ENOENT)
   {
     createflags |= DB_EXCL;
     h->db->set_pagesize(h->db, pagesize);
   }

   ret = (*h->db->open)(h->db, NULL, path, folder, DB_BTREE, createflags,
 0600);
  ----- snip -----

   The last line is the one that crashes.  In that line, h->db is NULL.
 I've traced through the code, and what happens is that the call to
 h->env->open fails (with a non-zero return code).  mutt does not handle
 this case; it simply leaves h->db set to NULL and blithely tries to
 dereference it a few lines later.

   I see two bugs here:

     (1) why should opening the header cache database
 (/home/daniel/.mutt/header_cache) fail when the cwd doesn't exist?  This
 seems rather unintuitive.

     (2) obviously, mutt needs to handle failure of h->env->open more
         gracefully than crashing.  I suggest the attached patch;
         it just uses the same unwinding code for both a failure of
         env->open and db_create.  When I apply it, mutt seems to work
         fine (maybe it's slower because of not using the header cache,
         but I haven't particularly noticed that yet).

   Daniel

 -- System Information:
 Debian Release: testing/unstable
   APT prefers unstable
   APT policy: (500, 'unstable'), (1, 'experimental'), (1, 'unstable')
 Architecture: i386 (i686)
 Shell:  /bin/sh linked to /bin/bash
 Kernel: Linux 2.6.17-2-686
 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)

 Versions of packages mutt depends on:
 ii  esmtp-run [mail-transpo 0.5.1-4          User configurable relay-only
 MTA
 ii  libc6                   2.3.6.ds1-4      GNU C Library: Shared
 libraries
 ii  libdb4.4                4.4.20-8         Berkeley v4.4 Database
 Libraries [
 ii  libgnutls13             1.4.2-1          the GNU TLS library - runtime
 libr
 ii  libidn11                0.6.5-1          GNU libidn library,
 implementation
 ii  libncursesw5            5.5-2            Shared libraries for terminal
 hand
 ii  libsasl2                2.1.19.dfsg1-0.2 Authentication abstraction
 library

 Versions of packages mutt recommends:
 ii  locales                      2.3.6.ds1-4 GNU C Library: National
 Language (
 ii  mime-support                 3.37-1      MIME files 'mime.types' &
 'mailcap

 -- no debconf information

 --- hcache.c    2006-05-18 11:44:29.000000000 -0700
 +++ hcache.c.new        2006-09-04 08:56:55.000000000 -0700
 @@ -966,14 +966,15 @@
    if (!ret)
    {
      ret = db_create(&h->db, h->env, 0);
 -    if (ret)
 -    {
 -      h->env->close(h->env, 0);
 -      mx_unlock_file(h->lockfile, h->fd, 0);
 -      close(h->fd);
 -      FREE(&h);
 -      return NULL;
 -    }
 +  }
 +
 +  if (ret)
 +  {
 +    h->env->close(h->env, 0);
 +    mx_unlock_file(h->lockfile, h->fd, 0);
 +    close(h->fd);
 +    FREE(&h);
 +    return NULL;
    }

    if (stat(path, &sb) != 0 && errno == ENOENT)


 Christoph
 --
 cb@xxxxxxxx | http://www.df7cb.de/

 >Fix:

 Unknown
 }}}

Comment:

 Patch applied, thanks.

-- 
Ticket URL: <http://dev.mutt.org/trac/ticket/2714#comment:1>