diff --git a/src/session.c b/src/session.c index ef4e27f..f3ebaaf 100644 --- a/src/session.c +++ b/src/session.c @@ -261,13 +261,14 @@ if(cfg->enable_chunking == 1 && strncasecmp(buf, SMTP_CMD_BDAT, strlen(SMTP_CMD_BDAT)) == 0){ + process_command_bdat(sctx, &sdata, data, &protocol_state, buf, &resp[0], sizeof(resp)-1); if(protocol_state == SMTP_STATE_BDAT){ - snprintf(resp, sizeof(resp)-2, "250 octets received\r\n"); for(i=0; ibdat_rounds-1; i++){ - send_buffered_response(&sdata, data, starttls, sctx->new_sd, &resp[0], cfg); + syslog(LOG_INFO, "%d, sending bdat response", i); + write1(sctx->new_sd, "250 octets received\r\n", strlen("250 octets received\r\n"), sdata.tls, data->ssl); } process_written_file(sctx, &sdata, data, cfg); diff --git a/src/smtp.c b/src/smtp.c index c71955f..aff5dbf 100644 --- a/src/smtp.c +++ b/src/smtp.c @@ -138,7 +138,7 @@ int n, expected_bdat_len; char puf[MAXBUFSIZE]; - if(*protocol_state == SMTP_STATE_RCPT_TO){ + if(*protocol_state != SMTP_STATE_RCPT_TO){ strncat(resp, SMTP_RESP_503_ERR, resplen); return; } @@ -166,15 +166,15 @@ else if(sctx->bdat_last_round != 1){ if((n = recvtimeoutssl(sctx->new_sd, &puf[0], sizeof(puf), TIMEOUT, sdata->tls, data->ssl)) > 0){ expected_bdat_len = extract_bdat_command(sctx, sdata, puf); + if(expected_bdat_len <= 0 && sctx->bdat_rounds > 0) sctx->bdat_rounds--; } } if(expected_bdat_len > 0) sdata->tot_len += read_bdat_data(sctx, sdata, data, expected_bdat_len); } - close(sdata->fd); fsync(sdata->fd); - + close(sdata->fd); } @@ -184,7 +184,7 @@ // determine if this is the last BDAT command - p = strstr(buf, " LAST"); + p = strcasestr(buf, " LAST"); if(p){ sctx->bdat_last_round = 1; syslog(LOG_INFO, "%s: BDAT LAST", sdata->ttmpfile); @@ -219,6 +219,8 @@ } } + syslog(LOG_INFO, "%s: wrote %d bytes of BDAT data", sdata->ttmpfile, written_bdat_len); + return written_bdat_len; }