1 /* $NetBSD: cleanup_state.c,v 1.6 2026/05/09 18:49:15 christos Exp $ */ 2 3 /*++ 4 /* NAME 5 /* cleanup_state 3 6 /* SUMMARY 7 /* per-message state variables 8 /* SYNOPSIS 9 /* #include "cleanup.h" 10 /* 11 /* CLEANUP_STATE *cleanup_state_alloc(src) 12 /* VSTREAM *src; 13 /* 14 /* void cleanup_state_free(state) 15 /* CLEANUP_STATE *state; 16 /* DESCRIPTION 17 /* This module maintains about two dozen state variables 18 /* that are used by many routines in the course of processing one 19 /* message. 20 /* 21 /* cleanup_state_alloc() initializes the per-message state variables. 22 /* 23 /* cleanup_state_free() cleans up. 24 /* LICENSE 25 /* .ad 26 /* .fi 27 /* The Secure Mailer license must be distributed with this software. 28 /* AUTHOR(S) 29 /* Wietse Venema 30 /* IBM T.J. Watson Research 31 /* P.O. Box 704 32 /* Yorktown Heights, NY 10598, USA 33 /* 34 /* Wietse Venema 35 /* Google, Inc. 36 /* 111 8th Avenue 37 /* New York, NY 10011, USA 38 /* 39 /* Wietse Venema 40 /* porcupine.org 41 /*--*/ 42 43 /* System library. */ 44 45 #include <sys_defs.h> 46 47 /* Utility library. */ 48 49 #include <mymalloc.h> 50 #include <vstring.h> 51 #include <htable.h> 52 53 /* Global library. */ 54 55 #include <been_here.h> 56 #include <mail_params.h> 57 #include <mime_state.h> 58 #include <mail_proto.h> 59 60 /* Milter library. */ 61 62 #include <milter.h> 63 64 /* Application-specific. */ 65 66 #include "cleanup.h" 67 68 /* cleanup_state_alloc - initialize global state */ 69 70 CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src) 71 { 72 CLEANUP_STATE *state = (CLEANUP_STATE *) mymalloc(sizeof(*state)); 73 74 state->attr_buf = vstring_alloc(10); 75 state->temp1 = vstring_alloc(10); 76 state->temp2 = vstring_alloc(10); 77 state->temp3 = vstring_alloc(10); 78 if (cleanup_strip_chars) 79 state->stripped_buf = vstring_alloc(10); 80 state->src = src; 81 state->dst = 0; 82 state->handle = 0; 83 state->queue_name = 0; 84 state->queue_id = 0; 85 state->arrival_time.tv_sec = state->arrival_time.tv_usec = 0; 86 state->fullname = 0; 87 state->sender = 0; 88 state->recip = 0; 89 state->orig_rcpt = 0; 90 state->return_receipt = 0; 91 state->errors_to = 0; 92 state->auto_hdrs = argv_alloc(1); 93 state->hbc_rcpt = 0; 94 state->flags = 0; 95 state->tflags = 0; 96 state->qmgr_opts = 0; 97 state->errs = 0; 98 state->err_mask = 0; 99 state->headers_seen = 0; 100 state->hop_count = 0; 101 state->resent = ""; 102 state->dups = been_here_init(var_dup_filter_limit, BH_FLAG_FOLD); 103 state->action = cleanup_envelope; 104 state->data_offset = -1; 105 state->body_offset = -1; 106 state->xtra_offset = -1; 107 state->cont_length = 0; 108 state->sender_pt_offset = -1; 109 state->sender_pt_target = -1; 110 state->append_rcpt_pt_offset = -1; 111 state->append_rcpt_pt_target = -1; 112 state->append_hdr_pt_offset = -1; 113 state->append_hdr_pt_target = -1; 114 state->append_meta_pt_offset = -1; 115 state->append_meta_pt_target = -1; 116 state->rcpt_count = 0; 117 state->reason = 0; 118 state->smtp_reply = 0; 119 state->attr = nvtable_create(10); 120 nvtable_update(state->attr, MAIL_ATTR_LOG_ORIGIN, MAIL_ATTR_ORG_LOCAL); 121 state->mime_state = 0; 122 state->mime_errs = 0; 123 state->hdr_rewrite_context = MAIL_ATTR_RWR_LOCAL; 124 state->filter = 0; 125 state->redirect = 0; 126 state->message_id = 0; 127 state->dsn_envid = 0; 128 state->dsn_ret = 0; 129 state->dsn_notify = 0; 130 state->dsn_orcpt = 0; 131 state->verp_delims = 0; 132 state->milters = 0; 133 state->client_name = 0; 134 state->reverse_name = 0; 135 state->client_addr = 0; 136 state->client_af = 0; 137 state->client_port = 0; 138 state->server_addr = 0; 139 state->server_port = 0; 140 state->milter_ext_from = 0; 141 state->milter_ext_rcpt = 0; 142 state->milter_err_text = 0; 143 state->milter_dsn_buf = 0; 144 state->free_regions = state->body_regions = state->curr_body_region = 0; 145 state->sendopts = 0; 146 state->reqtls_esmtp_hdr_seen = 0; 147 return (state); 148 } 149 150 /* cleanup_state_free - destroy global state */ 151 152 void cleanup_state_free(CLEANUP_STATE *state) 153 { 154 vstring_free(state->attr_buf); 155 vstring_free(state->temp1); 156 vstring_free(state->temp2); 157 vstring_free(state->temp3); 158 if (cleanup_strip_chars) 159 vstring_free(state->stripped_buf); 160 if (state->fullname) 161 myfree(state->fullname); 162 if (state->sender) 163 myfree(state->sender); 164 if (state->recip) 165 myfree(state->recip); 166 if (state->orig_rcpt) 167 myfree(state->orig_rcpt); 168 if (state->return_receipt) 169 myfree(state->return_receipt); 170 if (state->errors_to) 171 myfree(state->errors_to); 172 argv_free(state->auto_hdrs); 173 if (state->hbc_rcpt) 174 argv_free(state->hbc_rcpt); 175 if (state->queue_name) 176 myfree(state->queue_name); 177 if (state->queue_id) 178 myfree(state->queue_id); 179 been_here_free(state->dups); 180 if (state->reason) 181 myfree(state->reason); 182 if (state->smtp_reply) 183 myfree(state->smtp_reply); 184 nvtable_free(state->attr); 185 if (state->mime_state) 186 mime_state_free(state->mime_state); 187 if (state->filter) 188 myfree(state->filter); 189 if (state->redirect) 190 myfree(state->redirect); 191 if (state->message_id) 192 myfree(state->message_id); 193 if (state->dsn_envid) 194 myfree(state->dsn_envid); 195 if (state->dsn_orcpt) 196 myfree(state->dsn_orcpt); 197 if (state->verp_delims) 198 myfree(state->verp_delims); 199 if (state->milters) 200 milter_free(state->milters); 201 if (state->milter_ext_from) 202 vstring_free(state->milter_ext_from); 203 if (state->milter_ext_rcpt) 204 vstring_free(state->milter_ext_rcpt); 205 if (state->milter_err_text) 206 vstring_free(state->milter_err_text); 207 if (state->milter_dsn_buf) 208 vstring_free(state->milter_dsn_buf); 209 cleanup_region_done(state); 210 myfree((void *) state); 211 } 212