We can't just treat i_stream_get_size() returning 0 as the reason being
istream is async and not fully read. It might be, but it might also be
because of other reasons. And since we're closing the istream we couldn't
even properly finish up the async handling. So for now just return an
error if we see this happening.
Timo Sirainen [Sat, 30 Apr 2016 10:49:06 +0000 (13:49 +0300)]
global: Replace buffer_get_used_size(buf) with buf->used
Doesn't make any diffence to code generation, but it's somewhat simpler code.
It's also more consistent since most of the code nowadays uses the ->used.
This probably doesn't affect the results much, since the stream_errno is set
anyway. But it's better to abort early, just in case the broken state might
end up asserting later.
Timo Sirainen [Tue, 3 May 2016 12:27:22 +0000 (15:27 +0300)]
lib-storage: Fixed potential crash in mailbox_sync_deinit() error handling
If mailbox_sync*() was called before mailbox was opened, the automatic
mailbox opening could fail. mailbox_sync_deinit() would still try to access
box->view, which would be NULL.
Timo Sirainen [Mon, 2 May 2016 21:25:43 +0000 (00:25 +0300)]
lib-storage: Another fix to mail storage initialization.
Allow mail_namespaces_init_location() to add the namespace directly to user,
since that's what the current callers always want. But compared to the
original code we're now calling mail_namespaces_init_finish() rather than
doing the same things ourself.
Timo Sirainen [Mon, 2 May 2016 14:00:22 +0000 (17:00 +0300)]
lib-storage: Changed mail storage initialization.
Most importantly require mail_namespaces_init_finish() after
mail_storage_create(). This was needed so that
mail_namespaces_created/added hook would always have the ns->list set, which
is required for several of the hooks to work (e.g. mailbox list index)
Timo Sirainen [Mon, 2 May 2016 12:20:18 +0000 (15:20 +0300)]
lib-ldap: Added initial connection pooling code.
This is mainly about allowing multiple dict-ldaps to use the same
ldap-connection. In future we could support load balancing with multiple
concurrent LDAP connections.
Timo Sirainen [Mon, 2 May 2016 11:21:06 +0000 (14:21 +0300)]
dict-ldap: Don't reuse dict for different usernames.
Fixes doing priv/* lookups for multiple usernames.
This currently also means that each username will create a separate LDAP
connection, which isn't ideal. But this is probably better fixed in
lib-ldap code similar to how lib-sql does connection pooling.
Timo Sirainen [Sat, 30 Apr 2016 11:55:14 +0000 (14:55 +0300)]
lib-storage: Clear list error before mailbox_list_get_hierarchy_sep()
With ACL plugin enabled the call could have triggered dovecot-acl-list
rebuild, which in turn could have set list errors if it didn't have
permissions to all the mailboxes. This caused IMAP logins to fail.
Timo Sirainen [Sat, 30 Apr 2016 11:19:02 +0000 (14:19 +0300)]
lib-mail: message-parser assert-crashfix
Crashes when multipart MIME header is missing end-of-headers line and the
boundary begins with the same prefix as one of the parent boundaries.
Broken by 7a12331c6
lib-storage: write subscription file in version 2 format
Write subscriptions file in a format that only v2.2.17 or newer can read, so
after dovecot converts the files to the new format, downgrading to a version
older than v2.2.17 is not supported.
Timo Sirainen [Thu, 28 Apr 2016 19:33:14 +0000 (22:33 +0300)]
lib: Set timestamp part more accurately in guid_128_generate()
Previously a long-running process would keep the timestamp close to its
original start time. This doesn't really matter as long as GUIDs are treated
opaque, but some pieces of code prefer to try to use the timestamp fields
since they're already there. This makes such code work more nicely.
Timo Sirainen [Fri, 29 Apr 2016 16:25:52 +0000 (19:25 +0300)]
quota: Added quota_over_flag_lazy_check flag.
By default the quota_over_flag is checked immediately at startup. With this
option the check is done only at a time when the quota is anyway being read.
Timo Sirainen [Fri, 29 Apr 2016 12:50:06 +0000 (15:50 +0300)]
global: Use buffer_get_writable_size() where possible
With 09539f3db increasing buffer's init_size with +1 some fts-icu unit tests
started failing. And in general it's better to use the writable size since
that provides the true size that can be used.
Timo Sirainen [Fri, 29 Apr 2016 12:42:48 +0000 (15:42 +0300)]
quota: Optimize handling a large number of expunges.
This assumes that the mail_expunge() was called in the same order as
sync_notify(), which practically means that they were both done in
ascending uid order. This is usually true.
Timo Sirainen [Fri, 29 Apr 2016 11:07:05 +0000 (14:07 +0300)]
lib-index: Use a bit larger initial records buffer size
For example with a mailbox having 160k messages the buffer size is around
10MB. Adding just 1% more space to it allows a lot more appends before the
buffer needs to be realloced. This reduces CPU usage quite a lot.
Timo Sirainen [Fri, 29 Apr 2016 09:55:52 +0000 (12:55 +0300)]
lib: Use p_malloc() explicitly in first buffer_alloc()
Although there is now code in p_realloc() that it should be just as
efficient, this makes profiling somewhat nicer since it can better
distinguish between actual reallocs and initial allocs.