Not just when the last reference is cleared. This is how *_unref()s should
work everywhere in Dovecot. This fixes a bug in lib-imap-client where a
parser could have been accessed after it was already freed.
parser->refcount++;
}
-void imap_parser_unref(struct imap_parser **parser)
+void imap_parser_unref(struct imap_parser **_parser)
{
- i_assert((*parser)->refcount > 0);
+ struct imap_parser *parser = *_parser;
- if (--(*parser)->refcount > 0)
+ *_parser = NULL;
+
+ i_assert(parser->refcount > 0);
+ if (--parser->refcount > 0)
return;
- pool_unref(&(*parser)->pool);
- i_free(*parser);
- *parser = NULL;
+ pool_unref(&parser->pool);
+ i_free(parser);
}
void imap_parser_reset(struct imap_parser *parser)