[Groonga-commit] groonga/groonga at b060ee7 [master] ii: add missing grn_p_decv() return value check in merge

Back to archive index
Kouhei Sutou null+****@clear*****
Mon Jan 21 16:01:02 JST 2019


Kouhei Sutou	2019-01-21 16:01:02 +0900 (Mon, 21 Jan 2019)

  Revision: b060ee7fa36749a8928505281b9295fb7708f67c
  https://github.com/groonga/groonga/commit/b060ee7fa36749a8928505281b9295fb7708f67c

  Message:
    ii: add missing grn_p_decv() return value check in merge

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+58 -4)
===================================================================
--- lib/ii.c    2019-01-21 15:42:42 +0900 (1e0fdcd00)
+++ lib/ii.c    2019-01-21 16:01:02 +0900 (56774e957)
@@ -3400,12 +3400,37 @@ chunk_merge(grn_ctx *ctx, grn_ii *ii, buffer *sb, uint8_t *sc, buffer_term *bt,
     uint8_t *sbp = *sbpp;
     datavec rdv[MAX_N_ELEMENTS + 1];
     size_t bufsize = S_SEGMENT * ii->n_elements;
+    int decoded_size;
     datavec_init(ctx, rdv, ii->n_elements, 0, 0);
     if ((ii->header->flags & GRN_OBJ_WITH_POSITION)) {
       rdv[ii->n_elements - 1].flags = ODD;
     }
-    bufsize += grn_p_decv(ctx, ii, bt->tid & GRN_ID_MAX,
-                          scp, cinfo->size, rdv, ii->n_elements);
+    decoded_size = grn_p_decv(ctx, ii, bt->tid & GRN_ID_MAX,
+                              scp, cinfo->size, rdv, ii->n_elements);
+    if (decoded_size == 0) {
+      datavec_fin(ctx, rdv);
+      grn_io_win_unmap(&sw);
+      {
+        grn_obj term;
+        grn_rc rc = ctx->rc;
+        DEFINE_NAME(ii);
+        GRN_TEXT_INIT(&term, 0);
+        grn_ii_get_term(ctx, ii, bt->tid & GRN_ID_MAX, &term);
+        if (rc == GRN_SUCCESS) {
+          rc = GRN_UNKNOWN_ERROR;
+        }
+        ERR(rc,
+            "[ii][chunk][merge] failed to decode: "
+            "<%.*s>: "
+            "<%.*s>(%u)",
+            name_size, name,
+            (int)GRN_TEXT_LEN(&term), GRN_TEXT_VALUE(&term),
+            bt->tid);
+        GRN_OBJ_FIN(ctx, &term);
+      }
+      return ctx->rc;
+    }
+    bufsize += decoded_size;
     // (df in chunk list) = a[1] - sdf;
     {
       int j = 0;
@@ -3455,6 +3480,7 @@ chunk_merge(grn_ctx *ctx, grn_ii *ii, buffer *sb, uint8_t *sc, buffer_term *bt,
          segno,
          size);
     GRN_OBJ_FIN(ctx, &term);
+    return ctx->rc;
   }
   if (ctx->rc == GRN_SUCCESS) {
     int j = 0;
@@ -3689,8 +3715,36 @@ buffer_merge(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h,
         }
       }
       if (sce > scp) {
-        size += grn_p_decv(ctx, ii, bt->tid & GRN_ID_MAX,
-                           scp, sce - scp, rdv, ii->n_elements);
+        int decoded_size;
+        decoded_size = grn_p_decv(ctx, ii, bt->tid & GRN_ID_MAX,
+                                  scp, sce - scp, rdv, ii->n_elements);
+        if (decoded_size == 0) {
+          if (cinfo) { GRN_FREE(cinfo); }
+          datavec_fin(ctx, dv);
+          datavec_fin(ctx, rdv);
+          {
+            grn_obj term;
+            grn_rc rc = ctx->rc;
+            DEFINE_NAME(ii);
+            GRN_TEXT_INIT(&term, 0);
+            grn_ii_get_term(ctx, ii, bt->tid & GRN_ID_MAX, &term);
+            if (rc == GRN_SUCCESS) {
+              rc = GRN_UNKNOWN_ERROR;
+            }
+            ERR(rc,
+                "[ii][buffer][merge] failed to decode: "
+                "<%.*s>: "
+                "<%.*s>(%u): "
+                "n-chunks:<%u>",
+                name_size, name,
+                (int)GRN_TEXT_LEN(&term), GRN_TEXT_VALUE(&term),
+                bt->tid,
+                nvchunks);
+            GRN_OBJ_FIN(ctx, &term);
+          }
+          return ctx->rc;
+        }
+        size += decoded_size;
         {
           int j = 0;
           sdf = rdv[j].data_size;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190121/f3f62ae5/attachment-0001.html>


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