Skip to Content.
Sympa Menu

freetds - [freetds] various issues and bug fixes...

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: christos AT zoulas.com (Christos Zoulas)
  • To: freetds AT lists.ibiblio.org
  • Subject: [freetds] various issues and bug fixes...
  • Date: Thu, 29 Sep 2011 15:34:31 -0400


Hi,

a. Deal with kerberos and heimdal. If we enabled krb5 and we found
its libraries add any of the existing /usr/include/krb5
/usr/include/heimdal /usr/include/et to CPPFLAGS
b. check if error_message() exists, if not supply one.
c. include roken.h because getipnode*() is supplied by heimdal on
systems that don't have it, so we don't get prototypes for them
since they are not included in the standard headers.
d. include com_err.h for error_message().
e. add missing prototype for tds_gettime_ms.
f. fix uninitialized variable in challenge.c.
g. wide odbc wouldn't even compile. Deal with string printing properly.
1. define ODBC_STRING and ODBC_STRING_FORMAT to abstract the wide/non-wide
how to retrieve a string and format.
2. on systems where sizeof(wchar_t) is not equal to sizeof(SQLWHAR_T)
supply a conversion function.
3. fix incorrect cast.
4. silence warnings about integer casts of different size to pointer,
annotate them XXX, since they cannot possibly work.


christos

Index: configure.ac
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/configure.ac,v
retrieving revision 1.9
diff -u -u -r1.9 configure.ac
--- configure.ac 29 Sep 2011 16:37:13 -0000 1.9
+++ configure.ac 29 Sep 2011 19:24:11 -0000
@@ -199,6 +199,16 @@
;;
esac

+if test -n "$krb5_libs"
+then
+ for d in /usr/include/heimdal /usr/include/krb5 /usr/include/et; do
+ if test -d "$d"; then
+ CPPFLAGS="$CPPFLAGS -I$d"
+ fi
+ done
+ AC_CHECK_FUNCS([error_message])
+fi
+
NETWORK_LIBS="$LIBS"
LIBS="$OLDLIBS"
AC_SUBST(NETWORK_LIBS)
@@ -296,6 +306,8 @@
netdb.h \
netinet/in.h \
netinet/tcp.h \
+ roken.h \
+ com_err.h \
paths.h \
sys/ioctl.h \
sys/socket.h ])
Index: include/tds.h
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/include/tds.h,v
retrieving revision 1.18
diff -u -u -r1.18 tds.h
--- include/tds.h 29 Sep 2011 16:37:18 -0000 1.18
+++ include/tds.h 29 Sep 2011 19:24:11 -0000
@@ -1214,6 +1214,8 @@
int tdserror (const TDSCONTEXT * tds_ctx, TDSSOCKET * tds, int msgno, int
errnum);
TDS_STATE tds_set_state(TDSSOCKET * tds, TDS_STATE state);
int tds_swap_bytes(unsigned char *buf, int bytes);
+unsigned int tds_gettime_ms(void);
+

/* log.c */
void tdsdump_off(void);
Index: include/tdsodbc.h
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/include/tdsodbc.h,v
retrieving revision 1.8
diff -u -u -r1.8 tdsodbc.h
--- include/tdsodbc.h 29 Sep 2011 16:37:18 -0000 1.8
+++ include/tdsodbc.h 29 Sep 2011 19:24:11 -0000
@@ -578,10 +578,14 @@
char mb[1];
SQLWCHAR wide[1];
} ODBC_CHAR;
+# define ODBC_STRING_FORMAT "%ls"
+# define ODBC_STRING(a) sqlwstr((a)->wide)
# define _wide ,wide
# define _wide0 ,0
# define _WIDE ,int wide
#else
+# define ODBC_STRING_FORMAT "%s"
+# define ODBC_STRING(a) (a)
# define _wide
# define _wide0
# define _WIDE
@@ -656,8 +660,10 @@
*/
#if SIZEOF_SQLWCHAR != SIZEOF_WCHAR_T
size_t sqlwcslen(const SQLWCHAR * s);
+const wchar_t *sqlwstr(const SQLWCHAR * s);
#else
-#define sqlwcslen wcslen
+#define sqlwcslen(s) wcslen(s)
+#define sqlwstr(s) (s)
#endif

#if SIZEOF_SQLWCHAR == 2
Index: src/odbc/odbc.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/odbc/odbc.c,v
retrieving revision 1.7
diff -u -u -r1.7 odbc.c
--- src/odbc/odbc.c 29 Sep 2011 16:37:19 -0000 1.7
+++ src/odbc/odbc.c 29 Sep 2011 19:24:11 -0000
@@ -522,8 +522,11 @@

INIT_HDBC;

- tdsdump_log(TDS_DBG_FUNC, "SQLDriverConnect(%p, %p, %s, %d, %p, %d,
%p, %d)\n",
- hdbc, hwnd, szConnStrIn, cbConnStrIn, szConnStrOut,
cbConnStrOutMax, pcbConnStrOut, fDriverCompletion);
+ tdsdump_log(TDS_DBG_FUNC, "SQLDriverConnect(%p, %p, "
ODBC_STRING_FORMAT
+ ", %d, %p, %d, %p, %d)\n",
+ hdbc, hwnd, ODBC_STRING(szConnStrIn), cbConnStrIn,
+ szConnStrOut, cbConnStrOutMax, pcbConnStrOut,
+ fDriverCompletion);

#ifdef TDS_NO_DM
/* Check string length */
@@ -965,8 +968,10 @@

INIT_HDBC;

- tdsdump_log(TDS_DBG_FUNC, "SQLNativeSql(%p, %s, %d, %p, %d, %p)\n",
- hdbc, szSqlStrIn, (int)cbSqlStrIn, szSqlStr,
(int)cbSqlStrMax, pcbSqlStr);
+ tdsdump_log(TDS_DBG_FUNC, "SQLNativeSql(%p, " ODBC_STRING_FORMAT
+ ", %d, %p, %d, %p)\n",
+ hdbc, ODBC_STRING(szSqlStrIn), (int)cbSqlStrIn, szSqlStr,
+ (int)cbSqlStrMax, pcbSqlStr);

tds_dstr_init(&query);

@@ -2783,7 +2788,7 @@
result = SQL_ERROR;
break;
case SQL_DESC_NAME:
- if (!odbc_dstr_copy_oct(desc_get_dbc(desc),
&drec->sql_desc_name, BufferLength, (SQLCHAR*) Value)) {
+ if (!odbc_dstr_copy_oct(desc_get_dbc(desc),
&drec->sql_desc_name, BufferLength, (ODBC_CHAR*) Value)) {
odbc_errs_add(&desc->errs, "HY001", NULL);
result = SQL_ERROR;
}
@@ -4444,7 +4449,8 @@

INIT_HSTMT;

- tdsdump_log(TDS_DBG_FUNC, "SQLPrepare(%p, %s, %d)\n", hstmt,
szSqlStr, (int)cbSqlStr);
+ tdsdump_log(TDS_DBG_FUNC, "SQLPrepare(%p, " ODBC_STRING_FORMAT
+ ", %d)\n", hstmt, ODBC_STRING(szSqlStr), (int)cbSqlStr);

/* try to free dynamic associated */
retcode = odbc_free_dynamic(stmt);
@@ -4694,8 +4700,13 @@

INIT_HSTMT;

- tdsdump_log(TDS_DBG_FUNC, "SQLColumns(%p, %s, %d, %s, %d, %s, %d, %s,
%d)\n",
- hstmt, szCatalogName, cbCatalogName, szSchemaName,
cbSchemaName, szTableName, cbTableName, szColumnName, cbColumnName);
+ tdsdump_log(TDS_DBG_FUNC, "SQLColumns(%p, " ODBC_STRING_FORMAT ", %d,
"
+ ODBC_STRING_FORMAT ", %d, " ODBC_STRING_FORMAT ", %d, "
+ ODBC_STRING_FORMAT ", %d)\n",
+ hstmt, ODBC_STRING(szCatalogName), cbCatalogName,
+ ODBC_STRING(szSchemaName), cbSchemaName,
+ ODBC_STRING(szTableName), cbTableName,
+ ODBC_STRING(szColumnName), cbColumnName);

retcode =
odbc_stat_execute(stmt _wide, "sp_columns",
TDS_IS_MSSQL(stmt->dbc->tds_socket) ? 5 : 4,
@@ -6201,7 +6212,8 @@
SQLSetConnectOption(SQLHDBC hdbc, SQLUSMALLINT fOption, SQLULEN vParam)
{
tdsdump_log(TDS_DBG_FUNC, "SQLSetConnectOption(%p, %d, %u)\n", hdbc,
fOption, (unsigned)vParam);
- return _SQLSetConnectAttr(hdbc, (SQLINTEGER) fOption, (SQLPOINTER)
vParam, SQL_NTS _wide0);
+ /* XXX: Lost precision */
+ return _SQLSetConnectAttr(hdbc, (SQLINTEGER) fOption, (SQLPOINTER)
(TDS_INTPTR) vParam, SQL_NTS _wide0);
}

#ifdef ENABLE_ODBC_WIDE
@@ -6209,7 +6221,8 @@
SQLSetConnectOptionW(SQLHDBC hdbc, SQLUSMALLINT fOption, SQLULEN vParam)
{
tdsdump_log(TDS_DBG_FUNC, "SQLSetConnectOptionW(%p, %d, %u)\n", hdbc,
fOption, (unsigned)vParam);
- return _SQLSetConnectAttr(hdbc, (SQLINTEGER) fOption, (SQLPOINTER)
vParam, SQL_NTS, 1);
+ /* XXX: Lost precision */
+ return _SQLSetConnectAttr(hdbc, (SQLINTEGER) fOption, (SQLPOINTER)
(TDS_INTPTR) vParam, SQL_NTS, 1);
}
#endif

@@ -6520,7 +6533,8 @@
{
tdsdump_log(TDS_DBG_FUNC, "SQLSetStmtOption(%p, %u, %u)\n", hstmt,
fOption, (unsigned)vParam);

- return _SQLSetStmtAttr(hstmt, (SQLINTEGER) fOption, (SQLPOINTER)
vParam, SQL_NTS);
+ /* XXX: Lost precision */
+ return _SQLSetStmtAttr(hstmt, (SQLINTEGER) fOption, (SQLPOINTER)
(TDS_INTPTR) vParam, SQL_NTS);
}

#define FUNC NAME(SQLSpecialColumns) (P(SQLHSTMT,hstmt),
P(SQLUSMALLINT,fColType), PCHARIN(CatalogName,SQLSMALLINT), \
Index: src/odbc/sqlwchar.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/odbc/sqlwchar.c,v
retrieving revision 1.1.1.5
diff -u -u -r1.1.1.5 sqlwchar.c
--- src/odbc/sqlwchar.c 29 Sep 2011 16:34:50 -0000 1.1.1.5
+++ src/odbc/sqlwchar.c 29 Sep 2011 19:24:11 -0000
@@ -35,5 +35,17 @@
++p;
return p - s;
}
+
+const wchar_t *sqlwstr(const SQLWCHAR *s)
+{
+ static wchar_t buf[1024], *eb = buf + sizeof(buf) - 1;
+ wchar_t *p;
+
+ for (p = buf; *s && p < eb; *p++ = *s++)
+ continue;
+ *p = '\0';
+
+ return buf;
+}
#endif

Index: src/tds/challenge.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/challenge.c,v
retrieving revision 1.1.1.13
diff -u -u -r1.1.1.13 challenge.c
--- src/tds/challenge.c 29 Sep 2011 16:34:50 -0000 1.1.1.13
+++ src/tds/challenge.c 29 Sep 2011 19:24:11 -0000
@@ -640,7 +640,7 @@
int data_block_offset;

int target_info_len = 0;
- int target_info_offset;
+ int target_info_offset = 0;

int names_blob_len;
unsigned char *names_blob;
Index: src/tds/gssapi.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/gssapi.c,v
retrieving revision 1.1.1.5
diff -u -u -r1.1.1.5 gssapi.c
--- src/tds/gssapi.c 29 Sep 2011 16:34:50 -0000 1.1.1.5
+++ src/tds/gssapi.c 29 Sep 2011 19:24:11 -0000
@@ -53,6 +53,10 @@
#include <arpa/inet.h>
#endif /* HAVE_ARPA_INET_H */

+#if HAVE_COM_ERR_H
+#include <com_err.h>
+#endif /* HAVE_COM_ERR_H */
+
#ifdef ENABLE_KRB5

#include <gssapi/gssapi_krb5.h>
@@ -249,6 +253,16 @@

return (TDSAUTHENTICATION *) auth;
}
+
+#ifndef HAVE_ERROR_MESSAGE
+static const char *
+error_message(OM_uint32 e)
+{
+ const char *m = strerror(e);
+ if (m == NULL)
+ return "";
+}
+#endif

static TDSRET
tds_gss_continue(TDSSOCKET * tds, struct tds_gss_auth *auth, gss_buffer_desc
*token_ptr)
Index: src/tds/threadsafe.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/threadsafe.c,v
retrieving revision 1.1.1.13
diff -u -u -r1.1.1.13 threadsafe.c
--- src/tds/threadsafe.c 29 Sep 2011 16:34:50 -0000 1.1.1.13
+++ src/tds/threadsafe.c 29 Sep 2011 19:24:11 -0000
@@ -72,6 +72,10 @@
#include <arpa/inet.h>
#endif /* HAVE_ARPA_INET_H */

+#if HAVE_ROKEN_H
+#include <roken.h>
+#endif /* HAVE_ROKEN_H */
+
#if defined(_WIN32) || defined(_WIN64)
#include <winsock2.h>
#include <shlobj.h>



  • [freetds] various issues and bug fixes..., Christos Zoulas, 09/29/2011

Archive powered by MHonArc 2.6.24.

Top of Page