[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Exim4 problems



On Tue, 2011-05-17 at 00:13 +0200, Thomas Schwinge wrote:

> > Additionally: No breakpoints are possible to set. Looks like they are
> > not honoured due to the memory address problems above.
> 
> Strange.

Same problem with a working version: -O0 
No breakpoints possible!

Starting program: exim4-4.76/build-tree/build-exim4-daemon-heavy/exim -C
exim4-4.76/test/eximtest/exim4.conf -bV
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
[New Thread 13686.10]
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171
Cannot access memory at address 0x6e696171

Starting program: exim4-4.76/build-tree/build-exim4-daemon-light/exim -C
exim4-4.76/test/eximtest/exim4.conf -bV
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
[New Thread 13687.15]
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404
Cannot access memory at address 0x656f6404

Exim version 4.76 #1 built 17-May-2011 00:07:52
...

2011-05-17 00:30:26 exim user lost privilege for using -C option
Configuration file  is exim4-4.76/test/eximtest/exim4.conf

Program exited normally
> 
> > We also see from the BT that the arguments to rda_extract are completely
> > wrong: 
> > 
> > sieve_enotify_mailto_owner=0xffffffff <Address 0xffffffff out of bounds>
> > probably also: eblockp=0xffffffff
> 
> These look like (int) -1 displayed as 32-bit hex, or casted to (unsigned
> int), or to a pointer.  This may be what the author intended to do, or it
> may be wrong -- I can't tell yet.
> 
> 
> > static int rda_exists(uschar *filename, uschar **error)
> 
> Please continue here: what is this function doing?  (You didn't past that
> one.)  Does it make sense what it is doing if filename == NULL -- if
> we're assuming that is a valid thing to happen?  (Which I can't tell
> either, but it may be valid.)

Below is the description:

/*************************************************
*         Check for existence of file            *
*************************************************/

/* First of all, we stat the file. If this fails, we try to stat the
enclosing directory, because a file in an unmounted NFS directory will
look the same as a non-existent file. It seems that in Solaris 2.6,
statting an entry in an indirect map that is currently unmounted does
not cause the mount to happen. Instead, dummy data is returned, which
defeats the whole point of this test. However, if a stat() is done on
some object inside the directory, such as the "." back reference to
itself, then the mount does occur. If an NFS host is taken offline, it
is possible for the stat() to get stuck until it comes back. To guard
against this, stick a timer round it. If we can't access the "." inside
the directory, try the plain directory, just in case that helps.

Argument:
  filename   the file name
  error      for message on error

Returns:     FILE_EXIST          the file exists
             FILE_NOT_EXIST      the file does not exist
             FILE_EXIST_UNCLEAR  cannot determine existence
*/
static int
rda_exists(uschar *filename, uschar **error)
{
int rc, saved_errno;
uschar *slash;
struct stat statbuf;

if ((rc = Ustat(filename, &statbuf)) >= 0) return FILE_EXIST;
saved_errno = errno;

Ustrncpy(big_buffer, filename, big_buffer_size - 3);
sigalrm_seen = FALSE;

if (saved_errno == ENOENT)
  {
  slash = Ustrrchr(big_buffer, '/');
  Ustrcpy(slash+1, ".");

  alarm(30);
  rc = Ustat(big_buffer, &statbuf);
  if (rc != 0 && errno == EACCES && !sigalrm_seen)
    {
    {
    *slash = 0;
    rc = Ustat(big_buffer, &statbuf);
    }
  saved_errno = errno;
  alarm(0);

  DEBUG(D_route) debug_printf("stat(%s)=%d\n", big_buffer, rc);
  }

if (sigalrm_seen || rc != 0)
  {
  *error = string_sprintf("failed to stat %s (%s)", big_buffer,
    sigalrm_seen? "timeout" : strerror(saved_errno));
  return FILE_EXIST_UNCLEAR;
  }

*error = string_sprintf("%s does not exist", filename);
DEBUG(D_route) debug_printf("%s\n", *error);
return FILE_NOT_EXIST;
}





Reply to: