null+****@clear*****
null+****@clear*****
2010年 7月 29日 (木) 12:30:11 JST
Daijiro MORI 2010-07-29 03:30:11 +0000 (Thu, 29 Jul 2010) New Revision: 5d2ab7252da134d48f80cc0adafa057eccd58378 Log: Fixed a bug in grn_ja_check(). Modified files: lib/store.c Modified: lib/store.c (+9 -4) =================================================================== --- lib/store.c 2010-07-29 00:24:21 +0000 (54b950d) +++ lib/store.c 2010-07-29 03:30:11 +0000 (251a584) @@ -423,6 +423,10 @@ grn_ja_free(grn_ctx *ctx, grn_ja *ja, grn_ja_einfo *einfo) if (!addr) { return GRN_NO_MEMORY_AVAILABLE; } aligned_size = (element_size + sizeof(grn_id) - 1) & ~(sizeof(grn_id) - 1); *(uint32_t *)(addr + pos - sizeof(grn_id)) = DELETED|aligned_size; + if (SEGMENTS_AT(ja, seg) < (aligned_size + sizeof(grn_id)) + SEG_SEQ) { + GRN_LOG(ctx, GRN_WARN, "inconsistent ja entry detected (%d > %d)", + element_size, SEGMENTS_AT(ja, seg) - SEG_SEQ); + } SEGMENTS_AT(ja, seg) -= (aligned_size + sizeof(grn_id)); if (SEGMENTS_AT(ja, seg) == SEG_SEQ) { /* reuse the segment */ @@ -1076,9 +1080,10 @@ grn_ja_defrag_seg(grn_ctx *ctx, grn_ja *ja, uint32_t seg) uint64_t cas; uint32_t pos; if (grn_ja_element_info(ctx, ja, id, &cas, &pos, &element_size)) { break; } - if (v != ve - JA_SEGMENT_SIZE + pos) { + if (v + sizeof(uint32_t) != ve - JA_SEGMENT_SIZE + pos) { GRN_LOG(ctx, GRN_LOG_WARNING, - "dseges[%d] = pos unmatch (%d != %d)", seg, pos, v + JA_SEGMENT_SIZE - ve); + "dseges[%d] = pos unmatch (%d != %d)", + seg, pos, v + sizeof(uint32_t) + JA_SEGMENT_SIZE - ve); break; } if (grn_ja_put(ctx, ja, id, v + sizeof(uint32_t), element_size, GRN_OBJ_SET, &cas)) { @@ -1092,7 +1097,7 @@ grn_ja_defrag_seg(grn_ctx *ctx, grn_ja *ja, uint32_t seg) v += sizeof(uint32_t) + element_size; } GRN_LOG(ctx, *seginfo ? GRN_LOG_WARNING : GRN_LOG_NOTICE, - "dseges[%d] = %d after defrag", seg, *seginfo); + "dseges[%d] = %d after defrag", seg, (*seginfo & ~SEG_MASK)); GRN_IO_SEG_UNREF(ja->io, seg); return GRN_SUCCESS; } @@ -1169,7 +1174,7 @@ grn_ja_check(grn_ctx *ctx, grn_ja *ja) element_size = (element_size + sizeof(grn_id) - 1) & ~(sizeof(grn_id) - 1); cum += sizeof(uint32_t) + element_size; n_elements++; - s_elements += element_size; + s_elements += sizeof(uint32_t) + element_size; } v += sizeof(uint32_t) + element_size; /*