This replaces setting mail_stream_accessed directly.
uint32_t prev_file_id = 0, map_uid = 0;
bool deleted;
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
do {
if (mail->open_file != NULL) {
bool deleted;
int ret;
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
ret = sdbox_mail_file_set(mail);
if (ret < 0)
i_assert(headers == NULL ||
IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_FETCH_HEADERS));
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
/* drop any fields that we may already be fetching currently */
fields &= ENUM_NEGATE(mail->fetching_fields);
}
mail->header_fetched = TRUE;
mail->body_fetched = TRUE;
+ /* The stream was already accessed and now it's cached.
+ It still needs to be set accessed to avoid assert-crash. */
+ mail->imail.mail.mail.mail_stream_accessed = TRUE;
imapc_mail_init_stream(mail);
}
imail->data.stream = i_stream_create_fd_autoclose(&ctx->fd, 0);
imapc_mail->header_fetched = TRUE;
imapc_mail->body_fetched = TRUE;
+ /* The saved stream wasn't actually read, but it needs to be
+ set accessed to avoid assert-crash. */
+ _mail->mail_stream_accessed = TRUE;
imapc_mail_init_stream(imapc_mail);
}
bool has_nuls, body_size_from_stream = FALSE;
int ret;
- _mail->mail_stream_accessed = TRUE;
+ i_assert(_mail->mail_stream_accessed);
if (!data->initialized_wrapper_stream &&
_mail->transaction->stats_track) {
*deleted_r = FALSE;
- if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(mail);
+ if (!mail_stream_access_start(mail))
return NULL;
- }
- mail->mail_stream_accessed = TRUE;
ctx.fd = -1;
ctx.path = NULL;
if (_mail->expunged || mbox->syncing)
return -1;
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
if (mbox->mbox_stream != NULL &&
istream_raw_mbox_is_corrupted(mbox->mbox_stream)) {
const char *cmd;
if (pmail->imail.data.access_part != 0 &&
- pmail->imail.data.stream == NULL) {
- _mail->mail_stream_accessed = TRUE;
+ pmail->imail.data.stream == NULL &&
+ mail_stream_access_start(_mail)) {
capa = pop3c_client_get_capabilities(mbox->client);
pmail->prefetching_body = (capa & POP3C_CAPABILITY_TOP) == 0 ||
(pmail->imail.data.access_part & (READ_BODY | PARSE_BODY)) != 0;
}
if (mail->data.stream == NULL) {
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
capa = pop3c_client_get_capabilities(mbox->client);
if (get_body || (capa & POP3C_CAPABILITY_TOP) == 0) {
cmd = t_strdup_printf("RETR %u\r\n", _mail->seq);
struct index_mail *mail = INDEX_MAIL(_mail);
if (mail->data.stream == NULL) {
- if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
- mail_set_aborted(_mail);
+ if (!mail_stream_access_start(_mail))
return -1;
- }
- _mail->mail_stream_accessed = TRUE;
/* we can't just reference mbox->input, because
index_mail_close() expects to be able to free the stream */
mail->data.stream =
and 1 if attachment was found. */
int mail_set_attachment_keywords(struct mail *mail);
+/* Attempt to start accessing the mail stream. Returns TRUE is ok, FALSE if
+ prevented by mail->lookup_abort. */
+bool mail_stream_access_start(struct mail *mail);
/* Emit mail opened events */
void mail_opened_event(struct mail *mail);
return ret;
}
+bool mail_stream_access_start(struct mail *mail)
+{
+ if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
+ mail_set_aborted(mail);
+ return FALSE;
+ }
+ mail->mail_stream_accessed = TRUE;
+ return TRUE;
+}
+
void mail_opened_event(struct mail *mail)
{
struct mail_private *pmail =