Kouhei Sutou
null+****@clear*****
Wed Mar 9 14:56:56 JST 2016
Kouhei Sutou 2016-03-09 14:56:56 +0900 (Wed, 09 Mar 2016) New Revision: 44feac69f8a532a47904deda8fa50043f0cee49d https://github.com/groonga/groonga/commit/44feac69f8a532a47904deda8fa50043f0cee49d Message: Add missing size check before memcmp Modified files: lib/proc.c Modified: lib/proc.c (+26 -31) =================================================================== --- lib/proc.c 2016-03-09 13:49:14 +0900 (259aac3) +++ lib/proc.c 2016-03-09 14:56:56 +0900 (88358c8) @@ -201,42 +201,37 @@ grn_parse_column_create_flags(grn_ctx *ctx, const char *nptr, const char *end) { grn_obj_flags flags = 0; while (nptr < end) { + size_t name_size; + if (*nptr == '|' || *nptr == ' ') { nptr += 1; continue; } - if (!memcmp(nptr, "COLUMN_SCALAR", 13)) { - flags |= GRN_OBJ_COLUMN_SCALAR; - nptr += 13; - } else if (!memcmp(nptr, "COLUMN_VECTOR", 13)) { - flags |= GRN_OBJ_COLUMN_VECTOR; - nptr += 13; - } else if (!memcmp(nptr, "COLUMN_INDEX", 12)) { - flags |= GRN_OBJ_COLUMN_INDEX; - nptr += 12; - } else if (!memcmp(nptr, "COMPRESS_ZLIB", 13)) { - flags |= GRN_OBJ_COMPRESS_ZLIB; - nptr += 13; - } else if (!memcmp(nptr, "COMPRESS_LZ4", 12)) { - flags |= GRN_OBJ_COMPRESS_LZ4; - nptr += 12; - } else if (!memcmp(nptr, "WITH_SECTION", 12)) { - flags |= GRN_OBJ_WITH_SECTION; - nptr += 12; - } else if (!memcmp(nptr, "WITH_WEIGHT", 11)) { - flags |= GRN_OBJ_WITH_WEIGHT; - nptr += 11; - } else if (!memcmp(nptr, "WITH_POSITION", 13)) { - flags |= GRN_OBJ_WITH_POSITION; - nptr += 13; - } else if (!memcmp(nptr, "RING_BUFFER", 11)) { - flags |= GRN_OBJ_RING_BUFFER; - nptr += 11; - } else { - ERR(GRN_INVALID_ARGUMENT, "invalid flags option: %.*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(COLUMN_SCALAR); + CHECK_FLAG(COLUMN_VECTOR); + CHECK_FLAG(COLUMN_INDEX); + CHECK_FLAG(COMPRESS_ZLIB); + CHECK_FLAG(COMPRESS_LZ4); + CHECK_FLAG(WITH_SECTION); + CHECK_FLAG(WITH_WEIGHT); + CHECK_FLAG(WITH_POSITION); + CHECK_FLAG(RING_BUFFER); + + ERR(GRN_INVALID_ARGUMENT, + "[column][create] invalid flag: <%.*s>", + (int)(end - nptr), nptr); + return 0; +#undef CHECK_FLAG } return flags; } -------------- next part -------------- HTML����������������������������...ダウンロード