]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Catch invalid typlens in a couple of places
authorPeter Eisentraut <peter@eisentraut.org>
Mon, 4 Nov 2019 07:30:00 +0000 (08:30 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Mon, 4 Nov 2019 08:20:33 +0000 (09:20 +0100)
Rearrange the logic in record_image_cmp() and record_image_eq() to
error out on unexpected typlens (either not supported there or
completely invalid due to corruption).  Barring corruption, this is
not possible today but it seems more future-proof and robust to fix
this.

Reported-by: Peter Geoghegan <pg@bowt.ie>
src/backend/utils/adt/rowtypes.c

index 5f729342f8d028ae04b60c305fa1abd89002198d..5f3dbc59d5c84d6babf2f8612f2f8699f690dcdb 100644 (file)
@@ -1442,7 +1442,18 @@ record_image_cmp(FunctionCallInfo fcinfo)
                        }
 
                        /* Compare the pair of elements */
-                       if (att1->attlen == -1)
+                       if (att1->attbyval)
+                       {
+                               if (values1[i1] != values2[i2])
+                                       cmpresult = (values1[i1] < values2[i2]) ? -1 : 1;
+                       }
+                       else if (att1->attlen > 0)
+                       {
+                               cmpresult = memcmp(DatumGetPointer(values1[i1]),
+                                                                  DatumGetPointer(values2[i2]),
+                                                                  att1->attlen);
+                       }
+                       else if (att1->attlen == -1)
                        {
                                Size            len1,
                                                        len2;
@@ -1465,17 +1476,8 @@ record_image_cmp(FunctionCallInfo fcinfo)
                                if ((Pointer) arg2val != (Pointer) values2[i2])
                                        pfree(arg2val);
                        }
-                       else if (att1->attbyval)
-                       {
-                               if (values1[i1] != values2[i2])
-                                       cmpresult = (values1[i1] < values2[i2]) ? -1 : 1;
-                       }
                        else
-                       {
-                               cmpresult = memcmp(DatumGetPointer(values1[i1]),
-                                                                  DatumGetPointer(values2[i2]),
-                                                                  att1->attlen);
-                       }
+                               elog(ERROR, "unexpected attlen: %d", att1->attlen);
 
                        if (cmpresult < 0)
                        {
@@ -1671,7 +1673,17 @@ record_image_eq(PG_FUNCTION_ARGS)
                        }
 
                        /* Compare the pair of elements */
-                       if (att1->attlen == -1)
+                       if (att1->attbyval)
+                       {
+                               result = (values1[i1] == values2[i2]);
+                       }
+                       else if (att1->attlen > 0)
+                       {
+                               result = (memcmp(DatumGetPointer(values1[i1]),
+                                                                DatumGetPointer(values2[i2]),
+                                                                att1->attlen) == 0);
+                       }
+                       else if (att1->attlen == -1)
                        {
                                Size            len1,
                                                        len2;
@@ -1700,16 +1712,9 @@ record_image_eq(PG_FUNCTION_ARGS)
                                                pfree(arg2val);
                                }
                        }
-                       else if (att1->attbyval)
-                       {
-                               result = (values1[i1] == values2[i2]);
-                       }
                        else
-                       {
-                               result = (memcmp(DatumGetPointer(values1[i1]),
-                                                                DatumGetPointer(values2[i2]),
-                                                                att1->attlen) == 0);
-                       }
+                               elog(ERROR, "unexpected attlen: %d", att1->attlen);
+
                        if (!result)
                                break;
                }