1 /*-------------------------------------------------------------------------
4 * functions related to setting up a secure connection to the backend.
5 * Secure connections are expected to provide confidentiality,
6 * message integrity and endpoint authentication.
9 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
10 * Portions Copyright (c) 1994, Regents of the University of California
14 * src/interfaces/libpq/fe-secure.c
16 *-------------------------------------------------------------------------
19 #include "postgres_fe.h"
28 #include <sys/socket.h>
31 #include <netinet/in.h>
32 #include <netinet/tcp.h>
33 #include <arpa/inet.h>
39 #include "pthread-win32.h"
46 #include "libpq-int.h"
49 * Macros to handle disabling and then restoring the state of SIGPIPE handling.
50 * On Windows, these are all no-ops since there's no SIGPIPEs.
55 #define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag)
64 #define DECLARE_SIGPIPE_INFO(spinfo) struct sigpipe_info spinfo
66 #define DISABLE_SIGPIPE(conn, spinfo, failaction) \
68 (spinfo).got_epipe = false; \
69 if (!SIGPIPE_MASKED(conn)) \
71 if (pq_block_sigpipe(&(spinfo).oldsigmask, \
72 &(spinfo).sigpipe_pending) < 0) \
77 #define REMEMBER_EPIPE(spinfo, cond) \
80 (spinfo).got_epipe = true; \
83 #define RESTORE_SIGPIPE(conn, spinfo) \
85 if (!SIGPIPE_MASKED(conn)) \
86 pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \
87 (spinfo).got_epipe); \
91 #define DECLARE_SIGPIPE_INFO(spinfo)
92 #define DISABLE_SIGPIPE(conn, spinfo, failaction)
93 #define REMEMBER_EPIPE(spinfo, cond)
94 #define RESTORE_SIGPIPE(conn, spinfo)
97 /* ------------------------------------------------------------ */
98 /* Procedures common to all secure sessions */
99 /* ------------------------------------------------------------ */
103 PQsslInUse(PGconn
*conn
)
107 return conn
->ssl_in_use
;
111 * Exported function to allow application to tell us it's already initialized
112 * OpenSSL. Since OpenSSL 1.1.0 it is no longer required to explicitly
113 * initialize libssl and libcrypto, so this is a no-op. This function remains
114 * for backwards API compatibility.
117 PQinitSSL(int do_init
)
123 * Exported function to allow application to tell us it's already initialized
124 * OpenSSL. Since OpenSSL 1.1.0 it is no longer required to explicitly
125 * initialize libssl and libcrypto, so this is a no-op. This function remains
126 * for backwards API compatibility.
129 PQinitOpenSSL(int do_ssl
, int do_crypto
)
135 * Begin or continue negotiating a secure session.
137 PostgresPollingStatusType
138 pqsecure_open_client(PGconn
*conn
)
141 return pgtls_open_client(conn
);
143 /* shouldn't get here */
144 return PGRES_POLLING_FAILED
;
149 * Close secure session.
152 pqsecure_close(PGconn
*conn
)
160 * Read data from a secure connection.
162 * On failure, this function is responsible for appending a suitable message
163 * to conn->errorMessage. The caller must still inspect errno, but only
164 * to determine whether to continue/retry after error.
167 pqsecure_read(PGconn
*conn
, void *ptr
, size_t len
)
172 if (conn
->ssl_in_use
)
174 n
= pgtls_read(conn
, ptr
, len
);
181 n
= pg_GSS_read(conn
, ptr
, len
);
186 n
= pqsecure_raw_read(conn
, ptr
, len
);
193 pqsecure_raw_read(PGconn
*conn
, void *ptr
, size_t len
)
196 int result_errno
= 0;
197 char sebuf
[PG_STRERROR_R_BUFLEN
];
201 n
= recv(conn
->sock
, ptr
, len
, 0);
205 result_errno
= SOCK_ERRNO
;
207 /* Set error message if appropriate */
208 switch (result_errno
)
213 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
217 /* no error message, caller is expected to retry */
222 libpq_append_conn_error(conn
, "server closed the connection unexpectedly\n"
223 "\tThis probably means the server terminated abnormally\n"
224 "\tbefore or while processing the request.");
228 /* If errno didn't get set, treat it as regular EOF */
233 libpq_append_conn_error(conn
, "could not receive data from server: %s",
234 SOCK_STRERROR(result_errno
,
235 sebuf
, sizeof(sebuf
)));
240 /* ensure we return the intended errno to caller */
241 SOCK_ERRNO_SET(result_errno
);
247 * Write data to a secure connection.
249 * Returns the number of bytes written, or a negative value (with errno
250 * set) upon failure. The write count could be less than requested.
252 * Note that socket-level hard failures are masked from the caller,
253 * instead setting conn->write_failed and storing an error message
254 * in conn->write_err_msg; see pqsecure_raw_write. This allows us to
255 * postpone reporting of write failures until we're sure no error
256 * message is available from the server.
258 * However, errors detected in the SSL or GSS management level are reported
259 * via a negative result, with message appended to conn->errorMessage.
260 * It's frequently unclear whether such errors should be considered read or
261 * write errors, so we don't attempt to postpone reporting them.
263 * The caller must still inspect errno upon failure, but only to determine
264 * whether to continue/retry; a message has been saved someplace in any case.
267 pqsecure_write(PGconn
*conn
, const void *ptr
, size_t len
)
272 if (conn
->ssl_in_use
)
274 n
= pgtls_write(conn
, ptr
, len
);
281 n
= pg_GSS_write(conn
, ptr
, len
);
286 n
= pqsecure_raw_write(conn
, ptr
, len
);
293 * Low-level implementation of pqsecure_write.
295 * This is used directly for an unencrypted connection. For encrypted
296 * connections, this does the physical I/O on behalf of pgtls_write or
299 * This function reports failure (i.e., returns a negative result) only
300 * for retryable errors such as EINTR. Looping for such cases is to be
301 * handled at some outer level, maybe all the way up to the application.
302 * For hard failures, we set conn->write_failed and store an error message
303 * in conn->write_err_msg, but then claim to have written the data anyway.
304 * This is because we don't want to report write failures so long as there
305 * is a possibility of reading from the server and getting an error message
306 * that could explain why the connection dropped. Many TCP stacks have
307 * race conditions such that a write failure may or may not be reported
308 * before all incoming data has been read.
310 * Note that this error behavior happens below the SSL management level when
311 * we are using SSL. That's because at least some versions of OpenSSL are
312 * too quick to report a write failure when there's still a possibility to
313 * get a more useful error from the server.
316 pqsecure_raw_write(PGconn
*conn
, const void *ptr
, size_t len
)
320 int result_errno
= 0;
322 char sebuf
[PG_STRERROR_R_BUFLEN
];
324 DECLARE_SIGPIPE_INFO(spinfo
);
327 * If we already had a write failure, we will never again try to send data
328 * on that connection. Even if the kernel would let us, we've probably
329 * lost message boundary sync with the server. conn->write_failed
330 * therefore persists until the connection is reset, and we just discard
331 * all data presented to be written.
333 if (conn
->write_failed
)
337 if (conn
->sigpipe_flag
)
338 flags
|= MSG_NOSIGNAL
;
341 #endif /* MSG_NOSIGNAL */
343 DISABLE_SIGPIPE(conn
, spinfo
, return -1);
345 n
= send(conn
->sock
, ptr
, len
, flags
);
349 result_errno
= SOCK_ERRNO
;
352 * If we see an EINVAL, it may be because MSG_NOSIGNAL isn't available
353 * on this machine. So, clear sigpipe_flag so we don't try the flag
354 * again, and retry the send().
357 if (flags
!= 0 && result_errno
== EINVAL
)
359 conn
->sigpipe_flag
= false;
363 #endif /* MSG_NOSIGNAL */
365 /* Set error message if appropriate */
366 switch (result_errno
)
371 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
375 /* no error message, caller is expected to retry */
379 /* Set flag for EPIPE */
380 REMEMBER_EPIPE(spinfo
, true);
385 conn
->write_failed
= true;
386 /* Store error message in conn->write_err_msg, if possible */
387 /* (strdup failure is OK, we'll cope later) */
388 snprintf(msgbuf
, sizeof(msgbuf
),
389 libpq_gettext("server closed the connection unexpectedly\n"
390 "\tThis probably means the server terminated abnormally\n"
391 "\tbefore or while processing the request."));
392 /* keep newline out of translated string */
393 strlcat(msgbuf
, "\n", sizeof(msgbuf
));
394 conn
->write_err_msg
= strdup(msgbuf
);
395 /* Now claim the write succeeded */
400 conn
->write_failed
= true;
401 /* Store error message in conn->write_err_msg, if possible */
402 /* (strdup failure is OK, we'll cope later) */
403 snprintf(msgbuf
, sizeof(msgbuf
),
404 libpq_gettext("could not send data to server: %s"),
405 SOCK_STRERROR(result_errno
,
406 sebuf
, sizeof(sebuf
)));
407 /* keep newline out of translated string */
408 strlcat(msgbuf
, "\n", sizeof(msgbuf
));
409 conn
->write_err_msg
= strdup(msgbuf
);
410 /* Now claim the write succeeded */
416 RESTORE_SIGPIPE(conn
, spinfo
);
418 /* ensure we return the intended errno to caller */
419 SOCK_ERRNO_SET(result_errno
);
424 /* Dummy versions of SSL info functions, when built without SSL support */
428 PQgetssl(PGconn
*conn
)
434 PQsslStruct(PGconn
*conn
, const char *struct_name
)
440 PQsslAttribute(PGconn
*conn
, const char *attribute_name
)
446 PQsslAttributeNames(PGconn
*conn
)
448 static const char *const result
[] = {NULL
};
455 * Dummy versions of OpenSSL key password hook functions, when built without
460 PQsslKeyPassHook_OpenSSL_type
461 PQgetSSLKeyPassHook_OpenSSL(void)
467 PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook
)
473 PQdefaultSSLKeyPassHook_OpenSSL(char *buf
, int size
, PGconn
*conn
)
477 #endif /* USE_OPENSSL */
479 /* Dummy version of GSSAPI information functions, when built without GSS support */
483 PQgetgssctx(PGconn
*conn
)
489 PQgssEncInUse(PGconn
*conn
)
494 #endif /* ENABLE_GSS */
500 * Block SIGPIPE for this thread. This prevents send()/write() from exiting
504 pq_block_sigpipe(sigset_t
*osigset
, bool *sigpipe_pending
)
506 sigset_t sigpipe_sigset
;
509 sigemptyset(&sigpipe_sigset
);
510 sigaddset(&sigpipe_sigset
, SIGPIPE
);
512 /* Block SIGPIPE and save previous mask for later reset */
513 SOCK_ERRNO_SET(pthread_sigmask(SIG_BLOCK
, &sigpipe_sigset
, osigset
));
517 /* We can have a pending SIGPIPE only if it was blocked before */
518 if (sigismember(osigset
, SIGPIPE
))
520 /* Is there a pending SIGPIPE? */
521 if (sigpending(&sigset
) != 0)
524 if (sigismember(&sigset
, SIGPIPE
))
525 *sigpipe_pending
= true;
527 *sigpipe_pending
= false;
530 *sigpipe_pending
= false;
536 * Discard any pending SIGPIPE and reset the signal mask.
538 * Note: we are effectively assuming here that the C library doesn't queue
539 * up multiple SIGPIPE events. If it did, then we'd accidentally leave
540 * ours in the queue when an event was already pending and we got another.
541 * As long as it doesn't queue multiple events, we're OK because the caller
542 * can't tell the difference.
544 * The caller should say got_epipe = false if it is certain that it
545 * didn't get an EPIPE error; in that case we'll skip the clear operation
546 * and things are definitely OK, queuing or no. If it got one or might have
547 * gotten one, pass got_epipe = true.
549 * We do not want this to change errno, since if it did that could lose
550 * the error code from a preceding send(). We essentially assume that if
551 * we were able to do pq_block_sigpipe(), this can't fail.
554 pq_reset_sigpipe(sigset_t
*osigset
, bool sigpipe_pending
, bool got_epipe
)
556 int save_errno
= SOCK_ERRNO
;
560 /* Clear SIGPIPE only if none was pending */
561 if (got_epipe
&& !sigpipe_pending
)
563 if (sigpending(&sigset
) == 0 &&
564 sigismember(&sigset
, SIGPIPE
))
566 sigset_t sigpipe_sigset
;
568 sigemptyset(&sigpipe_sigset
);
569 sigaddset(&sigpipe_sigset
, SIGPIPE
);
571 sigwait(&sigpipe_sigset
, &signo
);
575 /* Restore saved block mask */
576 pthread_sigmask(SIG_SETMASK
, osigset
, NULL
);
578 SOCK_ERRNO_SET(save_errno
);