freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
Re: [freetds] help FOLLOW UP- problem fixed, and possible bug discovered
- From: Thomas Stover <thomas AT wsinnovations.com>
- To: freetds AT lists.ibiblio.org
- Subject: Re: [freetds] help FOLLOW UP- problem fixed, and possible bug discovered
- Date: Tue, 08 Jul 2008 13:01:09 -0500
Well I finally tracked down the source of my troubles to the server side. However I had to revert back to 0.63 to do it. So that's why I'm writing back - the program below only gets the NULL pointer problem with 0.82. Most likely I'm doing something wrong, but I would still be nice to upgrade again.
Thomas Stover wrote:
OK everything was working fine. Then over the weekend something happened somewhere, and now I can't get a connection to our ms sql 2000 server even with a simple test program. I was using 0.63-3.2.ubuntu x86_64. (why was ubuntu so out of date?) So I removed that package, and built 0.82 from source. I get a segfault trying to difference a NULL pointer. Here is my test program and valgrind output. Any ideas? I did look at that line in dblib.c, and it looks like you might need to check for NULL. Or is that the point - it should never be NULL?
Anyone else do a 'doz update or anything that broke their setup lately?
#include <stdio.h>
#include <sqlfront.h>
#include <sqldb.h>
#include <string.h>
#ifndef HAVE_WINDOWS_H
#define PDBPROCESS DBPROCESS *
#define PLOGINREC LOGINREC *
#endif
int err_handler(DBPROCESS *dbproc, int severity, int dberr,
int oserr, char *dberrstr, char *oserrstr)
{
fprintf(stderr, "DB-Library Error %i: %s\ns", dberr, dberrstr);
if (oserr != DBNOERR)
fprintf(stderr, "Operating System Error %i: %s\n", oserr, oserrstr);
return INT_CANCEL;
}
int msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate,
int severity, char *msgtext, char *srvname, char *proc, int line)
{
fprintf(stderr, "SQL Server Message %d: %s\n" , msgno, msgtext);
return 0;
}
int main(void)
{
unsigned char temp[512];
PDBPROCESS dbproc;
PLOGINREC login;
int ncols, x;
dberrhandle(err_handler);
dbmsghandle(msg_handler);
dbinit();
login = dblogin();
#ifdef HAVE_WINDOWS_H
DBSETLSECURE(login);
#else
DBSETLUSER(login, "domain\\username");
DBSETLPWD(login, "password");
#endif
DBSETLAPP(login, "dblib experiment program");
dbproc = dbopen(login, "sqlserver");
dbcmd(dbproc, "SELECT TOP 1 * From [Stats] .. Hourly"); dbsqlexec(dbproc);
if(dbresults(dbproc) == SUCCEED)
{
ncols = dbnumcols(dbproc);
dbbind(dbproc, 1, NTBSTRINGBIND, 0, temp);
for(x = 1; x < ncols; x++)
{
printf("%s\t", dbcolname(dbproc, x + 1));
}
printf("\n");
while(dbnextrow(dbproc) != NO_MORE_ROWS)
{
/* this is the only way to move past any extra rows returned? */
}
}
dbfreebuf(dbproc);
#ifdef HAVE_WINDOWS_H
dbfreelogin(login);
#else
dbloginfree(login);
#endif
dbexit();
return 0;
}
==4311== Memcheck, a memory error detector.
==4311== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==4311== Using LibVEX rev 1804, a library for dynamic binary translation.
==4311== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==4311== Using valgrind-3.3.0-Debian, a dynamic binary instrumentation framework.
==4311== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==4311== For more details, rerun with: -v
==4311==
==4311== Invalid read of size 8
==4311== at 0x4E33D91: dbdead (dblib.c:4747)
==4311== by 0x4E33EC9: default_err_handler (dblib.c:4779)
==4311== by 0x4E313AA: dbperror (dblib.c:7838)
==4311== by 0x4E3B1F3: dbcmd (dblib.c:1244)
==4311== by 0x400C5B: main (dblibtest.c:54)
==4311== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==4311==
==4311== Process terminating with default action of signal 11 (SIGSEGV)
==4311== Access not within mapped region at address 0x0
==4311== at 0x4E33D91: dbdead (dblib.c:4747)
==4311== by 0x4E33EC9: default_err_handler (dblib.c:4779)
==4311== by 0x4E313AA: dbperror (dblib.c:7838)
==4311== by 0x4E3B1F3: dbcmd (dblib.c:1244)
==4311== by 0x400C5B: main (dblibtest.c:54)
==4311==
==4311== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 48 from 6)
==4311== malloc/free: in use at exit: 33,474 bytes in 25 blocks.
==4311== malloc/free: 188 allocs, 163 frees, 224,841 bytes allocated.
==4311== For counts of detected errors, rerun with: -v
==4311== searching for pointers to 25 not-freed blocks.
==4311== checked 167,272 bytes.
==4311==
==4311== LEAK SUMMARY:
==4311== definitely lost: 292 bytes in 11 blocks.
==4311== possibly lost: 0 bytes in 0 blocks.
==4311== still reachable: 33,182 bytes in 14 blocks.
==4311== suppressed: 0 bytes in 0 blocks.
==4311== Rerun with --leak-check=full to see details of leaked memory.
Segmentation fault
Thanks
-
[freetds] help,
Thomas Stover, 07/07/2008
- Re: [freetds] help FOLLOW UP- problem fixed, and possible bug discovered, Thomas Stover, 07/08/2008
- Re: [freetds] help, James K. Lowden, 07/08/2008
Archive powered by MHonArc 2.6.24.