[HACKERS] 【ECPG】strncpy function does not set the end character '\0' - Mailing list pgsql-hackers

From postgresql_2016@163.com
Subject [HACKERS] 【ECPG】strncpy function does not set the end character '\0'
Date
Msg-id 1504529407637-0.post@n3.nabble.com
Whole thread Raw
Responses Re: [HACKERS] 【ECPG】strncpy function does not set the end character '\0'
List pgsql-hackers
Hi

When we reviewed the ecpg code,we found the array seem not have the end
character('\0')  after using the strncpy function. 

In the function ECPGnoticeReceiver, we use the stncpy function copy the
sqlstate to sqlca->sqlstate. And the  sqlca->sqlstate is defined as the size
of 5, and the copy size is sizeof(sqlca->sqlstate). However, from the
previous strcmp function, the sqlstate size may be 5,such as
ECPG_SQLSTATE_INVALID_CURSOR_NAME. So there may be lack of the end character
for sqlca->sqlstate.

------------------------------------------------------------------------------------------------------

the copy code 
       /* map to SQLCODE for backward compatibility */       if (strcmp(sqlstate, ECPG_SQLSTATE_INVALID_CURSOR_NAME) ==
0)              sqlcode = ECPG_WARNING_UNKNOWN_PORTAL;       else if (strcmp(sqlstate,
ECPG_SQLSTATE_ACTIVE_SQL_TRANSACTION)==
 
0)               sqlcode = ECPG_WARNING_IN_TRANSACTION;       else if (strcmp(sqlstate,
ECPG_SQLSTATE_NO_ACTIVE_SQL_TRANSACTION)
== 0)               sqlcode = ECPG_WARNING_NO_TRANSACTION;       else if (strcmp(sqlstate,
ECPG_SQLSTATE_DUPLICATE_CURSOR)== 0)               sqlcode = ECPG_WARNING_PORTAL_EXISTS;       else
sqlcode= 0;
 
      * strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));*       sqlca->sqlcode = sqlcode;
sqlca->sqlwarn[2]= 'W';       sqlca->sqlwarn[0] = 'W';
 

the defined code 

struct sqlca_t
{       char            sqlcaid[8];       long            sqlabc;       long            sqlcode;       struct       {
           int                     sqlerrml;               char            sqlerrmc[SQLERRMC_LEN];       }
        sqlerrm;       char            sqlerrp[8];       long            sqlerrd[6];       /* Element 0: empty
                                  */       /* 1: OID of processed tuple if applicable                      */       /*
2:number of rows processed                          */       /* after an INSERT, UPDATE or                           */
     /* DELETE statement                                     */       /* 3: empty
     */       /* 4: empty                                             */       /* 5: empty
              */       char            sqlwarn[8];       /* Element 0: set to 'W' if at least one other is 'W'   */
 /* 1: if 'W' at least one character string              */       /* value was truncated when it was
 */       /* stored into a host variable.             */
 
       /*        * 2: if 'W' a (hopefully) non-fatal notice occurred        */     /* 3: empty */       /* 4: empty
                                       */       /* 5: empty                                             */       /* 6:
empty                                            */       /* 7: empty                                             */
 
      * char            sqlstate[5];*
};





--
Sent from: http://www.postgresql-archive.org/PostgreSQL-hackers-f1928748.html



pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: [HACKERS] Release Note changes
Next
From: Ashutosh Bapat
Date:
Subject: Re: [HACKERS] dropping partitioned tables without CASCADE