null+****@clear*****
null+****@clear*****
2010年 8月 22日 (日) 12:56:28 JST
Kouhei Sutou 2010-08-22 03:56:28 +0000 (Sun, 22 Aug 2010) New Revision: 81b9e9e0795b39c2cbf10243d55b25963c4ba286 Log: fix search leak in geo_in_rectangle. Modified files: lib/geo.c Modified: lib/geo.c (+21 -14) =================================================================== --- lib/geo.c 2010-08-22 03:20:21 +0000 (6debd66) +++ lib/geo.c 2010-08-22 03:56:28 +0000 (45b75ec) @@ -37,13 +37,13 @@ typedef struct static int compute_diff_bit(uint8_t *geo_key1, uint8_t *geo_key2) { - int i, j, diff_bit = 0; + int i, j, diff_bit = 8; for (i = 0; i < sizeof(grn_geo_point); i++) { if (geo_key1[i] != geo_key2[i]) { for (j = 0; j < 8; j++) { if ((geo_key1[i] & (1 << (7 - j))) != (geo_key2[i] & (1 << (7 - j)))) { - diff_bit = j + 1; + diff_bit = j; break; } } @@ -168,8 +168,6 @@ grn_geo_table_sort_detect_far_point(grn_ctx *ctx, grn_obj *table, grn_obj *index #endif if ((diff_bit_current % 2) == 1) { diff_bit_current--; - } else { - diff_bit_current -= 2; } if (diff_bit_current < diff_bit_prev && *diff_bit > diff_bit_current) { if (i == n) { @@ -700,37 +698,46 @@ grn_geo_search_in_rectangle(grn_ctx *ctx, grn_obj *obj, grn_obj **args, int narg } else { direction = MESH_LONGITUDE; geo_point_input = geo_point1; - geo_point_base.latitude = geo_point1->latitude + latitude_distance; + geo_point_base.latitude = geo_point1->latitude - latitude_distance; geo_point_base.longitude = geo_point1->longitude; } grn_gton(geo_key_input, geo_point_input, sizeof(grn_geo_point)); grn_gton(geo_key_base, &geo_point_base, sizeof(grn_geo_point)); diff_bit = compute_diff_bit(geo_key_input, geo_key_base); - compute_min_and_max(geo_point_input, diff_bit, + compute_min_and_max(&geo_point_base, diff_bit, &geo_point_min, &geo_point_max); if (direction == MESH_LATITUDE) { - start = geo_point2->latitude; - end = geo_point_max.latitude; distance = geo_point_max.latitude - geo_point_min.latitude + 1; + start = geo_point2->latitude; + end = geo_point_max.latitude + distance; } else { - start = geo_point_min.longitude; - end = geo_point2->longitude; distance = geo_point_max.longitude - geo_point_min.longitude + 1; + start = geo_point_min.longitude; + end = geo_point2->longitude + distance; } - memcpy(&geo_point_base, &geo_point_min, sizeof(grn_geo_point)); #ifdef GEO_DEBUG printf("direction: %s\n", direction == MESH_LATITUDE ? "latitude" : "longitude"); printf("base: "); grn_p_geo_point(ctx, &geo_point_base); + printf("input: "); + grn_p_geo_point(ctx, geo_point_input); + printf("min: "); + grn_p_geo_point(ctx, &geo_point_min); + printf("max: "); + grn_p_geo_point(ctx, &geo_point_max); printf("top-left: "); grn_p_geo_point(ctx, geo_point1); printf("bottom-right: "); grn_p_geo_point(ctx, geo_point2); - printf("start: %10d\n", start); - printf("end: %10d\n", end); - printf("distance: %10d\n", distance); + printf("diff-bit: %10d\n", diff_bit); + printf("start: %10d\n", start); + printf("end: %10d\n", end); + printf("distance: %10d\n", distance); + printf("distance(latitude): %10d\n", latitude_distance); + printf("distance(longitude): %10d\n", longitude_distance); #endif + memcpy(&geo_point_base, &geo_point_min, sizeof(grn_geo_point)); for (i = start; i < end + distance; i += distance) { grn_table_cursor *tc;