]> granicus.if.org Git - onig/commitdiff
check character range in onig_unicode_define_user_property()
authorkosako <kosako@sofnec.co.jp>
Fri, 6 May 2016 05:59:44 +0000 (14:59 +0900)
committerkosako <kosako@sofnec.co.jp>
Fri, 6 May 2016 05:59:44 +0000 (14:59 +0900)
src/oniguruma.h
src/unicode.c

index aba47952653d1e4fcba4d0dd034e656ebcd18064..6e62b50abf6056b953a0e9fb43e6721f18aa73b8 100644 (file)
@@ -592,6 +592,7 @@ ONIG_EXTERN OnigSyntaxType*   OnigDefaultSyntax;
 #define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION           -402
 #define ONIGERR_INVALID_COMBINATION_OF_OPTIONS               -403
 #define ONIGERR_TOO_MANY_USER_DEFINED_OBJECTS                -404
+#define ONIGERR_TOO_LONG_PROPERTY_NAME                       -405
 #define ONIGERR_LIBRARY_IS_NOT_INITIALIZED                   -500
 
 /* errors related to thread */
index 393b59029b22a4700043569fc012730be0b8af21..df20ef98297a76710c6967c9cc594b42c86f12dd 100644 (file)
@@ -91,21 +91,46 @@ extern int
 onig_unicode_define_user_property(const char* name, OnigCodePoint* ranges)
 {
   UserDefinedPropertyValue* e;
+  int i;
+  int n;
+  int len;
+  int c;
+  char* s;
+
+  if (UserDefinedPropertyNum >= USER_DEFINED_PROPERTY_MAX_NUM)
+    return ONIGERR_TOO_MANY_USER_DEFINED_OBJECTS;
+
+  len = strlen(name);
+  if (len >= PROPERTY_NAME_MAX_SIZE)
+    return ONIGERR_TOO_LONG_PROPERTY_NAME;
+
+  s = (char* )xmalloc(len + 1);
+  if (s == 0)
+    return ONIGERR_MEMORY;
+
+  n = 0;
+  for (i = 0; i < len; i++) {
+    c = name[i];
+    if (c <= 0 || c >= 0x80)
+      return ONIGERR_INVALID_CHAR_PROPERTY_NAME;
+
+    if (c != ' ' && c != '-' && c != '_') {
+      s[n] = c;
+      n++;
+    }
+  }
+  s[n] = '\0';
 
   if (UserDefinedPropertyTable == 0) {
     UserDefinedPropertyTable = onig_st_init_strend_table_with_size(10);
   }
 
-  if (UserDefinedPropertyNum >= USER_DEFINED_PROPERTY_MAX_NUM)
-    return ONIGERR_TOO_MANY_USER_DEFINED_OBJECTS;
-
   e = UserDefinedPropertyRanges + UserDefinedPropertyNum;
   e->ctype = CODE_RANGES_NUM + UserDefinedPropertyNum;
   e->ranges = ranges;
   onig_st_insert_strend(UserDefinedPropertyTable,
-                       (const UChar* )name,
-                       (const UChar* )name + strlen(name),
-                       (hash_data_type )((void* )e));
+                        (const UChar* )s, (const UChar* )s + n,
+                        (hash_data_type )((void* )e));
 
   UserDefinedPropertyNum++;
   return 0;