diff options
Diffstat (limited to 'libodbcpp/error.cpp')
-rw-r--r-- | libodbcpp/error.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/libodbcpp/error.cpp b/libodbcpp/error.cpp index 5497f4d..3d55fc2 100644 --- a/libodbcpp/error.cpp +++ b/libodbcpp/error.cpp @@ -13,29 +13,45 @@ odbc_verror(RETCODE err, SQLSMALLINT handletype, SQLHANDLE handle, char const * SQLCHAR sqlerrmsg[12800]; char * action; - vasprintf(&action, actionfmt, ap); + if (vasprintf(&action, actionfmt, ap) < 0) { + syslog(LOG_WARNING, "%s: %d: %ld: %5.5s: \"%s\" : failed to malloc for vasprintf", + __FUNCTION__, err, sqlerr, sqlstatus, sqlerrmsg); + return; + } SQLRETURN rc = SQLGetDiagRec(handletype, handle, 1, sqlstatus, &sqlerr, sqlerrmsg, sizeof(sqlerrmsg), NULL); switch (rc) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: - asprintf(msg, "%d: %ld: %5.5s: \"%s\" while attempting to %s", - err, sqlerr, sqlstatus, sqlerrmsg, action); + if (msg) { + if (asprintf(msg, "%d: %ld: %5.5s: \"%s\" while attempting to %s", + err, sqlerr, sqlstatus, sqlerrmsg, action) < 1) { + *msg = NULL; + } + } syslog(LOG_WARNING, "%s: %d: %ld: %5.5s: \"%s\" while attempting to %s", __FUNCTION__, err, sqlerr, sqlstatus, sqlerrmsg, action); break; case SQL_INVALID_HANDLE: - asprintf(msg, "(%d) Invalid handle passed into function trying to %s.", - err, action); + if (msg) { + if (asprintf(msg, "(%d) Invalid handle passed into function trying to %s.", + err, action) < 1) { + *msg = NULL; + } + } syslog(LOG_ERR, "%s: (%d) Invalid handle passed into function trying to %s.", __FUNCTION__, err, action); break; case SQL_NO_DATA: - asprintf(msg, "(%d) No error data available for record trying to %s.", - err, action); + if (msg) { + if (asprintf(msg, "(%d) No error data available for record trying to %s.", + err, action) < 1) { + *msg = NULL; + } + } syslog(LOG_ERR, "%s: (%d) No error data available for record trying to %s.", __FUNCTION__, err, action); break; @@ -62,8 +78,10 @@ ODBC::Error::Error(char const * action, ...) va_list ap; va_start(ap, action); - vsyslog(LOG_ERR, action, ap); - vasprintf(&msg, action, ap); + vsyslog(LOG_ERR, action, ap); + if (vasprintf(&msg, action, ap) < 1) { + msg = NULL; + } va_end(ap); } |