PageRenderTime 61ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/tds/net.c

https://gitlab.com/xk/FreeTDS
C | 1604 lines | 1202 code | 210 blank | 192 comment | 244 complexity | 8a01ecb413233279a18eb9967f1fc5cf MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0
  1. /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
  2. * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Brian Bruns
  3. * Copyright (C) 2004-2015 Ziglio Frediano
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Library General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Library General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Library General Public
  16. * License along with this library; if not, write to the
  17. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  18. * Boston, MA 02111-1307, USA.
  19. */
  20. #include <config.h>
  21. #include <stdarg.h>
  22. #include <stdio.h>
  23. #include <freetds/time.h>
  24. #if HAVE_SYS_TYPES_H
  25. #include <sys/types.h>
  26. #endif /* HAVE_SYS_TYPES_H */
  27. #if HAVE_ERRNO_H
  28. #include <errno.h>
  29. #endif /* HAVE_ERRNO_H */
  30. #if HAVE_UNISTD_H
  31. #include <unistd.h>
  32. #endif /* HAVE_UNISTD_H */
  33. #if HAVE_STDLIB_H
  34. #include <stdlib.h>
  35. #endif /* HAVE_STDLIB_H */
  36. #if HAVE_STRING_H
  37. #include <string.h>
  38. #endif /* HAVE_STRING_H */
  39. #if HAVE_SYS_SOCKET_H
  40. #include <sys/socket.h>
  41. #endif /* HAVE_SYS_SOCKET_H */
  42. #if HAVE_NETINET_IN_H
  43. #include <netinet/in.h>
  44. #endif /* HAVE_NETINET_IN_H */
  45. #if HAVE_NETINET_TCP_H
  46. #include <netinet/tcp.h>
  47. #endif /* HAVE_NETINET_TCP_H */
  48. #if HAVE_ARPA_INET_H
  49. #include <arpa/inet.h>
  50. #endif /* HAVE_ARPA_INET_H */
  51. #if HAVE_SYS_IOCTL_H
  52. #include <sys/ioctl.h>
  53. #endif /* HAVE_SYS_IOCTL_H */
  54. #if HAVE_SELECT_H
  55. #include <sys/select.h>
  56. #endif /* HAVE_SELECT_H */
  57. #if HAVE_POLL_H
  58. #include <poll.h>
  59. #endif /* HAVE_POLL_H */
  60. #include <freetds/tds.h>
  61. #include <freetds/string.h>
  62. #include "replacements.h"
  63. #include <signal.h>
  64. #include <assert.h>
  65. #ifdef HAVE_GNUTLS
  66. #if defined(_THREAD_SAFE) && defined(TDS_HAVE_PTHREAD_MUTEX)
  67. #include <freetds/thread.h>
  68. #include <gcrypt.h>
  69. #endif
  70. #include <gnutls/gnutls.h>
  71. #elif defined(HAVE_OPENSSL)
  72. #include <openssl/ssl.h>
  73. #endif
  74. /* error is always returned */
  75. #define TDSSELERR 0
  76. #define TDSPOLLURG 0x8000u
  77. #if ENABLE_ODBC_MARS
  78. static void tds_check_cancel(TDSCONNECTION *conn);
  79. #endif
  80. /**
  81. * \addtogroup network
  82. * @{
  83. */
  84. #ifdef _WIN32
  85. int
  86. tds_socket_init(void)
  87. {
  88. WSADATA wsadata;
  89. return WSAStartup(MAKEWORD(1, 1), &wsadata);
  90. }
  91. void
  92. tds_socket_done(void)
  93. {
  94. WSACleanup();
  95. }
  96. #endif
  97. #if !defined(SOL_TCP) && (defined(IPPROTO_TCP) || defined(_WIN32))
  98. /* fix incompatibility between MS headers */
  99. # ifndef IPPROTO_TCP
  100. # define IPPROTO_TCP IPPROTO_TCP
  101. # endif
  102. # define SOL_TCP IPPROTO_TCP
  103. #endif
  104. /* Optimize the way we send packets */
  105. #undef USE_MSGMORE
  106. #undef USE_CORK
  107. #undef USE_NODELAY
  108. /* On Linux 2.4.x we can use MSG_MORE */
  109. #if defined(__linux__) && defined(MSG_MORE)
  110. #define USE_MSGMORE 1
  111. /* On early Linux use TCP_CORK if available */
  112. #elif defined(__linux__) && defined(TCP_CORK)
  113. #define USE_CORK 1
  114. /* On *BSD try to use TCP_CORK */
  115. /*
  116. * NOPUSH flag do not behave in the same way
  117. * cf ML "FreeBSD 5.0 performance problems with TCP_NOPUSH"
  118. */
  119. #elif (defined(__FreeBSD__) || defined(__GNU_FreeBSD__) || defined(__OpenBSD__)) && defined(TCP_CORK)
  120. #define USE_CORK 1
  121. /* otherwise use NODELAY */
  122. #elif defined(TCP_NODELAY) && defined(SOL_TCP)
  123. #define USE_NODELAY 1
  124. /* under VMS we have to define TCP_NODELAY */
  125. #elif defined(__VMS)
  126. #define TCP_NODELAY 1
  127. #define USE_NODELAY 1
  128. #endif
  129. #if !defined(_WIN32)
  130. typedef unsigned int ioctl_nonblocking_t;
  131. #else
  132. typedef u_long ioctl_nonblocking_t;
  133. #endif
  134. static void
  135. tds_addrinfo_set_port(struct tds_addrinfo *addr, unsigned int port)
  136. {
  137. assert(addr != NULL);
  138. switch(addr->ai_family) {
  139. case AF_INET:
  140. ((struct sockaddr_in *) addr->ai_addr)->sin_port = htons(port);
  141. break;
  142. #ifdef AF_INET6
  143. case AF_INET6:
  144. ((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = htons(port);
  145. break;
  146. #endif
  147. }
  148. }
  149. const char*
  150. tds_addrinfo2str(struct tds_addrinfo *addr, char *name, int namemax)
  151. {
  152. #ifndef NI_NUMERICHOST
  153. #define NI_NUMERICHOST 0
  154. #endif
  155. if (!name || namemax <= 0)
  156. return "";
  157. if (tds_getnameinfo(addr->ai_addr, addr->ai_addrlen, name, namemax, NULL, 0, NI_NUMERICHOST) == 0)
  158. return name;
  159. name[0] = 0;
  160. return name;
  161. }
  162. TDSERRNO
  163. tds_open_socket(TDSSOCKET *tds, struct tds_addrinfo *addr, unsigned int port, int timeout, int *p_oserr)
  164. {
  165. ioctl_nonblocking_t ioctl_nonblocking;
  166. SOCKLEN_T optlen;
  167. TDSCONNECTION *conn = tds->conn;
  168. char ipaddr[128];
  169. int retval, len;
  170. TDSERRNO tds_error = TDSECONN;
  171. *p_oserr = 0;
  172. tds_addrinfo_set_port(addr, port);
  173. tds_addrinfo2str(addr, ipaddr, sizeof(ipaddr));
  174. tdsdump_log(TDS_DBG_INFO1, "Connecting to %s port %d (TDS version %d.%d)\n",
  175. ipaddr, port,
  176. TDS_MAJOR(conn), TDS_MINOR(conn));
  177. conn->s = socket(addr->ai_family, SOCK_STREAM, 0);
  178. if (TDS_IS_SOCKET_INVALID(conn->s)) {
  179. *p_oserr = sock_errno;
  180. tdsdump_log(TDS_DBG_ERROR, "socket creation error: %s\n", sock_strerror(sock_errno));
  181. return TDSESOCK;
  182. }
  183. #ifdef SO_KEEPALIVE
  184. len = 1;
  185. setsockopt(conn->s, SOL_SOCKET, SO_KEEPALIVE, (const void *) &len, sizeof(len));
  186. #endif
  187. #if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL)
  188. len = 40;
  189. setsockopt(conn->s, SOL_TCP, TCP_KEEPIDLE, (const void *) &len, sizeof(len));
  190. len = 2;
  191. setsockopt(conn->s, SOL_TCP, TCP_KEEPINTVL, (const void *) &len, sizeof(len));
  192. #endif
  193. #if defined(__APPLE__) && defined(SO_NOSIGPIPE)
  194. len = 1;
  195. if (setsockopt(conn->s, SOL_SOCKET, SO_NOSIGPIPE, (const void *) &len, sizeof(len))) {
  196. *p_oserr = sock_errno;
  197. tds_connection_close(conn);
  198. return TDSESOCK;
  199. }
  200. #endif
  201. len = 1;
  202. #if defined(USE_NODELAY) || defined(USE_MSGMORE)
  203. setsockopt(conn->s, SOL_TCP, TCP_NODELAY, (const void *) &len, sizeof(len));
  204. #elif defined(USE_CORK)
  205. if (setsockopt(conn->s, SOL_TCP, TCP_CORK, (const void *) &len, sizeof(len)) < 0)
  206. setsockopt(conn->s, SOL_TCP, TCP_NODELAY, (const void *) &len, sizeof(len));
  207. #else
  208. #error One should be defined
  209. #endif
  210. #ifdef DOS32X /* the other connection doesn't work on WATTCP32 */
  211. if (connect(conn->s, addr->ai_addr, addr->ai_addrlen) < 0) {
  212. char *message;
  213. *p_oserr = sock_errno;
  214. if (asprintf(&message, "tds_open_socket(): %s:%d", ipaddr, port) >= 0) {
  215. perror(message);
  216. free(message);
  217. }
  218. tds_connection_close(conn);
  219. return TDSECONN;
  220. }
  221. #else
  222. if (!timeout) {
  223. /* A timeout of zero means wait forever; 90,000 seconds will feel like forever. */
  224. timeout = 90000;
  225. }
  226. /* enable non-blocking mode */
  227. ioctl_nonblocking = 1;
  228. if (IOCTLSOCKET(conn->s, FIONBIO, &ioctl_nonblocking) < 0) {
  229. *p_oserr = sock_errno;
  230. tds_connection_close(conn);
  231. return TDSEUSCT; /* close enough: "Unable to set communications timer" */
  232. }
  233. retval = connect(conn->s, addr->ai_addr, addr->ai_addrlen);
  234. if (retval == 0) {
  235. tdsdump_log(TDS_DBG_INFO2, "connection established\n");
  236. } else {
  237. int err = *p_oserr = sock_errno;
  238. tdsdump_log(TDS_DBG_ERROR, "tds_open_socket: connect(2) returned \"%s\"\n", sock_strerror(err));
  239. #if DEBUGGING_CONNECTING_PROBLEM
  240. if (err != ECONNREFUSED && err != ENETUNREACH && err != TDSSOCK_EINPROGRESS) {
  241. tdsdump_dump_buf(TDS_DBG_ERROR, "Contents of sockaddr_in", addr->ai_addr, addr->ai_addrlen);
  242. tdsdump_log(TDS_DBG_ERROR, " sockaddr_in:\t"
  243. "%s = %x\n"
  244. "\t\t\t%s = %x\n"
  245. "\t\t\t%s = %s\n"
  246. , "sin_family", addr->ai_family
  247. , "port", port
  248. , "address", ipaddr
  249. );
  250. }
  251. #endif
  252. if (err != TDSSOCK_EINPROGRESS)
  253. goto not_available;
  254. *p_oserr = TDSSOCK_ETIMEDOUT;
  255. if (tds_select(tds, TDSSELWRITE|TDSSELERR, timeout) <= 0) {
  256. tds_error = TDSECONN;
  257. goto not_available;
  258. }
  259. }
  260. #endif /* not DOS32X */
  261. /* check socket error */
  262. optlen = sizeof(len);
  263. len = 0;
  264. if (tds_getsockopt(conn->s, SOL_SOCKET, SO_ERROR, (char *) &len, &optlen) != 0) {
  265. *p_oserr = sock_errno;
  266. tdsdump_log(TDS_DBG_ERROR, "getsockopt(2) failed: %s\n", sock_strerror(sock_errno));
  267. goto not_available;
  268. }
  269. if (len != 0) {
  270. *p_oserr = len;
  271. tdsdump_log(TDS_DBG_ERROR, "getsockopt(2) reported: %s\n", sock_strerror(len));
  272. goto not_available;
  273. }
  274. tdsdump_log(TDS_DBG_ERROR, "tds_open_socket() succeeded\n");
  275. return TDSEOK;
  276. not_available:
  277. tds_connection_close(conn);
  278. tdsdump_log(TDS_DBG_ERROR, "tds_open_socket() failed\n");
  279. return tds_error;
  280. }
  281. /**
  282. * Close current socket
  283. * for last socket close entire connection
  284. * for MARS send FIN request
  285. */
  286. void
  287. tds_close_socket(TDSSOCKET * tds)
  288. {
  289. if (!IS_TDSDEAD(tds)) {
  290. #if ENABLE_ODBC_MARS
  291. TDSCONNECTION *conn = tds->conn;
  292. unsigned n = 0, count = 0;
  293. tds_mutex_lock(&conn->list_mtx);
  294. for (; n < conn->num_sessions; ++n)
  295. if (TDSSOCKET_VALID(conn->sessions[n]))
  296. ++count;
  297. if (count > 1)
  298. tds_append_fin(tds);
  299. tds_mutex_unlock(&conn->list_mtx);
  300. if (count <= 1) {
  301. tds_disconnect(tds);
  302. tds_connection_close(conn);
  303. } else {
  304. tds_set_state(tds, TDS_DEAD);
  305. }
  306. #else
  307. tds_disconnect(tds);
  308. if (CLOSESOCKET(tds_get_s(tds)) == -1)
  309. tdserror(tds_get_ctx(tds), tds, TDSECLOS, sock_errno);
  310. tds_set_s(tds, INVALID_SOCKET);
  311. tds_set_state(tds, TDS_DEAD);
  312. #endif
  313. }
  314. }
  315. #if ENABLE_ODBC_MARS
  316. void
  317. tds_connection_close(TDSCONNECTION *conn)
  318. {
  319. unsigned n = 0;
  320. if (!TDS_IS_SOCKET_INVALID(conn->s)) {
  321. /* TODO check error ?? how to return it ?? */
  322. CLOSESOCKET(conn->s);
  323. conn->s = INVALID_SOCKET;
  324. }
  325. tds_mutex_lock(&conn->list_mtx);
  326. for (; n < conn->num_sessions; ++n)
  327. if (TDSSOCKET_VALID(conn->sessions[n]))
  328. tds_set_state(conn->sessions[n], TDS_DEAD);
  329. tds_mutex_unlock(&conn->list_mtx);
  330. }
  331. #endif
  332. /**
  333. * Select on a socket until it's available or the timeout expires.
  334. * Meanwhile, call the interrupt function.
  335. * \return >0 ready descriptors
  336. * 0 timeout
  337. * <0 error (cf. errno). Caller should close socket and return failure.
  338. * This function does not call tdserror or close the socket because it can't know the context in which it's being called.
  339. */
  340. int
  341. tds_select(TDSSOCKET * tds, unsigned tds_sel, int timeout_seconds)
  342. {
  343. int rc, seconds;
  344. unsigned int poll_seconds;
  345. assert(tds != NULL);
  346. assert(timeout_seconds >= 0);
  347. /*
  348. * The select loop.
  349. * If an interrupt handler is installed, we iterate once per second,
  350. * else we try once, timing out after timeout_seconds (0 == never).
  351. * If select(2) is interrupted by a signal (e.g. press ^C in sqsh), we timeout.
  352. * (The application can retry if desired by installing a signal handler.)
  353. *
  354. * We do not measure current time against end time, to avoid being tricked by ntpd(8) or similar.
  355. * Instead, we just count down.
  356. *
  357. * We exit on the first of these events:
  358. * 1. a descriptor is ready. (return to caller)
  359. * 2. select(2) returns an important error. (return to caller)
  360. * A timeout of zero says "wait forever". We do that by passing a NULL timeval pointer to select(2).
  361. */
  362. poll_seconds = (tds_get_ctx(tds) && tds_get_ctx(tds)->int_handler)? 1 : timeout_seconds;
  363. for (seconds = timeout_seconds; timeout_seconds == 0 || seconds > 0; seconds -= poll_seconds) {
  364. struct pollfd fds[2];
  365. int timeout = poll_seconds ? poll_seconds * 1000 : -1;
  366. if (TDS_IS_SOCKET_INVALID(tds_get_s(tds)))
  367. return -1;
  368. fds[0].fd = tds_get_s(tds);
  369. fds[0].events = tds_sel;
  370. fds[0].revents = 0;
  371. fds[1].fd = tds->conn->s_signaled;
  372. fds[1].events = POLLIN;
  373. fds[1].revents = 0;
  374. rc = poll(fds, 2, timeout);
  375. if (rc > 0 ) {
  376. if (fds[0].revents & POLLERR)
  377. return -1;
  378. rc = fds[0].revents;
  379. if (fds[1].revents) {
  380. #if ENABLE_ODBC_MARS
  381. tds_check_cancel(tds->conn);
  382. #endif
  383. rc |= TDSPOLLURG;
  384. }
  385. return rc;
  386. }
  387. if (rc < 0) {
  388. switch (sock_errno) {
  389. case TDSSOCK_EINTR:
  390. /* FIXME this should be global maximun, not loop one */
  391. seconds += poll_seconds;
  392. break; /* let interrupt handler be called */
  393. default: /* documented: EFAULT, EBADF, EINVAL */
  394. tdsdump_log(TDS_DBG_ERROR, "error: poll(2) returned %d, \"%s\"\n",
  395. sock_errno, sock_strerror(sock_errno));
  396. return rc;
  397. }
  398. }
  399. assert(rc == 0 || (rc < 0 && sock_errno == TDSSOCK_EINTR));
  400. if (tds_get_ctx(tds) && tds_get_ctx(tds)->int_handler) { /* interrupt handler installed */
  401. /*
  402. * "If hndlintr() returns INT_CANCEL, DB-Library sends an attention token [TDS_BUFSTAT_ATTN]
  403. * to the server. This causes the server to discontinue command processing.
  404. * The server may send additional results that have already been computed.
  405. * When control returns to the mainline code, the mainline code should do
  406. * one of the following:
  407. * - Flush the results using dbcancel
  408. * - Process the results normally"
  409. */
  410. int timeout_action = (*tds_get_ctx(tds)->int_handler) (tds_get_parent(tds));
  411. switch (timeout_action) {
  412. case TDS_INT_CONTINUE: /* keep waiting */
  413. continue;
  414. case TDS_INT_CANCEL: /* abort the current command batch */
  415. /* FIXME tell tds_goodread() not to call tdserror() */
  416. return 0;
  417. default:
  418. tdsdump_log(TDS_DBG_NETWORK,
  419. "tds_select: invalid interupt handler return code: %d\n", timeout_action);
  420. return -1;
  421. }
  422. }
  423. /*
  424. * We can reach here if no interrupt handler was installed and we either timed out or got EINTR.
  425. * We cannot be polling, so we are about to drop out of the loop.
  426. */
  427. assert(poll_seconds == timeout_seconds);
  428. }
  429. return 0;
  430. }
  431. /**
  432. * Read from an OS socket
  433. * @TODO remove tds, save error somewhere, report error in another way
  434. * @returns 0 if blocking, <0 error >0 bytes read
  435. */
  436. static int
  437. tds_socket_read(TDSCONNECTION * conn, TDSSOCKET *tds, unsigned char *buf, int buflen)
  438. {
  439. int len, err;
  440. /* read directly from socket*/
  441. len = READSOCKET(conn->s, buf, buflen);
  442. if (len > 0)
  443. return len;
  444. err = sock_errno;
  445. if (len < 0 && TDSSOCK_WOULDBLOCK(err))
  446. return 0;
  447. /* detect connection close */
  448. tds_connection_close(conn);
  449. tdserror(conn->tds_ctx, tds, len == 0 ? TDSESEOF : TDSEREAD, len == 0 ? 0 : err);
  450. return -1;
  451. }
  452. /**
  453. * Write to an OS socket
  454. * @returns 0 if blocking, <0 error >0 bytes readed
  455. */
  456. static int
  457. tds_socket_write(TDSCONNECTION *conn, TDSSOCKET *tds, const unsigned char *buf, int buflen, int last)
  458. {
  459. int err, len;
  460. #ifdef USE_MSGMORE
  461. len = send(conn->s, buf, buflen, last ? MSG_NOSIGNAL : MSG_NOSIGNAL|MSG_MORE);
  462. /* In case the kernel does not support MSG_MORE, try again without it */
  463. if (len < 0 && errno == EINVAL && !last)
  464. len = send(conn->s, buf, buflen, MSG_NOSIGNAL);
  465. #elif defined(__APPLE__) && defined(SO_NOSIGPIPE)
  466. len = send(conn->s, buf, buflen, 0);
  467. #else
  468. len = WRITESOCKET(conn->s, buf, buflen);
  469. #endif
  470. if (len > 0)
  471. return len;
  472. err = sock_errno;
  473. if (0 == len || TDSSOCK_WOULDBLOCK(err))
  474. return 0;
  475. assert(len < 0);
  476. /* detect connection close */
  477. tdsdump_log(TDS_DBG_NETWORK, "send(2) failed: %d (%s)\n", err, sock_strerror(err));
  478. tds_connection_close(conn);
  479. tdserror(conn->tds_ctx, tds, TDSEWRIT, err);
  480. return -1;
  481. }
  482. #if ENABLE_ODBC_MARS
  483. static void
  484. tds_check_cancel(TDSCONNECTION *conn)
  485. {
  486. TDSSOCKET *tds;
  487. int rc, len;
  488. char to_cancel[16];
  489. len = READSOCKET(conn->s_signaled, to_cancel, sizeof(to_cancel));
  490. do {
  491. /* no cancel found */
  492. if (len <= 0) return;
  493. } while(!to_cancel[--len]);
  494. do {
  495. unsigned n = 0;
  496. rc = TDS_SUCCESS;
  497. tds_mutex_lock(&conn->list_mtx);
  498. /* Here we scan all list searching for sessions that should send cancel packets */
  499. for (; n < conn->num_sessions; ++n)
  500. if (TDSSOCKET_VALID(tds=conn->sessions[n]) && tds->in_cancel == 1) {
  501. /* send cancel */
  502. tds->in_cancel = 2;
  503. tds_mutex_unlock(&conn->list_mtx);
  504. rc = tds_append_cancel(tds);
  505. tds_mutex_lock(&conn->list_mtx);
  506. if (rc != TDS_SUCCESS)
  507. break;
  508. }
  509. tds_mutex_unlock(&conn->list_mtx);
  510. /* for all failed */
  511. /* this must be done outside loop cause it can alter list */
  512. /* this must be done unlocked cause it can lock again */
  513. if (rc != TDS_SUCCESS)
  514. tds_close_socket(tds);
  515. } while(rc != TDS_SUCCESS);
  516. }
  517. #endif
  518. /**
  519. * Loops until we have received some characters
  520. * return -1 on failure
  521. */
  522. static int
  523. tds_goodread(TDSSOCKET * tds, unsigned char *buf, int buflen)
  524. {
  525. if (tds == NULL || buf == NULL || buflen < 1)
  526. return -1;
  527. for (;;) {
  528. int len, err;
  529. /* FIXME this block writing from other sessions */
  530. len = tds_select(tds, TDSSELREAD, tds->query_timeout);
  531. #if !ENABLE_ODBC_MARS
  532. if (len > 0 && (len & TDSPOLLURG)) {
  533. char buf[32];
  534. READSOCKET(tds->conn->s_signaled, buf, sizeof(buf));
  535. /* send cancel */
  536. if (!tds->in_cancel)
  537. tds_put_cancel(tds);
  538. continue;
  539. }
  540. #endif
  541. if (len > 0) {
  542. len = tds_socket_read(tds->conn, tds, buf, buflen);
  543. if (len == 0)
  544. continue;
  545. return len;
  546. }
  547. /* error */
  548. if (len < 0) {
  549. if (TDSSOCK_WOULDBLOCK(sock_errno)) /* shouldn't happen, but OK */
  550. continue;
  551. err = sock_errno;
  552. tds_connection_close(tds->conn);
  553. tdserror(tds_get_ctx(tds), tds, TDSEREAD, err);
  554. return -1;
  555. }
  556. /* timeout */
  557. switch (tdserror(tds_get_ctx(tds), tds, TDSETIME, sock_errno)) {
  558. case TDS_INT_CONTINUE:
  559. break;
  560. default:
  561. case TDS_INT_CANCEL:
  562. tds_close_socket(tds);
  563. return -1;
  564. }
  565. }
  566. }
  567. int
  568. tds_connection_read(TDSSOCKET * tds, unsigned char *buf, int buflen)
  569. {
  570. TDSCONNECTION *conn = tds->conn;
  571. #ifdef HAVE_GNUTLS
  572. if (conn->tls_session)
  573. return gnutls_record_recv((gnutls_session) conn->tls_session, buf, buflen);
  574. #elif defined(HAVE_OPENSSL)
  575. if (conn->tls_session)
  576. return SSL_read((SSL*) conn->tls_session, buf, buflen);
  577. #endif
  578. #if ENABLE_ODBC_MARS
  579. return tds_socket_read(conn, tds, buf, buflen);
  580. #else
  581. return tds_goodread(tds, buf, buflen);
  582. #endif
  583. }
  584. /**
  585. * \param tds the famous socket
  586. * \param buffer data to send
  587. * \param buflen bytes in buffer
  588. * \param last 1 if this is the last packet, else 0
  589. * \return length written (>0), <0 on failure
  590. */
  591. static int
  592. tds_goodwrite(TDSSOCKET * tds, const unsigned char *buffer, size_t buflen, unsigned char last)
  593. {
  594. int len;
  595. assert(tds && buffer);
  596. for (;;) {
  597. /* TODO if send buffer is full we block receive !!! */
  598. len = tds_select(tds, TDSSELWRITE, tds->query_timeout);
  599. if (len > 0) {
  600. len = tds_socket_write(tds->conn, tds, buffer, buflen, last);
  601. if (len == 0)
  602. continue;
  603. if (len > 0) {
  604. #ifdef USE_CORK
  605. if (len < buflen) last = 0;
  606. #endif
  607. break;
  608. }
  609. return len;
  610. }
  611. /* error */
  612. if (len < 0) {
  613. int err = sock_errno;
  614. if (TDSSOCK_WOULDBLOCK(err)) /* shouldn't happen, but OK, retry */
  615. continue;
  616. tdsdump_log(TDS_DBG_NETWORK, "select(2) failed: %d (%s)\n", err, sock_strerror(err));
  617. tds_connection_close(tds->conn);
  618. tdserror(tds_get_ctx(tds), tds, TDSEWRIT, err);
  619. return -1;
  620. }
  621. /* timeout */
  622. tdsdump_log(TDS_DBG_NETWORK, "tds_goodwrite(): timed out, asking client\n");
  623. switch (tdserror(tds_get_ctx(tds), tds, TDSETIME, sock_errno)) {
  624. case TDS_INT_CONTINUE:
  625. break;
  626. default:
  627. case TDS_INT_CANCEL:
  628. tds_close_socket(tds);
  629. return -1;
  630. }
  631. }
  632. #ifdef USE_CORK
  633. /* force packet flush */
  634. if (last) {
  635. int opt;
  636. TDS_SYS_SOCKET sock = tds_get_s(tds);
  637. opt = 0;
  638. setsockopt(sock, SOL_TCP, TCP_CORK, (const void *) &opt, sizeof(opt));
  639. opt = 1;
  640. setsockopt(sock, SOL_TCP, TCP_CORK, (const void *) &opt, sizeof(opt));
  641. }
  642. #endif
  643. return len;
  644. }
  645. int
  646. tds_connection_write(TDSSOCKET *tds, unsigned char *buf, int buflen, int final)
  647. {
  648. int sent;
  649. TDSCONNECTION *conn = tds->conn;
  650. #if !defined(_WIN32) && !defined(MSG_NOSIGNAL) && !defined(DOS32X) && (!defined(__APPLE__) || !defined(SO_NOSIGPIPE))
  651. void (*oldsig) (int);
  652. oldsig = signal(SIGPIPE, SIG_IGN);
  653. if (oldsig == SIG_ERR) {
  654. tdsdump_log(TDS_DBG_WARN, "TDS: Warning: Couldn't set SIGPIPE signal to be ignored\n");
  655. }
  656. #endif
  657. #ifdef HAVE_GNUTLS
  658. if (conn->tls_session)
  659. sent = gnutls_record_send((gnutls_session) conn->tls_session, buf, buflen);
  660. else
  661. #elif defined(HAVE_OPENSSL)
  662. if (conn->tls_session)
  663. sent = SSL_write((SSL*) conn->tls_session, buf, buflen);
  664. else
  665. #endif
  666. #if ENABLE_ODBC_MARS
  667. sent = tds_socket_write(conn, tds, buf, buflen, final);
  668. #else
  669. sent = tds_goodwrite(tds, buf, buflen, final);
  670. #endif
  671. #if !defined(_WIN32) && !defined(MSG_NOSIGNAL) && !defined(DOS32X) && (!defined(__APPLE__) || !defined(SO_NOSIGPIPE))
  672. if (signal(SIGPIPE, oldsig) == SIG_ERR) {
  673. tdsdump_log(TDS_DBG_WARN, "TDS: Warning: Couldn't reset SIGPIPE signal to previous value\n");
  674. }
  675. #endif
  676. return sent;
  677. }
  678. /**
  679. * Get port of all instances
  680. * @return default port number or 0 if error
  681. * @remark experimental, cf. MC-SQLR.pdf.
  682. */
  683. int
  684. tds7_get_instance_ports(FILE *output, struct tds_addrinfo *addr)
  685. {
  686. int num_try;
  687. ioctl_nonblocking_t ioctl_nonblocking;
  688. struct pollfd fd;
  689. int retval;
  690. TDS_SYS_SOCKET s;
  691. char msg[16*1024];
  692. size_t msg_len = 0;
  693. int port = 0;
  694. char ipaddr[128];
  695. tds_addrinfo_set_port(addr, 1434);
  696. tds_addrinfo2str(addr, ipaddr, sizeof(ipaddr));
  697. tdsdump_log(TDS_DBG_ERROR, "tds7_get_instance_ports(%s)\n", ipaddr);
  698. /* create an UDP socket */
  699. if (TDS_IS_SOCKET_INVALID(s = socket(addr->ai_family, SOCK_DGRAM, 0))) {
  700. tdsdump_log(TDS_DBG_ERROR, "socket creation error: %s\n", sock_strerror(sock_errno));
  701. return 0;
  702. }
  703. /*
  704. * on cluster environment is possible that reply packet came from
  705. * different IP so do not filter by ip with connect
  706. */
  707. ioctl_nonblocking = 1;
  708. if (IOCTLSOCKET(s, FIONBIO, &ioctl_nonblocking) < 0) {
  709. CLOSESOCKET(s);
  710. return 0;
  711. }
  712. /*
  713. * Request the instance's port from the server.
  714. * There is no easy way to detect if port is closed so we always try to
  715. * get a reply from server 16 times.
  716. */
  717. for (num_try = 0; num_try < 16 && msg_len == 0; ++num_try) {
  718. /* send the request */
  719. msg[0] = 3;
  720. sendto(s, msg, 1, 0, addr->ai_addr, addr->ai_addrlen);
  721. fd.fd = s;
  722. fd.events = POLLIN;
  723. fd.revents = 0;
  724. retval = poll(&fd, 1, 1000);
  725. /* on interrupt ignore */
  726. if (retval < 0 && sock_errno == TDSSOCK_EINTR)
  727. continue;
  728. if (retval == 0) { /* timed out */
  729. #if 1
  730. tdsdump_log(TDS_DBG_ERROR, "tds7_get_instance_port: timed out on try %d of 16\n", num_try);
  731. continue;
  732. #else
  733. int rc;
  734. tdsdump_log(TDS_DBG_INFO1, "timed out\n");
  735. switch(rc = tdserror(NULL, NULL, TDSETIME, 0)) {
  736. case TDS_INT_CONTINUE:
  737. continue; /* try again */
  738. default:
  739. tdsdump_log(TDS_DBG_ERROR, "error: client error handler returned %d\n", rc);
  740. case TDS_INT_CANCEL:
  741. CLOSESOCKET(s);
  742. return 0;
  743. }
  744. #endif
  745. }
  746. if (retval < 0)
  747. break;
  748. /* got data, read and parse */
  749. if ((msg_len = recv(s, msg, sizeof(msg) - 1, 0)) > 3 && msg[0] == 5) {
  750. char *name, sep[2] = ";", *save;
  751. /* assure null terminated */
  752. msg[msg_len] = 0;
  753. tdsdump_dump_buf(TDS_DBG_INFO1, "instance info", msg, msg_len);
  754. if (0) { /* To debug, print the whole string. */
  755. char *p;
  756. for (*sep = '\n', p=msg+3; p < msg + msg_len; p++) {
  757. if( *p == ';' )
  758. *p = *sep;
  759. }
  760. fputs(msg + 3, output);
  761. }
  762. /*
  763. * Parse and print message.
  764. */
  765. name = strtok_r(msg+3, sep, &save);
  766. while (name && output) {
  767. int i;
  768. static const char *names[] = { "ServerName", "InstanceName", "IsClustered", "Version",
  769. "tcp", "np", "via" };
  770. for (i=0; name && i < TDS_VECTOR_SIZE(names); i++) {
  771. const char *value = strtok_r(NULL, sep, &save);
  772. if (strcmp(name, names[i]) != 0)
  773. fprintf(output, "error: expecting '%s', found '%s'\n", names[i], name);
  774. if (value)
  775. fprintf(output, "%15s %s\n", name, value);
  776. else
  777. break;
  778. name = strtok_r(NULL, sep, &save);
  779. if (name && strcmp(name, names[0]) == 0)
  780. break;
  781. }
  782. if (name)
  783. fprintf(output, "\n");
  784. }
  785. }
  786. }
  787. CLOSESOCKET(s);
  788. tdsdump_log(TDS_DBG_ERROR, "default instance port is %d\n", port);
  789. return port;
  790. }
  791. /**
  792. * Get port of given instance
  793. * @return port number or 0 if error
  794. */
  795. int
  796. tds7_get_instance_port(struct tds_addrinfo *addr, const char *instance)
  797. {
  798. int num_try;
  799. ioctl_nonblocking_t ioctl_nonblocking;
  800. struct pollfd fd;
  801. int retval;
  802. TDS_SYS_SOCKET s;
  803. char msg[1024];
  804. size_t msg_len;
  805. int port = 0;
  806. char ipaddr[128];
  807. tds_addrinfo_set_port(addr, 1434);
  808. tds_addrinfo2str(addr, ipaddr, sizeof(ipaddr));
  809. tdsdump_log(TDS_DBG_ERROR, "tds7_get_instance_port(%s, %s)\n", ipaddr, instance);
  810. /* create an UDP socket */
  811. if (TDS_IS_SOCKET_INVALID(s = socket(addr->ai_family, SOCK_DGRAM, 0))) {
  812. tdsdump_log(TDS_DBG_ERROR, "socket creation error: %s\n", sock_strerror(sock_errno));
  813. return 0;
  814. }
  815. /*
  816. * on cluster environment is possible that reply packet came from
  817. * different IP so do not filter by ip with connect
  818. */
  819. ioctl_nonblocking = 1;
  820. if (IOCTLSOCKET(s, FIONBIO, &ioctl_nonblocking) < 0) {
  821. CLOSESOCKET(s);
  822. return 0;
  823. }
  824. /*
  825. * Request the instance's port from the server.
  826. * There is no easy way to detect if port is closed so we always try to
  827. * get a reply from server 16 times.
  828. */
  829. for (num_try = 0; num_try < 16; ++num_try) {
  830. /* send the request */
  831. msg[0] = 4;
  832. tds_strlcpy(msg + 1, instance, sizeof(msg) - 1);
  833. sendto(s, msg, (int)strlen(msg) + 1, 0, addr->ai_addr, addr->ai_addrlen);
  834. fd.fd = s;
  835. fd.events = POLLIN;
  836. fd.revents = 0;
  837. retval = poll(&fd, 1, 1000);
  838. /* on interrupt ignore */
  839. if (retval < 0 && sock_errno == TDSSOCK_EINTR)
  840. continue;
  841. if (retval == 0) { /* timed out */
  842. #if 1
  843. tdsdump_log(TDS_DBG_ERROR, "tds7_get_instance_port: timed out on try %d of 16\n", num_try);
  844. continue;
  845. #else
  846. int rc;
  847. tdsdump_log(TDS_DBG_INFO1, "timed out\n");
  848. switch(rc = tdserror(NULL, NULL, TDSETIME, 0)) {
  849. case TDS_INT_CONTINUE:
  850. continue; /* try again */
  851. default:
  852. tdsdump_log(TDS_DBG_ERROR, "error: client error handler returned %d\n", rc);
  853. case TDS_INT_CANCEL:
  854. CLOSESOCKET(s);
  855. return 0;
  856. }
  857. #endif
  858. }
  859. if (retval < 0)
  860. break;
  861. /* TODO pass also connection and set instance/servername ?? */
  862. /* got data, read and parse */
  863. if ((msg_len = recv(s, msg, sizeof(msg) - 1, 0)) > 3 && msg[0] == 5) {
  864. char *p;
  865. long l = 0;
  866. int instance_ok = 0, port_ok = 0;
  867. /* assure null terminated */
  868. msg[msg_len] = 0;
  869. tdsdump_dump_buf(TDS_DBG_INFO1, "instance info", msg, msg_len);
  870. /*
  871. * Parse message and check instance name and port.
  872. * We don't check servername cause it can be very different from the client's.
  873. */
  874. for (p = msg + 3;;) {
  875. char *name, *value;
  876. name = p;
  877. p = strchr(p, ';');
  878. if (!p)
  879. break;
  880. *p++ = 0;
  881. value = name;
  882. if (*name) {
  883. value = p;
  884. p = strchr(p, ';');
  885. if (!p)
  886. break;
  887. *p++ = 0;
  888. }
  889. if (strcasecmp(name, "InstanceName") == 0) {
  890. if (strcasecmp(value, instance) != 0)
  891. break;
  892. instance_ok = 1;
  893. } else if (strcasecmp(name, "tcp") == 0) {
  894. l = strtol(value, &p, 10);
  895. if (l > 0 && l <= 0xffff && *p == 0)
  896. port_ok = 1;
  897. }
  898. }
  899. if (port_ok && instance_ok) {
  900. port = l;
  901. break;
  902. }
  903. }
  904. }
  905. CLOSESOCKET(s);
  906. tdsdump_log(TDS_DBG_ERROR, "instance port is %d\n", port);
  907. return port;
  908. }
  909. #if defined(_WIN32)
  910. const char *
  911. tds_prwsaerror( int erc )
  912. {
  913. switch(erc) {
  914. case WSAEINTR: /* 10004 */
  915. return "WSAEINTR: Interrupted function call.";
  916. case WSAEACCES: /* 10013 */
  917. return "WSAEACCES: Permission denied.";
  918. case WSAEFAULT: /* 10014 */
  919. return "WSAEFAULT: Bad address.";
  920. case WSAEINVAL: /* 10022 */
  921. return "WSAEINVAL: Invalid argument.";
  922. case WSAEMFILE: /* 10024 */
  923. return "WSAEMFILE: Too many open files.";
  924. case WSAEWOULDBLOCK: /* 10035 */
  925. return "WSAEWOULDBLOCK: Resource temporarily unavailable.";
  926. case WSAEINPROGRESS: /* 10036 */
  927. return "WSAEINPROGRESS: Operation now in progress.";
  928. case WSAEALREADY: /* 10037 */
  929. return "WSAEALREADY: Operation already in progress.";
  930. case WSAENOTSOCK: /* 10038 */
  931. return "WSAENOTSOCK: Socket operation on nonsocket.";
  932. case WSAEDESTADDRREQ: /* 10039 */
  933. return "WSAEDESTADDRREQ: Destination address required.";
  934. case WSAEMSGSIZE: /* 10040 */
  935. return "WSAEMSGSIZE: Message too long.";
  936. case WSAEPROTOTYPE: /* 10041 */
  937. return "WSAEPROTOTYPE: Protocol wrong type for socket.";
  938. case WSAENOPROTOOPT: /* 10042 */
  939. return "WSAENOPROTOOPT: Bad protocol option.";
  940. case WSAEPROTONOSUPPORT: /* 10043 */
  941. return "WSAEPROTONOSUPPORT: Protocol not supported.";
  942. case WSAESOCKTNOSUPPORT: /* 10044 */
  943. return "WSAESOCKTNOSUPPORT: Socket type not supported.";
  944. case WSAEOPNOTSUPP: /* 10045 */
  945. return "WSAEOPNOTSUPP: Operation not supported.";
  946. case WSAEPFNOSUPPORT: /* 10046 */
  947. return "WSAEPFNOSUPPORT: Protocol family not supported.";
  948. case WSAEAFNOSUPPORT: /* 10047 */
  949. return "WSAEAFNOSUPPORT: Address family not supported by protocol family.";
  950. case WSAEADDRINUSE: /* 10048 */
  951. return "WSAEADDRINUSE: Address already in use.";
  952. case WSAEADDRNOTAVAIL: /* 10049 */
  953. return "WSAEADDRNOTAVAIL: Cannot assign requested address.";
  954. case WSAENETDOWN: /* 10050 */
  955. return "WSAENETDOWN: Network is down.";
  956. case WSAENETUNREACH: /* 10051 */
  957. return "WSAENETUNREACH: Network is unreachable.";
  958. case WSAENETRESET: /* 10052 */
  959. return "WSAENETRESET: Network dropped connection on reset.";
  960. case WSAECONNABORTED: /* 10053 */
  961. return "WSAECONNABORTED: Software caused connection abort.";
  962. case WSAECONNRESET: /* 10054 */
  963. return "WSAECONNRESET: Connection reset by peer.";
  964. case WSAENOBUFS: /* 10055 */
  965. return "WSAENOBUFS: No buffer space available.";
  966. case WSAEISCONN: /* 10056 */
  967. return "WSAEISCONN: Socket is already connected.";
  968. case WSAENOTCONN: /* 10057 */
  969. return "WSAENOTCONN: Socket is not connected.";
  970. case WSAESHUTDOWN: /* 10058 */
  971. return "WSAESHUTDOWN: Cannot send after socket shutdown.";
  972. case WSAETIMEDOUT: /* 10060 */
  973. return "WSAETIMEDOUT: Connection timed out.";
  974. case WSAECONNREFUSED: /* 10061 */
  975. return "WSAECONNREFUSED: Connection refused.";
  976. case WSAEHOSTDOWN: /* 10064 */
  977. return "WSAEHOSTDOWN: Host is down.";
  978. case WSAEHOSTUNREACH: /* 10065 */
  979. return "WSAEHOSTUNREACH: No route to host.";
  980. case WSAEPROCLIM: /* 10067 */
  981. return "WSAEPROCLIM: Too many processes.";
  982. case WSASYSNOTREADY: /* 10091 */
  983. return "WSASYSNOTREADY: Network subsystem is unavailable.";
  984. case WSAVERNOTSUPPORTED: /* 10092 */
  985. return "WSAVERNOTSUPPORTED: Winsock.dll version out of range.";
  986. case WSANOTINITIALISED: /* 10093 */
  987. return "WSANOTINITIALISED: Successful WSAStartup not yet performed.";
  988. case WSAEDISCON: /* 10101 */
  989. return "WSAEDISCON: Graceful shutdown in progress.";
  990. case WSATYPE_NOT_FOUND: /* 10109 */
  991. return "WSATYPE_NOT_FOUND: Class type not found.";
  992. case WSAHOST_NOT_FOUND: /* 11001 */
  993. return "WSAHOST_NOT_FOUND: Host not found.";
  994. case WSATRY_AGAIN: /* 11002 */
  995. return "WSATRY_AGAIN: Nonauthoritative host not found.";
  996. case WSANO_RECOVERY: /* 11003 */
  997. return "WSANO_RECOVERY: This is a nonrecoverable error.";
  998. case WSANO_DATA: /* 11004 */
  999. return "WSANO_DATA: Valid name, no data record of requested type.";
  1000. case WSA_INVALID_HANDLE: /* OS dependent */
  1001. return "WSA_INVALID_HANDLE: Specified event object handle is invalid.";
  1002. case WSA_INVALID_PARAMETER: /* OS dependent */
  1003. return "WSA_INVALID_PARAMETER: One or more parameters are invalid.";
  1004. case WSA_IO_INCOMPLETE: /* OS dependent */
  1005. return "WSA_IO_INCOMPLETE: Overlapped I/O event object not in signaled state.";
  1006. case WSA_IO_PENDING: /* OS dependent */
  1007. return "WSA_IO_PENDING: Overlapped operations will complete later.";
  1008. case WSA_NOT_ENOUGH_MEMORY: /* OS dependent */
  1009. return "WSA_NOT_ENOUGH_MEMORY: Insufficient memory available.";
  1010. case WSA_OPERATION_ABORTED: /* OS dependent */
  1011. return "WSA_OPERATION_ABORTED: Overlapped operation aborted.";
  1012. #if defined(WSAINVALIDPROCTABLE)
  1013. case WSAINVALIDPROCTABLE: /* OS dependent */
  1014. return "WSAINVALIDPROCTABLE: Invalid procedure table from service provider.";
  1015. #endif
  1016. #if defined(WSAINVALIDPROVIDER)
  1017. case WSAINVALIDPROVIDER: /* OS dependent */
  1018. return "WSAINVALIDPROVIDER: Invalid service provider version number.";
  1019. #endif
  1020. #if defined(WSAPROVIDERFAILEDINIT)
  1021. case WSAPROVIDERFAILEDINIT: /* OS dependent */
  1022. return "WSAPROVIDERFAILEDINIT: Unable to initialize a service provider.";
  1023. #endif
  1024. case WSASYSCALLFAILURE: /* OS dependent */
  1025. return "WSASYSCALLFAILURE: System call failure.";
  1026. }
  1027. return "undocumented WSA error code";
  1028. }
  1029. #endif
  1030. #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
  1031. #ifdef HAVE_GNUTLS
  1032. #define SSL_RET ssize_t
  1033. #define SSL_PULL_ARGS gnutls_transport_ptr ptr, void *data, size_t len
  1034. #define SSL_PUSH_ARGS gnutls_transport_ptr ptr, const void *data, size_t len
  1035. #define SSL_PTR ptr
  1036. #else
  1037. #define SSL_RET int
  1038. #define SSL_PULL_ARGS BIO *bio, char *data, int len
  1039. #define SSL_PUSH_ARGS BIO *bio, const char *data, int len
  1040. #define SSL_PTR bio->ptr
  1041. #endif
  1042. static SSL_RET
  1043. tds_pull_func_login(SSL_PULL_ARGS)
  1044. {
  1045. TDSSOCKET *tds = (TDSSOCKET *) SSL_PTR;
  1046. int have;
  1047. tdsdump_log(TDS_DBG_INFO1, "in tds_pull_func_login\n");
  1048. /* here we are initializing (crypted inside TDS packets) */
  1049. /* if we have some data send it */
  1050. /* here MARS is not already initialized so test is correct */
  1051. /* TODO test even after initializing ?? */
  1052. if (tds->out_pos > 8)
  1053. tds_flush_packet(tds);
  1054. for(;;) {
  1055. have = tds->in_len - tds->in_pos;
  1056. tdsdump_log(TDS_DBG_INFO1, "have %d\n", have);
  1057. assert(have >= 0);
  1058. if (have > 0)
  1059. break;
  1060. tdsdump_log(TDS_DBG_INFO1, "before read\n");
  1061. if (tds_read_packet(tds) < 0)
  1062. return -1;
  1063. tdsdump_log(TDS_DBG_INFO1, "after read\n");
  1064. }
  1065. if (len > have)
  1066. len = have;
  1067. tdsdump_log(TDS_DBG_INFO1, "read %lu bytes\n", (unsigned long int) len);
  1068. memcpy(data, tds->in_buf + tds->in_pos, len);
  1069. tds->in_pos += len;
  1070. return len;
  1071. }
  1072. static SSL_RET
  1073. tds_push_func_login(SSL_PUSH_ARGS)
  1074. {
  1075. TDSSOCKET *tds = (TDSSOCKET *) SSL_PTR;
  1076. tdsdump_log(TDS_DBG_INFO1, "in tds_push_func_login\n");
  1077. /* initializing SSL, write crypted data inside normal TDS packets */
  1078. tds_put_n(tds, data, len);
  1079. return len;
  1080. }
  1081. static SSL_RET
  1082. tds_pull_func(SSL_PULL_ARGS)
  1083. {
  1084. TDSCONNECTION *conn = (TDSCONNECTION *) SSL_PTR;
  1085. TDSSOCKET *tds;
  1086. tdsdump_log(TDS_DBG_INFO1, "in tds_pull_func\n");
  1087. #if ENABLE_ODBC_MARS
  1088. tds = conn->in_net_tds;
  1089. assert(tds);
  1090. #else
  1091. tds = (TDSSOCKET *) conn;
  1092. #endif
  1093. /* already initialized (crypted TDS packets) */
  1094. /* read directly from socket */
  1095. /* TODO we block write on other sessions */
  1096. /* also we should already have tested for data on socket */
  1097. return tds_goodread(tds, (unsigned char*) data, len);
  1098. }
  1099. static SSL_RET
  1100. tds_push_func(SSL_PUSH_ARGS)
  1101. {
  1102. TDSCONNECTION *conn = (TDSCONNECTION *) SSL_PTR;
  1103. TDSSOCKET *tds;
  1104. tdsdump_log(TDS_DBG_INFO1, "in tds_push_func\n");
  1105. /* write to socket directly */
  1106. /* TODO use cork if available here to flush only on last chunk of packet ?? */
  1107. #if ENABLE_ODBC_MARS
  1108. tds = conn->in_net_tds;
  1109. /* FIXME with SMP trick to detect final is not ok */
  1110. return tds_goodwrite(tds, (const unsigned char*) data, len,
  1111. conn->send_packets->next == NULL);
  1112. #else
  1113. tds = (TDSSOCKET *) conn;
  1114. return tds_goodwrite(tds, (const unsigned char*) data, len, tds->out_buf[1]);
  1115. #endif
  1116. }
  1117. static int tls_initialized = 0;
  1118. static tds_mutex tls_mutex = TDS_MUTEX_INITIALIZER;
  1119. #ifdef HAVE_GNUTLS
  1120. static void
  1121. tds_tls_log( int level, const char* s)
  1122. {
  1123. tdsdump_log(TDS_DBG_INFO1, "GNUTLS: level %d:\n %s", level, s);
  1124. }
  1125. #ifdef TDS_ATTRIBUTE_DESTRUCTOR
  1126. static void __attribute__((destructor))
  1127. tds_tls_deinit(void)
  1128. {
  1129. if (tls_initialized)
  1130. gnutls_global_deinit();
  1131. }
  1132. #endif
  1133. #if defined(_THREAD_SAFE) && defined(TDS_HAVE_PTHREAD_MUTEX)
  1134. GCRY_THREAD_OPTION_PTHREAD_IMPL;
  1135. #define tds_gcry_init() gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread)
  1136. #else
  1137. #define tds_gcry_init() do {} while(0)
  1138. #endif
  1139. TDSRET
  1140. tds_ssl_init(TDSSOCKET *tds)
  1141. {
  1142. gnutls_session session;
  1143. gnutls_certificate_credentials xcred;
  1144. static const int kx_priority[] = {
  1145. GNUTLS_KX_RSA_EXPORT,
  1146. GNUTLS_KX_RSA, GNUTLS_KX_DHE_DSS, GNUTLS_KX_DHE_RSA,
  1147. 0
  1148. };
  1149. static const int cipher_priority[] = {
  1150. GNUTLS_CIPHER_AES_256_CBC, GNUTLS_CIPHER_AES_128_CBC,
  1151. GNUTLS_CIPHER_3DES_CBC, GNUTLS_CIPHER_ARCFOUR_128,
  1152. #if 0
  1153. GNUTLS_CIPHER_ARCFOUR_40,
  1154. GNUTLS_CIPHER_DES_CBC,
  1155. #endif
  1156. 0
  1157. };
  1158. static const int comp_priority[] = { GNUTLS_COMP_NULL, 0 };
  1159. static const int mac_priority[] = {
  1160. GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0
  1161. };
  1162. int ret;
  1163. const char *tls_msg;
  1164. xcred = NULL;
  1165. session = NULL;
  1166. tls_msg = "initializing tls";
  1167. /* FIXME place somewhere else, deinit at end */
  1168. ret = 0;
  1169. if (!tls_initialized) {
  1170. tds_mutex_lock(&tls_mutex);
  1171. if (!tls_initialized) {
  1172. tds_gcry_init();
  1173. ret = gnutls_global_init();
  1174. if (ret == 0) {
  1175. gnutls_global_set_log_level(11);
  1176. gnutls_global_set_log_function(tds_tls_log);
  1177. tls_initialized = 1;
  1178. }
  1179. }
  1180. tds_mutex_unlock(&tls_mutex);
  1181. }
  1182. if (ret == 0) {
  1183. tls_msg = "allocating credentials";
  1184. ret = gnutls_certificate_allocate_credentials(&xcred);
  1185. }
  1186. if (ret == 0) {
  1187. /* Initialize TLS session */
  1188. tls_msg = "initializing session";
  1189. ret = gnutls_init(&session, GNUTLS_CLIENT);
  1190. }
  1191. if (ret == 0) {
  1192. gnutls_transport_set_ptr(session, tds);
  1193. gnutls_transport_set_pull_function(session, tds_pull_func_login);
  1194. gnutls_transport_set_push_function(session, tds_push_func_login);
  1195. /* NOTE: there functions return int however they cannot fail */
  1196. /* use default priorities... */
  1197. gnutls_set_default_priority(session);
  1198. /* ... but overwrite some */
  1199. gnutls_cipher_set_priority(session, cipher_priority);
  1200. gnutls_compression_set_priority(session, comp_priority);
  1201. gnutls_kx_set_priority(session, kx_priority);
  1202. gnutls_mac_set_priority(session, mac_priority);
  1203. /* mssql does not like padding too much */
  1204. #ifdef HAVE_GNUTLS_RECORD_DISABLE_PADDING
  1205. gnutls_record_disable_padding(session);
  1206. #endif
  1207. /* put the anonymous credentials to the current session */
  1208. tls_msg = "setting credential";
  1209. ret = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, xcred);
  1210. }
  1211. if (ret == 0) {
  1212. /* Perform the TLS handshake */
  1213. tls_msg = "handshake";
  1214. ret = gnutls_handshake (session);
  1215. }
  1216. if (ret != 0) {
  1217. if (session)
  1218. gnutls_deinit(session);
  1219. if (xcred)
  1220. gnutls_certificate_free_credentials(xcred);
  1221. tdsdump_log(TDS_DBG_ERROR, "%s failed: %s\n", tls_msg, gnutls_strerror (ret));
  1222. return TDS_FAIL;
  1223. }
  1224. tdsdump_log(TDS_DBG_INFO1, "handshake succeeded!!\n");
  1225. gnutls_transport_set_ptr(session, tds->conn);
  1226. gnutls_transport_set_pull_function(session, tds_pull_func);
  1227. gnutls_transport_set_push_function(session, tds_push_func);
  1228. tds->conn->tls_session = session;
  1229. tds->conn->tls_credentials = xcred;
  1230. return TDS_SUCCESS;
  1231. }
  1232. void
  1233. tds_ssl_deinit(TDSCONNECTION *conn)
  1234. {
  1235. if (conn->tls_session) {
  1236. gnutls_deinit((gnutls_session) conn->tls_session);
  1237. conn->tls_session = NULL;
  1238. }
  1239. if (conn->tls_credentials) {
  1240. gnutls_certificate_free_credentials((gnutls_certificate_credentials) conn->tls_credentials);
  1241. conn->tls_credentials = NULL;
  1242. }
  1243. }
  1244. #else
  1245. static long
  1246. tds_ssl_ctrl_login(BIO *b, int cmd, long num, void *ptr)
  1247. {
  1248. TDSSOCKET *tds = (TDSSOCKET *) b->ptr;
  1249. switch (cmd) {
  1250. case BIO_CTRL_FLUSH:
  1251. if (tds->out_pos > 8)
  1252. tds_flush_packet(tds);
  1253. return 1;
  1254. }
  1255. return 0;
  1256. }
  1257. static int
  1258. tds_ssl_free(BIO *a)
  1259. {
  1260. /* nothing to do but required */
  1261. return 1;
  1262. }
  1263. static BIO_METHOD tds_method_login =
  1264. {
  1265. BIO_TYPE_MEM,
  1266. "tds",
  1267. tds_push_func_login,
  1268. tds_pull_func_login,
  1269. NULL,
  1270. NULL,
  1271. tds_ssl_ctrl_login,
  1272. NULL,
  1273. tds_ssl_free,
  1274. NULL,
  1275. };
  1276. static BIO_METHOD tds_method =
  1277. {
  1278. BIO_TYPE_MEM,
  1279. "tds",
  1280. tds_push_func,
  1281. tds_pull_func,
  1282. NULL,
  1283. NULL,
  1284. NULL,
  1285. NULL,
  1286. tds_ssl_free,
  1287. NULL,
  1288. };
  1289. static SSL_CTX *
  1290. tds_init_openssl(void)
  1291. {
  1292. const SSL_METHOD *meth;
  1293. if (!tls_initialized) {
  1294. tds_mutex_lock(&tls_mutex);
  1295. if (!tls_initialized) {
  1296. SSL_library_init();
  1297. tls_initialized = 1;
  1298. }
  1299. tds_mutex_unlock(&tls_mutex);
  1300. }
  1301. meth = TLSv1_client_method ();
  1302. if (meth == NULL)
  1303. return NULL;
  1304. return SSL_CTX_new (meth);
  1305. }
  1306. int
  1307. tds_ssl_init(TDSSOCKET *tds)
  1308. {
  1309. #define OPENSSL_CIPHERS \
  1310. "DHE-RSA-AES256-SHA DHE-DSS-AES256-SHA " \
  1311. "AES256-SHA EDH-RSA-DES-CBC3-SHA " \
  1312. "EDH-DSS-DES-CBC3-SHA DES-CBC3-SHA " \
  1313. "DES-CBC3-MD5 DHE-RSA-AES128-SHA " \
  1314. "DHE-DSS-AES128-SHA AES128-SHA RC2-CBC-MD5 RC4-SHA RC4-MD5"
  1315. SSL *con;
  1316. BIO *b, *b2;
  1317. int ret;
  1318. const char *tls_msg;
  1319. con = NULL;
  1320. b = NULL;
  1321. b2 = NULL;
  1322. ret = 1;
  1323. tls_msg = "initializing tls";
  1324. if (tds->conn->tls_ctx == NULL)
  1325. tds->conn->tls_ctx = tds_init_openssl();
  1326. if (tds->conn->tls_ctx) {
  1327. /* Initialize TLS session */
  1328. tls_msg = "initializing session";
  1329. con = SSL_new(tds->conn->tls_ctx);
  1330. }
  1331. if (con) {
  1332. tls_msg = "creating bio";
  1333. b = BIO_new(&tds_method_login);
  1334. }
  1335. if (b) {
  1336. b2 = BIO_new(&tds_method);
  1337. }
  1338. if (b2) {
  1339. b->shutdown=1;
  1340. b->init=1;
  1341. b->num= -1;
  1342. b->ptr = tds;
  1343. SSL_set_bio(con, b, b);
  1344. b = NULL;
  1345. /* use priorities... */
  1346. SSL_set_cipher_list(con, OPENSSL_CIPHERS);
  1347. #ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
  1348. /* this disable a security improvement but allow connection... */
  1349. SSL_set_options(con, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
  1350. #endif
  1351. /* Perform the TLS handshake */
  1352. tls_msg = "handshake";
  1353. SSL_set_connect_state(con);
  1354. ret = SSL_connect(con) != 1 || con->state != SSL_ST_OK;
  1355. }
  1356. if (ret != 0) {
  1357. if (b2)
  1358. BIO_free(b2);
  1359. if (b)
  1360. BIO_free(b);
  1361. if (con) {
  1362. SSL_shutdown(con);
  1363. SSL_free(con);
  1364. }
  1365. SSL_CTX_free(tds->conn->tls_ctx);
  1366. tds->conn->tls_ctx = NULL;
  1367. tdsdump_log(TDS_DBG_ERROR, "%s failed\n", tls_msg);
  1368. return TDS_FAIL;
  1369. }
  1370. tdsdump_log(TDS_DBG_INFO1, "handshake succeeded!!\n");
  1371. b2->shutdown = 1;
  1372. b2->init = 1;
  1373. b2->num = -1;
  1374. b2->ptr = tds->conn;
  1375. SSL_set_bio(con, b2, b2);
  1376. tds->conn->tls_session = con;
  1377. return TDS_SUCCESS;
  1378. }
  1379. void
  1380. tds_ssl_deinit(TDSCONNECTION *conn)
  1381. {
  1382. if (conn->tls_session) {
  1383. /* NOTE do not call SSL_shutdown here */
  1384. SSL_free(conn->tls_session);
  1385. conn->tls_session = NULL;
  1386. }
  1387. if (conn->tls_ctx) {
  1388. SSL_CTX_free(conn->tls_ctx);
  1389. conn->tls_ctx = NULL;
  1390. }
  1391. }
  1392. #endif
  1393. #endif
  1394. /** @} */