summaryrefslogtreecommitdiff
path: root/src/streams
Commit message (Collapse)AuthorAgeFilesLines
* mbedtls: free stream on shutdownethomson/leaksEdward Thomson2018-07-201-0/+1
|
* mbedtls: make ciphers_list a static arrayEdward Thomson2018-07-201-10/+10
| | | | | Instead of allocating the ciphers_list, make it a static array. This prevents us from leaking it or having to manage its memory.
* mbedtls: free ciphers_listEdward Thomson2018-07-201-0/+2
|
* mbedtls: check allocationsEdward Thomson2018-07-201-1/+14
|
* mbedtls: fix `inline` being used in mbedtls headersPatrick Steinhardt2018-07-131-0/+11
| | | | | | | | | | | | The mbedtls headers make direct use of the `inline` attribute to instruct the compiler to inline functions. As this function is not C90 compliant, this can cause the compiler to error as soon as any of these files is included and the `-std=c90` flag is being added. The mbedtls headers declaring functions as inline always have a prelude which define `inline` as a macro in case it is not yet defined. Thus, we can easily replace their define with our own define, which simply copies the logic of our own `GIT_INLINE` macro.
* streams: report OpenSSL errors if global init failsPatrick Steinhardt2018-07-061-21/+16
| | | | | | | | In case when the global initialization of the OpenSSL stream fails, the user is left without any hint as to what went wrong as we do not provide any error message at all. This commit refactors the init function to have a common error path, which now also sets an error message including the error string provided by OpenSSL.
* streams: openssl: Handle error in SSL_CTX_newNikita Leshenko2018-06-251-0/+4
| | | | SIGSEGV otherwise...
* streams: openssl: add missing check on OPENSSL_LEGACY_APIQuentin Minster2018-05-301-1/+1
| | | The `CRYPTO_THREADID` type is no longer available in OpenSSL ≥ 1.1.0 with deprecated features disabled, and causes build failures. Since the `threadid_cb()` function is only ever called by `git_openssl_set_locking()` when `defined(OPENSSL_LEGACY_API)`, only define it then.
* streams: openssl: fix bogus warning on unused parameterPatrick Steinhardt2018-05-041-1/+2
| | | | | | | | | | | | Our provided callback function `threadid_cb(CRYPTO_THREADID *threadid)` sets up a unique thread ID by asking pthread for the current thread ID. Since openssl version 1.1, `CRYPTO_THREADID_set_numeric` is simply a no-op macro, leaving the `threadid` argument unused after the preprocessor has processed the macro. GCC does not account for that situation and will thus complain about `threadid` being unused. Silence this warning by using `GIT_UNUSED(threadid)`.
* Merge pull request #4608 from pks-t/pks/openssl-api-cleanupCarlos Martín Nieto2018-04-302-121/+112
|\ | | | | OpenSSL legacy API cleanups
| * openssl: remove leftover #ifdefEtienne Samson2018-04-301-3/+0
| | | | | | This is the "OpenSSL available" global init function after all
| * streams: openssl: provide `OPENSSL_init_ssl` for legacy APIPatrick Steinhardt2018-04-031-6/+10
| | | | | | | | | | In order to further avoid using ifdef's in our code flow, provide the function `OPENSSL_init_ssl` in case we are using the legacy OpenSSL API.
| * streams: openssl: unify version checks into single definePatrick Steinhardt2018-04-031-13/+12
| | | | | | | | | | | | | | | | | | | | By now, we have several locations where we are checking the version of OpenSSL to determine whether we can use the new "modern" API or need to use the pre-1.1 legacy API. As we have multiple implementations of OpenSSL with the rather recent libressl implementation, these checks need to honor versions of both implementations, which is rather tedious. Instead, we can just check once for the correct versions and define `OPENSSL_LEGACY_API` in case we cannot use the modern API.
| * streams: openssl: move OpenSSL compat layer into implementationPatrick Steinhardt2018-04-032-107/+98
| | | | | | | | | | | | | | | | | | | | | | OpenSSL version 1.1 has broken its API in quite a few ways. To avoid having to use ifdef's everywhere, we have implemented the BIO functions added in version 1.1 ourselves in case we are using the legacy API. We were implementing them in the header file, though, which doesn't make a lot of sense, since these functions are only ever being used the the openssl stream implementation. Move these functions to the implementation file and mark them static.
* | mbedtls: display error codes as hex for consistency with mbedTLS docsEtienne Samson2018-04-111-4/+4
| | | | | | | | Remaining parts of https://github.com/JuliaLang/julia/blob/8d47a314537779c8fb86642c54925613628a91b0/deps/patches/libgit2-mbedtls-fixup.patch
* | mbedtls: load default CA certificatesEtienne Samson2018-04-112-23/+39
| |
* | mbedtls: use mbedTLS certificate verificationEtienne Samson2018-04-111-69/+6
| | | | | | | | Taken from https://github.com/JuliaLang/julia/blob/8d47a314537779c8fb86642c54925613628a91b0/deps/patches/libgit2-mbedtls-verify.patch, with some modifications.
* | mbedtls: use our own certificate validationEtienne Samson2018-04-111-1/+5
| | | | | | | | | | Otherwise REQUIRED means that `git_stream_certificate` will always error. We're doing the mbedtls check in verify_server_cert though.
* | mbedtls: fix libgit2 hanging due to incomplete writesEtienne Samson2018-04-111-5/+9
| |
* | mbedtls: default cipher list supportEtienne Samson2018-04-111-0/+29
| |
* | mbedtls: add global initializationEtienne Samson2018-04-112-3/+99
| |
* | mbedtls: proper certificate verificationEtienne Samson2018-04-111-26/+50
| |
* | mbedtls: initial supportEtienne Samson2018-04-113-0/+365
|/
* Fix build with LibreSSL 2.7Bernard Spil2018-04-022-2/+4
| | | | | | LibreSSL 2.7 adds OpenSSL 1.1 API Signed-off-by: Bernard Spil <brnrd@FreeBSD.org>
* curl: explicitly initialize and cleanup global curl statePatrick Steinhardt2018-02-282-0/+19
| | | | | | | | | | | | | Our curl-based streams make use of the easy curl interface. This interface automatically initializes and de-initializes the global curl state by calling out to `curl_global_init` and `curl_global_cleanup`. Thus, all global state will be repeatedly re-initialized when creating multiple curl streams in succession. Despite being inefficient, this is not thread-safe due to `curl_global_init` being not thread-safe itself. Thus a multi-threaded programing handling multiple curl streams at the same time is inherently racy. Fix the issue by globally initializing and cleaning up curl's state.
* streams: openssl: fix use of uninitialized variablePatrick Steinhardt2018-02-161-3/+3
| | | | | | | | | | | | | | When verifying the server certificate, we do try to make sure that the hostname actually matches the certificate alternative names. In cases where the host is either an IPv4 or IPv6 address, we have to compare the binary representations of the hostname with the declared IP address of the certificate. We only do that comparison in case we were successfully able to parse the hostname as an IP, which would always result in the memory region being initialized. Still, GCC 6.4.0 was complaining about usage of non-initialized memory. Fix the issue by simply asserting that `addr` needs to be initialized. This shuts up the GCC warning.
* Merge pull request #4437 from pks-t/pks/openssl-hash-errorsEdward Thomson2018-01-031-5/+13
|\ | | | | hash: openssl: check return values of SHA1_* functions
| * streams: openssl: fix thread-safety for OpenSSL error messagesPatrick Steinhardt2018-01-031-5/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The function `ERR_error_string` can be invoked without providing a buffer, in which case OpenSSL will simply return a string printed into a static buffer. Obviously and as documented in ERR_error_string(3), this is not thread-safe at all. As libgit2 is a library, though, it is easily possible that other threads may be using OpenSSL at the same time, which might lead to clobbered error strings. Fix the issue by instead using a stack-allocated buffer. According to the documentation, the caller has to provide a buffer of at least 256 bytes of size. While we do so, make sure that the buffer will never get overflown by switching to `ERR_error_string_n` to specify the buffer's size.
* | openssl: free the peer certificateEtienne Samson2017-12-161-1/+2
| | | | | | | | | | | | Per SSL_get_peer_certificate docs: ``` The reference count of the X509 object is incremented by one, so that it will not be destroyed when the session containing the peer certificate is freed. The X509 object must be explicitly freed using X509_free(). ```
* | openssl: merge all the exit paths of verify_server_certEtienne Samson2017-12-161-11/+15
| | | | | | | | This makes it easier to cleanup allocated resources on exit.
* | stransport: provide error message on trust failuresEtienne Samson2017-12-141-1/+3
|/ | | Fixes #4440
* openssl: fix thread-safety on non-glibc POSIX systemsPatrick Steinhardt2017-11-301-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While the OpenSSL library provides all means to work safely in a multi-threaded application, we fail to do so correctly. Quoting from crypto_lock(3): OpenSSL can safely be used in multi-threaded applications provided that at least two callback functions are set, locking_function and threadid_func. We do in fact provide the means to set up the locking function via `git_openssl_set_locking()`, where we initialize a set of locks by using the POSIX threads API and set the correct callback function to lock and unlock them. But what we do not do is setting the `threadid_func` callback. This function is being used to correctly locate thread-local data of the OpenSSL library and should thus return per-thread identifiers. Digging deeper into OpenSSL's documentation, the library does provide a fallback in case that locking function is not provided by the user. On Windows and BeOS we should be safe, as it simply "uses the system's default thread identifying API". On other platforms though OpenSSL will fall back to using the address of `errno`, assuming it is thread-local. While this assumption holds true for glibc-based systems, POSIX in fact does not specify whether it is thread-local or not. Quoting from errno(3p): It is unspecified whether errno is a macro or an identifier declared with external linkage. And in fact, with musl there is at least one libc implementation which simply declares `errno` as a simple `int` without being thread-local. On those systems, the fallback threadid function of OpenSSL will not be thread-safe. Fix this by setting up our own callback for this setting. As users of libgit2 may want to set it themselves, we obviously cannot always set that function on initialization. But as we already set up primitives for threading in `git_openssl_set_locking()`, this function becomes the obvious choice where to implement the additional setup.
* https: Prevent OpenSSL from namespace-leakingEtienne Samson2017-10-232-0/+21
|
* stream: Gather streams to src/streamsEtienne Samson2017-10-2310-0/+1774