[Dovecot] v1.1.beta11 released

Dean Brooks dean at iglou.com
Sun Dec 9 21:38:50 EET 2007


On Sun, Dec 09, 2007 at 08:29:49PM +0200, Timo Sirainen wrote:
> http://dovecot.org/releases/1.1/beta/dovecot-1.1.beta11.tar.gz
> http://dovecot.org/releases/1.1/beta/dovecot-1.1.beta11.tar.gz.sig
> 
> This one should be the last beta release before the first v1.1 release
> candidate.

Looks like the fix to Solaris dirent handling didn't make it into beta11.
Here is a recap of the problem:

This affects anyone under Solaris 8, and probably all other versions
of Solaris as well and breaks many mailbox LIST commands.

In src/lib-storage/list/mailbox-list-fs-iter.c, in the function
fs_list_dir_next(), the following code near the end of the function is
the culprit:

       if (i_strocpy(dir->dirent.d_name, fname,
                    sizeof(dir->dirent.d_name)) < 0) {
                    /* name too large.. shouldn't happen. */
                    continue;
       }

To fix it, I changed it to:

       if (i_strocpy(dir->dirent.d_name, fname, MAXNAMLEN) < 0) {
                    /* name too large.. shouldn't happen. */
                    continue;
       }

It appears that sizeof(dir->dirent.d_name) always returns "1" under
Solaris.  This is a common dirent portability issue that affects a few
operating systems, including Solaris.  I googled around and found
other authors who have done crazy stuff like this:

#ifdef BROKEN_ONE_BYTE_DIRENT_D_NAME
 strcpy(dirent->d_name, filename, MAXPATHLEN);
#else
 strcpy(dirent->d_name, filename, sizeof(dirent->d_name));
#endif

There is probably a cleaner way to deal with this though.  From what I
can tell, this is the only place in Dovecot where a sizeof() is done
on d_name.

Unfortunately, Dovecot beta11 is not usable in a production
environment under Solaris until this issue is resolved.

--
Dean Brooks
dean at iglou.com


More information about the dovecot mailing list