[Groonga-commit] groonga/groonga at ecb9709 [master] grn_ts: don't use garbage on failure in grn_ts_expr_evaluate()

Back to archive index

susumu.yata null+****@clear*****
Wed Sep 2 17:13:57 JST 2015


susumu.yata	2015-09-02 17:13:57 +0900 (Wed, 02 Sep 2015)

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

  Message:
    grn_ts: don't use garbage on failure in grn_ts_expr_evaluate()
    
    GitHub: #391

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+25 -15)
===================================================================
--- lib/ts.c    2015-09-02 16:47:01 +0900 (da5000e)
+++ lib/ts.c    2015-09-02 17:13:57 +0900 (d76559f)
@@ -812,8 +812,9 @@ grn_ts_expr_score_node_evaluate(grn_ctx *ctx, grn_ts_expr_score_node *node,
     size_t i;\
     grn_ts_ ## kind *out_ptr = (grn_ts_ ## kind *)out;\
     for (i = 0; i < n_in; i++) {\
-      if (!grn_table_get_key(ctx, node->table, in[i].id, &out_ptr[i],\
-                             sizeof(grn_ts_ ## kind))) {\
+      size_t size = grn_ts_table_get_key(ctx, node->table, in[i].id,\
+                                         &out_ptr[i], sizeof(out_ptr[i]));\
+      if (size != sizeof(out_ptr[i])) {\
         out_ptr[i] = grn_ts_ ## kind ## _zero();\
       }\
     }\
@@ -823,8 +824,9 @@ grn_ts_expr_score_node_evaluate(grn_ctx *ctx, grn_ts_expr_score_node *node,
   case GRN_DB_ ## TYPE: {\
     for (i = 0; i < n_in; i++) {\
       type ## _t key;\
-      if (grn_table_get_key(ctx, node->table, in[i].id, &key,\
-                            sizeof(type ## _t))) {\
+      size_t size = grn_ts_table_get_key(ctx, node->table, in[i].id,\
+                                         &key, sizeof(key));\
+      if (size == sizeof(key)) {\
         out_ptr[i] = (grn_ts_int)key;\
       } else {\
         out_ptr[i] = grn_ts_int_zero();\
@@ -865,6 +867,7 @@ grn_ts_expr_key_node_evaluate(grn_ctx *ctx, grn_ts_expr_key_node *node,
       grn_ts_text *out_ptr = (grn_ts_text *)out;
       GRN_BULK_REWIND(&node->buf);
       for (i = 0; i < n_in; i++) {
+        /* TODO: Detect an error. */
         out_ptr[i].size = grn_table_get_key2(ctx, node->table, in[i].id,
                                              &node->buf);
       }
@@ -880,11 +883,13 @@ grn_ts_expr_key_node_evaluate(grn_ctx *ctx, grn_ts_expr_key_node *node,
       size_t i;
       grn_ts_ref *out_ptr = (grn_ts_ref *)out;
       for (i = 0; i < n_in; i++) {
-        if (!grn_table_get_key(ctx, node->table, in[i].id, &out_ptr[i].id,
-                               sizeof(grn_ts_id))) {
-          out_ptr[i].id = GRN_ID_NIL;
+        size_t size = grn_ts_table_get_key(ctx, node->table, in[i].id,
+                                           &out_ptr[i].id, sizeof(grn_ts_id));
+        if (size != sizeof(grn_ts_id)) {
+          out_ptr[i] = grn_ts_ref_zero();
+        } else {
+          out_ptr[i].score = in[i].score;
         }
-        out_ptr[i].score = in[i].score;
       }
       return GRN_SUCCESS;
     }
@@ -901,8 +906,9 @@ grn_ts_expr_key_node_evaluate(grn_ctx *ctx, grn_ts_expr_key_node *node,
     size_t i;\
     grn_ts_ ## kind *out_ptr = (grn_ts_ ## kind *)out;\
     for (i = 0; i < n_in; i++) {\
-      if (!grn_ts_table_get_value(ctx, node->table, in[i].id,\
-                                  &out_ptr[i])) {\
+      size_t size = grn_ts_table_get_value(ctx, node->table, in[i].id,\
+                                           &out_ptr[i]);\
+      if (size != sizeof(out_ptr[i])) {\
         out_ptr[i] = grn_ts_ ## kind ## _zero();\
       }\
     }\
@@ -912,7 +918,9 @@ grn_ts_expr_key_node_evaluate(grn_ctx *ctx, grn_ts_expr_key_node *node,
   case GRN_DB_ ## TYPE: {\
     for (i = 0; i < n_in; i++) {\
       type ## _t value;\
-      if (grn_ts_table_get_value(ctx, node->table, in[i].id, &value)) {\
+      size_t size = grn_ts_table_get_value(ctx, node->table, in[i].id,\
+                                           &value);\
+      if (size == sizeof(value)) {\
         out_ptr[i] = (grn_ts_int)value;\
       } else {\
         out_ptr[i] = grn_ts_int_zero();\
@@ -952,11 +960,13 @@ grn_ts_expr_value_node_evaluate(grn_ctx *ctx, grn_ts_expr_value_node *node,
       size_t i;
       grn_ts_ref *out_ptr = (grn_ts_ref *)out;
       for (i = 0; i < n_in; i++) {
-        if (!grn_ts_table_get_value(ctx, node->table, in[i].id,
-                                    &out_ptr[i].id)) {
-          out_ptr[i].id = GRN_ID_NIL;
+        size_t size = grn_ts_table_get_value(ctx, node->table, in[i].id,
+                                             &out_ptr[i].id);
+        if (size != sizeof(grn_ts_id)) {
+          out_ptr[i] = grn_ts_ref_zero();
+        } else {
+          out_ptr[i].score = in[i].score;
         }
-        out_ptr[i].score = in[i].score;
       }
       return GRN_SUCCESS;
     }
-------------- next part --------------
HTML����������������������������...
다운로드 



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