diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index e7a53f3c9d..9c247ccc2e 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -5052,6 +5052,7 @@ struct long sqlerrd[6]; char sqlwarn[8]; char sqlstate[5]; + char sqlstatepad; } sqlca; (In a multithreaded program, every thread automatically gets its @@ -5201,6 +5202,11 @@ sqlstate: 42P01 throughout all applications. For further information see . + + sqlca.sqlstate field is a non-terminated character + array, in order to guard against accidental uses as a C string it is + followed by a padding nul character. + SQLCODE, the deprecated error code scheme, is a diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c index 2ae989e3e5..a28481eca5 100644 --- a/src/interfaces/ecpg/ecpglib/misc.c +++ b/src/interfaces/ecpg/ecpglib/misc.c @@ -52,7 +52,8 @@ static struct sqlca_t sqlca_init = }, { '0', '0', '0', '0', '0' - } + }, + '\0' }; static pthread_key_t sqlca_key; @@ -274,8 +275,8 @@ ecpg_log(const char *format,...) /* dump out internal sqlca variables */ if (ecpg_internal_regression_mode && sqlca != NULL) { - fprintf(debugstream, "[NO_PID]: sqlca: code: %ld, state: %s\n", - sqlca->sqlcode, sqlca->sqlstate); + fprintf(debugstream, "[NO_PID]: sqlca: code: %ld, state: %.*s\n", + sqlca->sqlcode, (int) sizeof(sqlca->sqlstate), sqlca->sqlstate); } fflush(debugstream); diff --git a/src/interfaces/ecpg/include/sqlca.h b/src/interfaces/ecpg/include/sqlca.h index c5f107dd33..f0322f9191 100644 --- a/src/interfaces/ecpg/include/sqlca.h +++ b/src/interfaces/ecpg/include/sqlca.h @@ -51,6 +51,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix2.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix2.c index fc30e3278c..1f2b023694 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix2.c +++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix2.c @@ -68,6 +68,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/preproc-init.c b/src/interfaces/ecpg/test/expected/preproc-init.c index b0e04731fe..441ca1f97f 100644 --- a/src/interfaces/ecpg/test/expected/preproc-init.c +++ b/src/interfaces/ecpg/test/expected/preproc-init.c @@ -62,6 +62,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-array.c b/src/interfaces/ecpg/test/expected/sql-array.c index e48f5fac67..cd2252ea30 100644 --- a/src/interfaces/ecpg/test/expected/sql-array.c +++ b/src/interfaces/ecpg/test/expected/sql-array.c @@ -75,6 +75,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-code100.c b/src/interfaces/ecpg/test/expected/sql-code100.c index 4c85530a17..f410c63c7b 100644 --- a/src/interfaces/ecpg/test/expected/sql-code100.c +++ b/src/interfaces/ecpg/test/expected/sql-code100.c @@ -62,6 +62,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-copystdout.c b/src/interfaces/ecpg/test/expected/sql-copystdout.c index d2599fb0e9..69f743443a 100644 --- a/src/interfaces/ecpg/test/expected/sql-copystdout.c +++ b/src/interfaces/ecpg/test/expected/sql-copystdout.c @@ -64,6 +64,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c index 6248d99217..f515e954ee 100644 --- a/src/interfaces/ecpg/test/expected/sql-declare.c +++ b/src/interfaces/ecpg/test/expected/sql-declare.c @@ -70,6 +70,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-define.c b/src/interfaces/ecpg/test/expected/sql-define.c index e97caec5b0..42f62a939e 100644 --- a/src/interfaces/ecpg/test/expected/sql-define.c +++ b/src/interfaces/ecpg/test/expected/sql-define.c @@ -77,6 +77,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-dynalloc.c b/src/interfaces/ecpg/test/expected/sql-dynalloc.c index a95dddf15d..0c4efe96de 100644 --- a/src/interfaces/ecpg/test/expected/sql-dynalloc.c +++ b/src/interfaces/ecpg/test/expected/sql-dynalloc.c @@ -63,6 +63,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-dynalloc2.c b/src/interfaces/ecpg/test/expected/sql-dynalloc2.c index 711857706a..db4d6b783e 100644 --- a/src/interfaces/ecpg/test/expected/sql-dynalloc2.c +++ b/src/interfaces/ecpg/test/expected/sql-dynalloc2.c @@ -63,6 +63,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c index 513d44c630..9b3e540ff3 100644 --- a/src/interfaces/ecpg/test/expected/sql-dyntest.c +++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c @@ -116,6 +116,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-indicators.c b/src/interfaces/ecpg/test/expected/sql-indicators.c index 7cf43ad622..f10edb388f 100644 --- a/src/interfaces/ecpg/test/expected/sql-indicators.c +++ b/src/interfaces/ecpg/test/expected/sql-indicators.c @@ -64,6 +64,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson.c b/src/interfaces/ecpg/test/expected/sql-sqljson.c index 39221f9ea5..5750b225c4 100644 --- a/src/interfaces/ecpg/test/expected/sql-sqljson.c +++ b/src/interfaces/ecpg/test/expected/sql-sqljson.c @@ -64,6 +64,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c index b2a0f11eb6..e586c24914 100644 --- a/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c +++ b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c @@ -64,6 +64,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/thread-alloc.c b/src/interfaces/ecpg/test/expected/thread-alloc.c index 3b31d27fd3..7e53368ea4 100644 --- a/src/interfaces/ecpg/test/expected/thread-alloc.c +++ b/src/interfaces/ecpg/test/expected/thread-alloc.c @@ -79,6 +79,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/thread-descriptor.c b/src/interfaces/ecpg/test/expected/thread-descriptor.c index e34f4708d1..6742180087 100644 --- a/src/interfaces/ecpg/test/expected/thread-descriptor.c +++ b/src/interfaces/ecpg/test/expected/thread-descriptor.c @@ -75,6 +75,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void); diff --git a/src/interfaces/ecpg/test/expected/thread-prep.c b/src/interfaces/ecpg/test/expected/thread-prep.c index 052e27b634..8439126e32 100644 --- a/src/interfaces/ecpg/test/expected/thread-prep.c +++ b/src/interfaces/ecpg/test/expected/thread-prep.c @@ -79,6 +79,7 @@ struct sqlca_t /* 7: empty */ char sqlstate[5]; + char sqlstatepad; /* nul terminator for sqlstate */ }; struct sqlca_t *ECPGget_sqlca(void);