]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Add control character detection
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 14 Jul 2011 22:07:47 +0000 (15:07 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 14 Jul 2011 23:25:28 +0000 (16:25 -0700)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/common/utf8.c
src/common/utf8.h
src/test/utf8.cc

index 11957b3143564f3a9131845a2b0c37ea29c91b6d..f6a1b07b5956f4a2d840a8095624460e198e62c4 100644 (file)
@@ -164,3 +164,20 @@ int check_utf8_cstr(const char *buf)
 {
        return check_utf8(buf, strlen(buf));
 }
+
+int check_for_control_characters(const char *buf, int len)
+{
+       int i;
+       for (i = 0; i < len; ++i) {
+               unsigned char c = (unsigned char)buf[i];
+               if (((c != 0U) && (c < 0x20U)) || (c == 0x7fU)) {
+                       return i + 1;
+               }
+       }
+       return 0;
+}
+
+int check_for_control_characters_cstr(const char *buf)
+{
+       return check_for_control_characters(buf, strlen(buf));
+}
index e1c891cef59269895a495551b79dd3d89832cd54..e2b25b94c33d3d68769b2d0adecc4bd4f5f109ce 100644 (file)
@@ -31,6 +31,15 @@ int check_utf8(const char *buf, int len);
  */
 int check_utf8_cstr(const char *buf);
 
+/* Checks if a buffer contains control characters.
+ * We do count newline as a control character, but not NULL.
+ */
+int check_for_control_characters(const char *buf, int len);
+
+/* Checks if a null-terminated string contains control characters.
+ */
+int check_for_control_characters_cstr(const char *buf);
+
 #ifdef __cplusplus
 }
 #endif
index 7c1a4de24eb64d2a4c9fac715ca07f0bc8f295c0..8e22e524ec17f89f9143961bd78f3c96f57b0a9a 100644 (file)
@@ -47,3 +47,20 @@ TEST(IsValidUtf8, InvalidUtf8) {
   uint8_t invalid2[] = { 0xc3, 0x28 };
   ASSERT_NE(0, check_utf8((char*)invalid2, sizeof(invalid2)));
 }
+
+TEST(HasControlChars, HasControlChars1) {
+  uint8_t has_control_chars[] = { 0x41, 0x01, 0x00 };
+  ASSERT_NE(0, check_for_control_characters_cstr((const char*)has_control_chars));
+  uint8_t has_control_chars2[] = { 0x7f, 0x41, 0x00 };
+  ASSERT_NE(0, check_for_control_characters_cstr((const char*)has_control_chars2));
+
+  char has_newline[] = "blah   blah\n";
+  ASSERT_NE(0, check_for_control_characters_cstr(has_newline));
+
+  char no_control_chars[] = "blah   blah";
+  ASSERT_EQ(0, check_for_control_characters_cstr(no_control_chars));
+
+  uint8_t validutf[] = { 0x66, 0xd1, 0x86, 0xd1, 0x9d, 0xd2, 0xa0, 0xd3,
+                      0xad, 0xd3, 0xae, 0x0 };
+  ASSERT_EQ(0, check_for_control_characters_cstr((const char*)validutf));
+}