From 1846fab4e66e9bbca2668942bd4b3726a7f70504 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 13 Aug 2020 12:04:16 +1000 Subject: [PATCH 1/4] Const correctness on src char pointers for unicode/ascii conversion --- include/mdbtools.h | 4 ++-- src/libmdb/iconv.c | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/mdbtools.h b/include/mdbtools.h index 527310a..4da6136 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -594,8 +594,8 @@ int mdb_get_option(unsigned long optnum); void mdb_debug(int klass, char *fmt, ...); /* iconv.c */ -int mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); -int mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen); +int mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen); +int mdb_ascii2unicode(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen); void mdb_iconv_init(MdbHandle *mdb); void mdb_iconv_close(MdbHandle *mdb); const char* mdb_target_charset(MdbHandle *mdb); diff --git a/src/libmdb/iconv.c b/src/libmdb/iconv.c index 34dbd17..74f05db 100644 --- a/src/libmdb/iconv.c +++ b/src/libmdb/iconv.c @@ -31,12 +31,13 @@ * This function is used in reading text data from an MDB table. */ int -mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen) +mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen) { char *tmp = NULL; size_t tlen = 0; size_t len_in, len_out; - char *in_ptr, *out_ptr; + const char *in_ptr = NULL; + char *out_ptr = NULL; if ((!src) || (!dest) || (!dlen)) return 0; @@ -73,7 +74,7 @@ mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dle #if HAVE_ICONV //printf("1 len_in %d len_out %d\n",len_in, len_out); while (1) { - iconv(mdb->iconv_in, &in_ptr, &len_in, &out_ptr, &len_out); + iconv(mdb->iconv_in, (char **)&in_ptr, &len_in, &out_ptr, &len_out); /* * Have seen database with odd number of bytes in UCS-2, shouldn't happen but protect against it */ @@ -114,10 +115,11 @@ mdb_unicode2ascii(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dle * If slen is 0, strlen will be used to calculate src's length. */ int -mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dlen) +mdb_ascii2unicode(MdbHandle *mdb, const char *src, size_t slen, char *dest, size_t dlen) { size_t len_in, len_out; - char *in_ptr, *out_ptr; + const char *in_ptr = NULL; + char *out_ptr = NULL; if ((!src) || (!dest) || (!dlen)) return 0; @@ -128,7 +130,7 @@ mdb_ascii2unicode(MdbHandle *mdb, char *src, size_t slen, char *dest, size_t dle len_out = dlen; #ifdef HAVE_ICONV - iconv(mdb->iconv_out, &in_ptr, &len_in, &out_ptr, &len_out); + iconv(mdb->iconv_out, (char **)&in_ptr, &len_in, &out_ptr, &len_out); //printf("len_in %d len_out %d\n", len_in, len_out); dlen -= len_out; #else From 1fc6d60dfa612eb6e8fdd99a65326f9af17c77ec Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 13 Aug 2020 12:06:50 +1000 Subject: [PATCH 2/4] Fix placeholder text used instead of type name in SQLGetData SQLColumns_TYPE_NAME call --- src/odbc/odbc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/odbc/odbc.c b/src/odbc/odbc.c index 447b7c0..6d73d05 100644 --- a/src/odbc/odbc.c +++ b/src/odbc/odbc.c @@ -1340,7 +1340,8 @@ SQLRETURN SQL_API SQLColumns( ts2 = mdb_ascii2unicode(mdb, table->name, 0, (char*)t2, MDB_BIND_SIZE); ts3 = mdb_ascii2unicode(mdb, col->name, 0, (char*)t3, MDB_BIND_SIZE); - ts5 = mdb_ascii2unicode(mdb, "FIX ME", 0, (char*)t5, MDB_BIND_SIZE); + ts5 = mdb_ascii2unicode(mdb, _odbc_get_client_type_name(col), 0, (char*)t5, MDB_BIND_SIZE); + nullable = SQL_NO_NULLS; datatype = _odbc_get_client_type(col); sqldatatype = _odbc_get_client_type(col); From 3f278f3996b1847c09ad0f082c5ed43e579ada91 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 13 Aug 2020 12:11:53 +1000 Subject: [PATCH 3/4] Correctly return len of character data when SQLColAttributes is called with SQL_COLUMN_TYPE_NAME --- src/odbc/odbc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/odbc/odbc.c b/src/odbc/odbc.c index 447b7c0..c017d44 100644 --- a/src/odbc/odbc.c +++ b/src/odbc/odbc.c @@ -839,7 +839,7 @@ SQLRETURN SQL_API SQLColAttributes( { const char *type_name = _odbc_get_client_type_name(col); if (type_name) - snprintf(rgbDesc, cbDescMax, "%s", type_name); + *pcbDesc = snprintf(rgbDesc, cbDescMax, "%s", type_name); break; } case SQL_COLUMN_LENGTH: From 6085a89e1dd7cfdd8ce68db8e5cce1a628da9a26 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 13 Aug 2020 12:42:32 +1000 Subject: [PATCH 4/4] Use ICONV_CONST --- src/libmdb/iconv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libmdb/iconv.c b/src/libmdb/iconv.c index 74f05db..6c193d0 100644 --- a/src/libmdb/iconv.c +++ b/src/libmdb/iconv.c @@ -74,7 +74,7 @@ mdb_unicode2ascii(MdbHandle *mdb, const char *src, size_t slen, char *dest, size #if HAVE_ICONV //printf("1 len_in %d len_out %d\n",len_in, len_out); while (1) { - iconv(mdb->iconv_in, (char **)&in_ptr, &len_in, &out_ptr, &len_out); + iconv(mdb->iconv_in, (ICONV_CONST char **)&in_ptr, &len_in, &out_ptr, &len_out); /* * Have seen database with odd number of bytes in UCS-2, shouldn't happen but protect against it */ @@ -130,7 +130,7 @@ mdb_ascii2unicode(MdbHandle *mdb, const char *src, size_t slen, char *dest, size len_out = dlen; #ifdef HAVE_ICONV - iconv(mdb->iconv_out, (char **)&in_ptr, &len_in, &out_ptr, &len_out); + iconv(mdb->iconv_out, (ICONV_CONST char **)&in_ptr, &len_in, &out_ptr, &len_out); //printf("len_in %d len_out %d\n", len_in, len_out); dlen -= len_out; #else