Fix handling of structure for bytea data type in ECPG
authorMichael Paquier <[email protected]>
Mon, 27 Jul 2020 01:29:11 +0000 (10:29 +0900)
committerMichael Paquier <[email protected]>
Mon, 27 Jul 2020 01:29:11 +0000 (10:29 +0900)
Some code paths dedicated to bytea used the structure for varchar.  This
did not lead to any actual bugs, as bytea and varchar have the same
definition, but it could become a trap if one of these definitions
changes for a new feature or a bug fix.

Issue introduced by 050710b.

Author: Shenhao Wang
Reviewed-by: Vignesh C, Michael Paquier
Discussion: https://postgr.es/m/07ac7dee1efc44f99d7f53a074420177@G08CNEXMBPEKD06.g08.fujitsu.local
Backpatch-through: 12

src/interfaces/ecpg/ecpglib/data.c
src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/execute.c

index 81f94cc12b80e7a413a37e31d61f86c454f164ee..9cf0292e02f5eee25138d94aadb3f465b9ed434a 100644 (file)
@@ -529,8 +529,8 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
                case ECPGt_bytea:
                    {
-                       struct ECPGgeneric_varchar *variable =
-                       (struct ECPGgeneric_varchar *) (var + offset * act_tuple);
+                       struct ECPGgeneric_bytea *variable =
+                       (struct ECPGgeneric_bytea *) (var + offset * act_tuple);
                        long        dst_size,
                                    src_size,
                                    dec_size;
index ef500a915d62932ee8719dc2432f1492f2a6a212..31ebd4c41eaeb684bfc92b292b11b5a7824a90cf 100644 (file)
@@ -596,8 +596,8 @@ set_desc_attr(struct descriptor_item *desc_item, struct variable *var,
 
    else
    {
-       struct ECPGgeneric_varchar *variable =
-       (struct ECPGgeneric_varchar *) (var->value);
+       struct ECPGgeneric_bytea *variable =
+       (struct ECPGgeneric_bytea *) (var->value);
 
        desc_item->is_binary = true;
        desc_item->data_len = variable->len;
index 606aff63735028b47236ac6328a03bf0722a87b6..6b40ecd910ee143ad63e5525c4c133b2674b1064 100644 (file)
@@ -825,8 +825,8 @@ ecpg_store_input(const int lineno, const bool force_indicator, const struct vari
 
            case ECPGt_bytea:
                {
-                   struct ECPGgeneric_varchar *variable =
-                   (struct ECPGgeneric_varchar *) (var->value);
+                   struct ECPGgeneric_bytea *variable =
+                   (struct ECPGgeneric_bytea *) (var->value);
 
                    if (!(mallocedval = (char *) ecpg_alloc(variable->len, lineno)))
                        return false;
@@ -1404,7 +1404,7 @@ ecpg_build_params(struct statement *stmt)
 
            if (var->type == ECPGt_bytea)
            {
-               binary_length = ((struct ECPGgeneric_varchar *) (var->value))->len;
+               binary_length = ((struct ECPGgeneric_bytea *) (var->value))->len;
                binary_format = true;
            }
        }