[HACKERS] 【ECPG】strncpy function does not set the end character '\0'

Поиск
Список
Период
Сортировка
От postgresql_2016@163.com
Тема [HACKERS] 【ECPG】strncpy function does not set the end character '\0'
Дата
Msg-id 1504529407637-0.post@n3.nabble.com
обсуждение исходный текст
Ответы Re: [HACKERS] 【ECPG】strncpy function does not set the end character '\0'  (Michael Meskes <meskes@postgresql.org>)
Список 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 по дате отправления:

Предыдущее
От: Simon Riggs
Дата:
Сообщение: Re: [HACKERS] Release Note changes
Следующее
От: Ashutosh Bapat
Дата:
Сообщение: Re: [HACKERS] dropping partitioned tables without CASCADE