diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c
index 64abb5b128bff3c4eb2ba13f250fa4c9dfa88da9..8fc66853f0d4674d039d7a91e5a4d1edc7e8db8c 100644
--- a/src/sbbs3/str_util.c
+++ b/src/sbbs3/str_util.c
@@ -534,6 +534,24 @@ size_t strip_invalid_attr(char *str)
 	return(a);
 }
 
+/****************************************************************************/
+/* Detects invalid Ctrl-Ax "attribute" sequences in str                    	*/
+/* Returns number of ^A's in line                                           */
+/****************************************************************************/
+bool contains_invalid_attr(const char *str)
+{
+
+	while(*str != '\0') {
+		if(*str == CTRL_A) {
+			++str;
+			if(!valid_ctrl_a_attr(*str))
+				return true;
+		}
+		++str;
+	}
+	return false;
+}
+
 /****************************************************************************/
 /****************************************************************************/
 char exascii_to_ascii_char(uchar ch)
diff --git a/src/sbbs3/str_util.h b/src/sbbs3/str_util.h
index 12af547ff0388e95658cea0b001b99c54a26a167..2864f809dce04ca088929427c96580d8f14b2623 100644
--- a/src/sbbs3/str_util.h
+++ b/src/sbbs3/str_util.h
@@ -57,6 +57,7 @@ DLLEXPORT char *	strip_char(const char* str, char* dest, char);
 DLLEXPORT bool		valid_ctrl_a_attr(char a);
 DLLEXPORT bool		valid_ctrl_a_code(char a);
 DLLEXPORT size_t	strip_invalid_attr(char *str);
+DLLEXPORT bool		contains_invalid_attr(const char*);
 DLLEXPORT char *	u32toac(uint32_t, char*, char sep);
 DLLEXPORT char *	u64toac(uint64_t, char*, char sep);
 DLLEXPORT char *	rot13(char* str);