diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index 871444c55d298e71096a32c5466bc4730660ed6b..c83ae60690a07d9d15ecb29438fd94d739351c25 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -795,7 +795,7 @@ static JSBool js_get_msg_header_resolve(JSContext *cx, JSObject *obj, jsval id)
 				memset(&remsg,0,sizeof(remsg));
 				remsg.hdr.number=(p->msg).hdr.thread_back;
 				if(smb_getmsgidx(&(p->p->smb), &remsg))
-					sprintf(reply_id,"<%s>",p->p->smb.last_error);
+					SAFEPRINTF(reply_id,"<%s>",p->p->smb.last_error);
 				else
 					get_msgid(scfg,p->p->smb.subnum,&remsg,reply_id,sizeof(reply_id));
 				JS_RESUMEREQUEST(cx, rc);
@@ -1122,7 +1122,7 @@ js_put_msg_header(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 
 		JS_RESUMEREQUEST(cx, rc);
 		if(!parse_header_object(cx, p, hdr, &msg, TRUE)) {
-			sprintf(p->smb.last_error,"Header parsing failure (required field missing?)");
+			SAFECOPY(p->smb.last_error,"Header parsing failure (required field missing?)");
 			break;
 		}
 		rc=JS_SUSPENDREQUEST(cx);
@@ -1490,41 +1490,43 @@ js_save_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 		if(body[0])
 			truncsp(body);
-		if(savemsg(scfg, &(p->smb), &msg, client, body)==0)
+		if((p->status=savemsg(scfg, &(p->smb), &msg, client, body))==SMB_SUCCESS) {
 			*rval = JSVAL_TRUE;
 
-		if(rcpt_list!=NULL) {	/* Sending to a list of recipients */
+			if(rcpt_list!=NULL) {	/* Sending to a list of recipients */
 
-			*rval = JSVAL_FALSE;	/* failure, by default */
+				*rval = JSVAL_FALSE;	/* failure, by default */
+				SAFECOPY(p->smb.last_error,"Recipient list parsing failure");
 
-			memset(&rcpt_msg, 0, sizeof(rcpt_msg));
+				memset(&rcpt_msg, 0, sizeof(rcpt_msg));
 
-			for(i=0;i<rcpt_list_length;i++) {
+				for(i=0;i<rcpt_list_length;i++) {
 
-				if(!JS_GetElement(cx, rcpt_list, i, &val))
-					break;
-				
-				if(!JSVAL_IS_OBJECT(val))
-					break;
+					if(!JS_GetElement(cx, rcpt_list, i, &val))
+						break;
+					
+					if(!JSVAL_IS_OBJECT(val))
+						break;
 
-				if((p->status=smb_copymsgmem(&(p->smb), &rcpt_msg, &msg))!=SMB_SUCCESS)
-					break;
+					if((p->status=smb_copymsgmem(&(p->smb), &rcpt_msg, &msg))!=SMB_SUCCESS)
+						break;
 
-				if(!parse_recipient_object(cx, p, JSVAL_TO_OBJECT(val), &rcpt_msg))
-					break;
+					if(!parse_recipient_object(cx, p, JSVAL_TO_OBJECT(val), &rcpt_msg))
+						break;
 
-				if((p->status=smb_addmsghdr(&(p->smb), &rcpt_msg, SMB_SELFPACK))!=SMB_SUCCESS)
-					break;
+					if((p->status=smb_addmsghdr(&(p->smb), &rcpt_msg, SMB_SELFPACK))!=SMB_SUCCESS)
+						break;
 
-				smb_freemsgmem(&rcpt_msg);
-			}
-			smb_freemsgmem(&rcpt_msg);	/* just in case we broke the loop */
+					smb_freemsgmem(&rcpt_msg);
+				}
+				smb_freemsgmem(&rcpt_msg);	/* just in case we broke the loop */
 
-			if(i==rcpt_list_length)
-				*rval = JSVAL_TRUE;	/* success */
+				if(i==rcpt_list_length)
+					*rval = JSVAL_TRUE;	/* success */
+			}
 		}
 	} else
-		sprintf(p->smb.last_error,"Header parsing failure (required field missing?)");
+		SAFECOPY(p->smb.last_error,"Header parsing failure (required field missing?)");
 
 	smb_freemsgmem(&msg);