From 51c710a1eefb153035d1121b7b70fb3dc934b145 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Fri, 4 Jun 2004 19:16:01 +0000 Subject: [PATCH] Using SAFEPRINTF() and safe_snprintf() to avoid potential buffer overflows. --- src/sbbs3/mailsrvr.c | 55 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index a5f5a00340..e913961434 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -707,7 +707,7 @@ static void pop3_thread(void* arg) client.user="<unknown>"; client_on(socket,&client,FALSE /* update */); - sprintf(str,"POP3: %s", host_ip); + SAFEPRINTF(str,"POP3: %s", host_ip); status(str); mail=NULL; @@ -720,7 +720,7 @@ static void pop3_thread(void* arg) srand(time(NULL)); /* seed random number generator */ rand(); /* throw-away first result */ - sprintf(challenge,"<%x%x%lx%lx@%.128s>" + safe_snprintf(challenge,sizeof(challenge),"<%x%x%lx%lx@%.128s>" ,rand(),socket,(ulong)time(NULL),clock(),startup->host_name); sockprintf(socket,"+OK Synchronet POP3 Server %s-%s Ready %s" @@ -818,7 +818,7 @@ static void pop3_thread(void* arg) if(startup->options&MAIL_OPT_DEBUG_POP3) lprintf(LOG_INFO,"%04d POP3 %s logged in %s", socket, user.alias, apop ? "via APOP":""); - sprintf(str,"POP3: %s",user.alias); + SAFEPRINTF(str,"POP3: %s",user.alias); status(str); sprintf(smb.file,"%smail",scfg.data_dir); @@ -1003,7 +1003,7 @@ static void pop3_thread(void* arg) } activity=TRUE; if(!strnicmp(buf, "RETR ",5) || !strnicmp(buf,"TOP ",4)) { - sprintf(str,"POP3: %s", user.alias); + SAFEPRINTF(str,"POP3: %s", user.alias); status(str); lines=-1; @@ -1187,7 +1187,7 @@ static ulong rblchk(SOCKET sock, DWORD mail_addr_n, const char* rbl_addr) struct in_addr dnsbl_result; mail_addr=ntohl(mail_addr_n); - sprintf(name,"%ld.%ld.%ld.%ld.%.128s" + safe_snprintf(name,sizeof(name),"%ld.%ld.%ld.%ld.%.128s" ,mail_addr&0xff ,(mail_addr>>8)&0xff ,(mail_addr>>16)&0xff @@ -1944,7 +1944,7 @@ static void smtp_thread(void* arg) lprintf(LOG_WARNING,"%04d !SMTP BLACKLISTED SERVER on %s: %s [%s] = %s" ,socket, dnsbl, host_name, dnsbl_ip, inet_ntoa(dnsbl_result)); if(startup->options&MAIL_OPT_DNSBL_REFUSE) { - sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); + SAFEPRINTF2(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); spamlog(&scfg, "SMTP", "SESSION REFUSED", str, host_name, dnsbl_ip, NULL, NULL); sockprintf(socket ,"550 Mail from %s refused due to listing at %s" @@ -1973,9 +1973,9 @@ static void smtp_thread(void* arg) srand(time(NULL)); /* seed random number generator */ rand(); /* throw-away first result */ - sprintf(session_id,"%x%x%lx",socket,rand(),clock()); + SAFEPRINTF3(session_id,"%x%x%lx",socket,rand(),clock()); - sprintf(rcptlst_fname,"%sSMTP.%s.lst", scfg.data_dir, session_id); + SAFEPRINTF2(rcptlst_fname,"%sSMTP.%s.lst", scfg.data_dir, session_id); rcptlst=fopen(rcptlst_fname,"w+"); if(rcptlst==NULL) { lprintf(LOG_ERR,"%04d !SMTP ERROR %d creating recipient list: %s" @@ -2004,7 +2004,7 @@ static void smtp_thread(void* arg) client.user="<unknown>"; client_on(socket,&client,FALSE /* update */); - sprintf(str,"SMTP: %s",host_ip); + SAFEPRINTF(str,"SMTP: %s",host_ip); status(str); sockprintf(socket,"220 %s Synchronet SMTP Server %s-%s Ready" @@ -2049,10 +2049,10 @@ static void smtp_thread(void* arg) p=strchr(sender_addr,'@'); if(p==NULL || resolve_ip(p+1)!=smtp.client_addr.sin_addr.s_addr) /* Append real IP and hostname if different */ - sprintf(str,"%s%s\r\n\1w[\1n%s\1h] (\1n%s\1h)%s" + safe_snprintf(str,sizeof(str),"%s%s\r\n\1w[\1n%s\1h] (\1n%s\1h)%s" ,head,sender_addr,host_ip,host_name,tail); else - sprintf(str,"%s%s%s",head,sender_addr,tail); + safe_snprintf(str,sizeof(str),"%s%s%s",head,sender_addr,tail); if((telegram_buf=(char*)malloc(length+strlen(str)+1))==NULL) { lprintf(LOG_CRIT,"%04d !SMTP ERROR allocating %lu bytes of memory for telegram from %s" @@ -2101,7 +2101,7 @@ static void smtp_thread(void* arg) msg_handled=FALSE; if(startup->proc_cfg_file[0] && (proc_cfg=fopen(startup->proc_cfg_file,"r"))!=NULL) { - sprintf(proc_err_fname,"%sSMTP.%s.err", scfg.data_dir, session_id); + SAFEPRINTF2(proc_err_fname,"%sSMTP.%s.err", scfg.data_dir, session_id); remove(proc_err_fname); while(!feof(proc_cfg)) { @@ -2206,7 +2206,7 @@ static void smtp_thread(void* arg) SKIP_WHITESPACE(p); if(relay_user.number==0 && dnsbl_result.s_addr && startup->dnsbl_tag[0] && !(startup->options&MAIL_OPT_DNSBL_IGNORE)) { - sprintf(str,"%.*s: %.*s" + safe_snprintf(str,sizeof(str),"%.*s: %.*s" ,(int)sizeof(str)/2, startup->dnsbl_tag ,(int)sizeof(str)/2, p); p=str; @@ -2272,7 +2272,7 @@ static void smtp_thread(void* arg) if(startup->options&MAIL_OPT_DNSBL_IGNORE) { lprintf(LOG_WARNING,"%04d !SMTP IGNORED MAIL from blacklisted server" ,socket); - sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); + SAFEPRINTF2(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); spamlog(&scfg, "SMTP", "IGNORED" ,str, host_name, dnsbl_ip, rcpt_addr, reverse_path); /* pretend we received it */ @@ -2281,7 +2281,7 @@ static void smtp_thread(void* arg) } /* tag message as spam */ if(startup->dnsbl_hdr[0]) { - sprintf(str,"%s: %s is listed on %s as %s" + safe_snprintf(str,sizeof(str),"%s: %s is listed on %s as %s" ,startup->dnsbl_hdr, dnsbl_ip ,dnsbl, inet_ntoa(dnsbl_result)); smb_hfield_str(&msg, RFC822HEADER, str); @@ -2289,7 +2289,7 @@ static void smtp_thread(void* arg) ,socket, startup->dnsbl_hdr); } if(startup->dnsbl_hdr[0] || startup->dnsbl_tag[0]) { - sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); + SAFEPRINTF2(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); spamlog(&scfg, "SMTP", "TAGGED", str, host_name, dnsbl_ip, rcpt_addr, reverse_path); } } @@ -2444,7 +2444,8 @@ static void smtp_thread(void* arg) lprintf(LOG_INFO,"%04d SMTP Created message #%ld from %s to %s <%s>" ,socket, newmsg.hdr.number, sender, rcpt_name, rcpt_addr); if(!(startup->options&MAIL_OPT_NO_NOTIFY) && usernum) { - sprintf(str,"\7\1n\1hOn %.24s\r\n\1m%s \1n\1msent you e-mail from: " + safe_snprintf(str,sizeof(str) + ,"\7\1n\1hOn %.24s\r\n\1m%s \1n\1msent you e-mail from: " "\1h%s\1n\r\n" ,timestr(&scfg,(time_t*)&newmsg.hdr.when_imported.time,tmp) ,sender,sender_addr); @@ -2617,7 +2618,7 @@ static void smtp_thread(void* arg) continue; } if(!stricmp(buf,"AUTH CRAM-MD5")) { - sprintf(challenge,"<%x%x%lx%lx@%s>" + safe_snprintf(challenge,sizeof(challenge),"<%x%x%lx%lx@%s>" ,rand(),socket,(ulong)time(NULL),clock(),startup->host_name); #if 0 lprintf(LOG_DEBUG,"%04d SMTP CRAM-MD5 challenge: %s" @@ -2851,7 +2852,7 @@ static void smtp_thread(void* arg) /* Check for SPAM bait recipient */ if(findstr(rcpt_addr,spam_bait)) { - sprintf(str,"SPAM BAIT (%s) taken", rcpt_addr); + SAFEPRINTF(str,"SPAM BAIT (%s) taken", rcpt_addr); lprintf(LOG_WARNING,"%04d !SMTP %s by: %s" ,socket, str, reverse_path); strcpy(tmp,"REFUSED"); @@ -2878,7 +2879,7 @@ static void smtp_thread(void* arg) if(relay_user.number==0 && dnsbl_result.s_addr && startup->options&MAIL_OPT_DNSBL_BADUSER) { lprintf(LOG_WARNING,"%04d !SMTP REFUSED MAIL from blacklisted server" ,socket); - sprintf(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); + SAFEPRINTF2(str,"Listed on %s as %s", dnsbl, inet_ntoa(dnsbl_result)); spamlog(&scfg, "SMTP", "REFUSED", str, host_name, host_ip, rcpt_addr, reverse_path); sockprintf(socket ,"550 Mail from %s refused due to listing at %s" @@ -2928,7 +2929,7 @@ static void smtp_thread(void* arg) !findstr(host_ip,relay_list)) { lprintf(LOG_WARNING,"%04d !SMTP ILLEGAL RELAY ATTEMPT from %s [%s] to %s" ,socket, reverse_path, host_ip, p); - sprintf(tmp,"Relay attempt to: %s", p); + SAFEPRINTF(tmp,"Relay attempt to: %s", p); spamlog(&scfg, "SMTP", "REFUSED", tmp, host_name, host_ip, rcpt_addr, reverse_path); if(startup->options&MAIL_OPT_ALLOW_RELAY) sockprintf(socket, "553 Relaying through this server " @@ -3138,7 +3139,7 @@ static void smtp_thread(void* arg) if(!(startup->options&MAIL_OPT_DEBUG_RX_BODY)) unlink(msgtxt_fname); } - sprintf(msgtxt_fname,"%sSMTP.%s.msg", scfg.data_dir, session_id); + SAFEPRINTF2(msgtxt_fname,"%sSMTP.%s.msg", scfg.data_dir, session_id); if((msgtxt=fopen(msgtxt_fname,"w+b"))==NULL) { lprintf(LOG_ERR,"%04d !SMTP ERROR %d opening %s" ,socket, errno, msgtxt_fname); @@ -3289,7 +3290,7 @@ BOOL bounce(smb_t* smb, smbmsg_t* msg, char* err, BOOL immediate) sprintf(attempts,"after %u attempts", msg->hdr.delivery_attempts); else attempts[0]=0; - sprintf(str,"%s reporting delivery failure of message %s" + SAFEPRINTF2(str,"%s reporting delivery failure of message %s" ,startup->host_name, attempts); smb_hfield_str(&newmsg, SMB_COMMENT, str); SAFEPRINTF2(str,"from %s to %s\r\n" @@ -3516,7 +3517,7 @@ static void sendmail_thread(void* arg) if(p==NULL) { remove_msg_intransit(&smb,&msg); lprintf(LOG_WARNING,"0000 !SEND INVALID destination address: %s", to); - sprintf(err,"Invalid destination address: %s", to); + SAFEPRINTF(err,"Invalid destination address: %s", to); bounce(&smb,&msg,err,TRUE); continue; } @@ -3534,7 +3535,7 @@ static void sendmail_thread(void* arg) remove_msg_intransit(&smb,&msg); lprintf(LOG_WARNING,"0000 !SEND ERROR %d obtaining MX records for %s from %s" ,i,p,startup->dns_server); - sprintf(err,"Error %d obtaining MX record for %s",i,p); + SAFEPRINTF2(err,"Error %d obtaining MX record for %s",i,p); bounce(&smb,&msg,err,FALSE); continue; } @@ -3577,7 +3578,7 @@ static void sendmail_thread(void* arg) lprintf(LOG_DEBUG,"%04d SEND resolving SMTP hostname: %s", sock, server); ip_addr=resolve_ip(server); if(ip_addr==INADDR_NONE) { - sprintf(err,"Failed to resolve SMTP hostname: %s",server); + SAFEPRINTF(err,"Failed to resolve SMTP hostname: %s",server); continue; } @@ -3595,7 +3596,7 @@ static void sendmail_thread(void* arg) lprintf(LOG_WARNING,"%04d !SEND ERROR %d connecting to SMTP server: %s" ,sock ,i, server); - sprintf(err,"Error %d connecting to SMTP server: %s" + SAFEPRINTF2(err,"Error %d connecting to SMTP server: %s" ,i, server); continue; } -- GitLab