[Groonga-commit] groonga/groonga [master] FIxed a bug in grn_table_sort() causes segv when grn_obj_get_value_() returns NULL.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 10月 13日 (水) 19:48:37 JST


Daijiro MORI	2010-10-13 10:48:37 +0000 (Wed, 13 Oct 2010)

  New Revision: da3198779685c3e589422f8a41bb8ea16b1ee75c

  Log:
    FIxed a bug in grn_table_sort() causes segv when grn_obj_get_value_() returns NULL.

  Modified files:
    lib/db.c

  Modified: lib/db.c (+31 -11)
===================================================================
--- lib/db.c    2010-10-13 07:50:02 +0000 (a4d1de5)
+++ lib/db.c    2010-10-13 10:48:37 +0000 (113e26a)
@@ -6433,9 +6433,17 @@ enum {
 };
 
 #define CMPNUM(type) {\
-  type va = *((type *)(ap));\
-  type vb = *((type *)(bp));\
-  if (va != vb) { return va > vb; }\
+  if (as) {\
+    if (bs) {\
+      type va = *((type *)(ap));\
+      type vb = *((type *)(bp));\
+      if (va != vb) { return va > vb; }\
+    } else {\
+      return 1;\
+    }\
+  } else {\
+    if (bs) { return 0; }\
+  }\
 }
 
 inline static int
@@ -6502,17 +6510,29 @@ compare_value(grn_ctx *ctx, sort_entry *a, sort_entry *b,
       CMPNUM(uint64_t);
       break;
     case KEY_FLOAT32 :
-      {
-        float va = *((float *)(ap));
-        float vb = *((float *)(bp));
-        if (va < vb || va > vb) { return va > vb; }
+      if (as) {
+        if (bs) {
+          float va = *((float *)(ap));
+          float vb = *((float *)(bp));
+          if (va < vb || va > vb) { return va > vb; }
+        } else {
+          return 1;
+        }
+      } else {
+        if (bs) { return 0; }
       }
       break;
     case KEY_FLOAT64 :
-      {
-        double va = *((double *)(ap));
-        double vb = *((double *)(bp));
-        if (va < vb || va > vb) { return va > vb; }
+      if (as) {
+        if (bs) {
+          double va = *((double *)(ap));
+          double vb = *((double *)(bp));
+          if (va < vb || va > vb) { return va > vb; }
+        } else {
+          return 1;
+        }
+      } else {
+        if (bs) { return 0; }
       }
       break;
     }




Groonga-commit メーリングリストの案内
Back to archive index