static int parse_part_finish(struct message_parser_ctx *ctx, struct message_boundary *boundary, struct message_block *block_r, bool first_line) { struct message_part *part; size_t line_size; i_assert(ctx->last_boundary == NULL); /* get back to parent MIME part, summing the child MIME part sizes into parent's body sizes */ for (part = ctx->part; part != boundary->part; part = part->parent) { message_size_add(&part->parent->body_size, &part->body_size); message_size_add(&part->parent->body_size, &part->header_size); } i_assert(part != NULL); ctx->part = part; if (boundary->epilogue_found) { /* this boundary isn't needed anymore */ ctx->boundaries = boundary->next; } else { /* forget about the boundaries we possibly skipped */ ctx->boundaries = boundary; } /* the boundary itself should already be in buffer. add that. */ block_r->data = i_stream_get_data(ctx->input, &block_r->size); i_assert(block_r->size >= ctx->skip); block_r->data += ctx->skip; /* [[\r]\n]--<boundary>[--] */ if (first_line) line_size = 0; else if (block_r->data[0] == '\r') { i_assert(block_r->data[1] == '\n'); line_size = 2; } else { i_assert(block_r->data[0] == '\n'); line_size = 1; } line_size += 2 + boundary->len + (boundary->epilogue_found ? 2 : 0); i_assert(block_r->size >= ctx->skip + line_size); block_r->size = line_size; parse_body_add_block(ctx, block_r); ctx->parse_next_block = parse_next_body_skip_boundary_line; if ((ctx->flags & MESSAGE_PARSER_FLAG_INCLUDE_BOUNDARIES) != 0) return 1; return ctx->parse_next_block(ctx, block_r); }
static int parse_part_finish(struct message_parser_ctx *ctx, struct message_boundary *boundary, struct message_block *block_r, bool first_line) { struct message_part *part; /* get back to parent MIME part, summing the child MIME part sizes into parent's body sizes */ for (part = ctx->part; part != boundary->part; part = part->parent) { message_size_add(&part->parent->body_size, &part->body_size); message_size_add(&part->parent->body_size, &part->header_size); } ctx->part = part; if (boundary->epilogue_found) { /* this boundary isn't needed anymore */ ctx->boundaries = boundary->next; if (ctx->boundaries != NULL) ctx->parse_next_block = parse_next_body_to_boundary; else ctx->parse_next_block = parse_next_body_to_eof; return ctx->parse_next_block(ctx, block_r); } /* forget about the boundaries we possibly skipped */ ctx->boundaries = boundary; /* the boundary itself should already be in buffer. add that. */ block_r->data = i_stream_get_data(ctx->input, &block_r->size); i_assert(block_r->size >= ctx->skip + 2 + boundary->len + (first_line ? 0 : 1)); block_r->data += ctx->skip; /* [\n]--<boundary> */ block_r->size = (first_line ? 0 : 1) + 2 + boundary->len; parse_body_add_block(ctx, block_r); ctx->parse_next_block = parse_next_body_skip_boundary_line; return 1; }