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; }