[Groonga-commit] groonga/groonga at e2bdbfe [master] Add missing size check before memcmp

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Mar 9 15:00:58 JST 2016


Kouhei Sutou	2016-03-09 15:00:58 +0900 (Wed, 09 Mar 2016)

  New Revision: e2bdbfe82c2a7a69d51770ba3a8856323606fffe
  https://github.com/groonga/groonga/commit/e2bdbfe82c2a7a69d51770ba3a8856323606fffe

  Message:
    Add missing size check before memcmp

  Modified files:
    lib/proc/proc_table.c

  Modified: lib/proc/proc_table.c (+26 -27)
===================================================================
--- lib/proc/proc_table.c    2016-03-09 14:56:56 +0900 (0ec3be7)
+++ lib/proc/proc_table.c    2016-03-09 15:00:58 +0900 (4f7d38d)
@@ -30,38 +30,37 @@ command_table_create_parse_flags(grn_ctx *ctx,
 {
   grn_obj_flags flags = 0;
   while (nptr < end) {
+    size_t name_size;
+
     if (*nptr == '|' || *nptr == ' ') {
       nptr += 1;
       continue;
     }
-    if (!memcmp(nptr, "TABLE_HASH_KEY", 14)) {
-      flags |= GRN_OBJ_TABLE_HASH_KEY;
-      nptr += 14;
-    } else if (!memcmp(nptr, "TABLE_PAT_KEY", 13)) {
-      flags |= GRN_OBJ_TABLE_PAT_KEY;
-      nptr += 13;
-    } else if (!memcmp(nptr, "TABLE_DAT_KEY", 13)) {
-      flags |= GRN_OBJ_TABLE_DAT_KEY;
-      nptr += 13;
-    } else if (!memcmp(nptr, "TABLE_NO_KEY", 12)) {
-      flags |= GRN_OBJ_TABLE_NO_KEY;
-      nptr += 12;
-    } else if (!memcmp(nptr, "KEY_NORMALIZE", 13)) {
-      flags |= GRN_OBJ_KEY_NORMALIZE;
-      nptr += 13;
-    } else if (!memcmp(nptr, "KEY_WITH_SIS", 12)) {
-      flags |= GRN_OBJ_KEY_WITH_SIS;
-      nptr += 12;
-    } else if (!memcmp(nptr, "KEY_LARGE", 9)) {
-      flags |= GRN_OBJ_KEY_LARGE;
-      nptr += 9;
-    } else {
-      GRN_PLUGIN_ERROR(ctx,
-                       GRN_INVALID_ARGUMENT,
-                       "[table][create][flags] unknown flag: <%.*s>",
-                       (int)(end - nptr), nptr);
-      return 0;
+
+#define CHECK_FLAG(name)                                                \
+    name_size = strlen(#name);                                          \
+    if ((end - nptr) >= name_size &&                                    \
+        memcmp(nptr, #name, name_size) == 0) {                          \
+      flags |= GRN_OBJ_ ## name;                                        \
+      nptr += name_size;                                                \
+      continue;                                                         \
     }
+
+    CHECK_FLAG(TABLE_HASH_KEY);
+    CHECK_FLAG(TABLE_PAT_KEY);
+    CHECK_FLAG(TABLE_DAT_KEY);
+    CHECK_FLAG(TABLE_NO_KEY);
+    CHECK_FLAG(KEY_NORMALIZE);
+    CHECK_FLAG(KEY_WITH_SIS);
+    CHECK_FLAG(KEY_LARGE);
+
+#undef CHECK_FLAG
+
+    GRN_PLUGIN_ERROR(ctx,
+                     GRN_INVALID_ARGUMENT,
+                     "[table][create][flags] unknown flag: <%.*s>",
+                     (int)(end - nptr), nptr);
+    return 0;
   }
   return flags;
 }
-------------- next part --------------
HTML����������������������������...
下载 



More information about the Groonga-commit mailing list
Back to archive index