]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #12810 from evverx/nonnull-attribute
authorLennart Poettering <lennart@poettering.net>
Mon, 17 Jun 2019 12:54:18 +0000 (14:54 +0200)
committerGitHub <noreply@github.com>
Mon, 17 Jun 2019 12:54:18 +0000 (14:54 +0200)
travis: turn on nonnull-attribute on Fuzzit

meson.build
src/resolve/resolved-dnstls-openssl.c
src/resolve/resolved-dnstls-openssl.h
src/sleep/sleep.c

index 30e4743489814571f2ecbf5ba80eec4ef23d9ac5..19c005141fb98ac82769a54be43e772d982c8d22 100644 (file)
@@ -1203,7 +1203,7 @@ if dns_over_tls != 'false'
                 have_openssl = conf.get('HAVE_OPENSSL') == 1
                 if dns_over_tls != 'auto' and not have_openssl
                         str = dns_over_tls == 'openssl' ? ' with openssl' : ''
-                        error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
+                        error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
                 endif
         endif
         have = have_gnutls or have_openssl
index 5d92230075816b78db8e40d3a10050d2ab42348d..1a21b9224b44e680f378193c77bc308cb73f2bd7 100644 (file)
@@ -6,7 +6,6 @@
 
 #include <openssl/bio.h>
 #include <openssl/err.h>
-#include <string.h>
 
 #include "io-util.h"
 #include "resolved-dns-stream.h"
@@ -21,12 +20,12 @@ static int dnstls_flush_write_buffer(DnsStream *stream) {
         assert(stream);
         assert(stream->encrypted);
 
-        if (stream->dnstls_data.write_buffer->length > 0) {
+        if (stream->dnstls_data.buffer_offset < stream->dnstls_data.write_buffer->length) {
                 assert(stream->dnstls_data.write_buffer->data);
 
                 struct iovec iov[1];
-                iov[0] = IOVEC_MAKE(stream->dnstls_data.write_buffer->data,
-                                    stream->dnstls_data.write_buffer->length);
+                iov[0] = IOVEC_MAKE(stream->dnstls_data.write_buffer->data + stream->dnstls_data.buffer_offset,
+                                    stream->dnstls_data.write_buffer->length - stream->dnstls_data.buffer_offset);
                 ss = dns_stream_writev(stream, iov, 1, DNS_STREAM_WRITE_TLS_DATA);
                 if (ss < 0) {
                         if (ss == -EAGAIN)
@@ -34,14 +33,14 @@ static int dnstls_flush_write_buffer(DnsStream *stream) {
 
                         return ss;
                 } else {
-                        stream->dnstls_data.write_buffer->length -= ss;
+                        stream->dnstls_data.buffer_offset += ss;
 
-                        if (stream->dnstls_data.write_buffer->length > 0) {
-                                memmove(stream->dnstls_data.write_buffer->data,
-                                        stream->dnstls_data.write_buffer->data + ss,
-                                        stream->dnstls_data.write_buffer->length);
+                        if (stream->dnstls_data.buffer_offset < stream->dnstls_data.write_buffer->length) {
                                 stream->dnstls_events |= EPOLLOUT;
                                 return -EAGAIN;
+                        } else {
+                                BIO_reset(SSL_get_wbio(stream->dnstls_data.ssl));
+                                stream->dnstls_data.buffer_offset = 0;
                         }
                 }
         }
@@ -66,6 +65,7 @@ int dnstls_stream_connect_tls(DnsStream *stream, DnsServer *server) {
                 return -ENOMEM;
 
         BIO_get_mem_ptr(wb, &stream->dnstls_data.write_buffer);
+        stream->dnstls_data.buffer_offset = 0;
 
         s = SSL_new(server->dnstls_data.ctx);
         if (!s)
@@ -89,12 +89,13 @@ int dnstls_stream_connect_tls(DnsStream *stream, DnsServer *server) {
         }
 
         stream->encrypted = true;
+        stream->dnstls_data.ssl = TAKE_PTR(s);
 
         r = dnstls_flush_write_buffer(stream);
-        if (r < 0 && r != -EAGAIN)
+        if (r < 0 && r != -EAGAIN) {
+                SSL_free(TAKE_PTR(stream->dnstls_data.ssl));
                 return r;
-
-        stream->dnstls_data.ssl = TAKE_PTR(s);
+        }
 
         return 0;
 }
index f0dccf32e65fa363c67d0cf78d894c6b1e8e9713..0fe72afd0ae62c4562e338be79b745f927838870 100644 (file)
@@ -18,4 +18,5 @@ struct DnsTlsStreamData {
         bool shutdown;
         SSL *ssl;
         BUF_MEM *write_buffer;
+        size_t buffer_offset;
 };
index 11757f2efae16a1b37f6a46490fa8eb33b241147..c38aa4ccf67927e68459ee83d81b50bcb6f18c2b 100644 (file)
@@ -35,6 +35,8 @@
 
 static char* arg_verb = NULL;
 
+STATIC_DESTRUCTOR_REGISTER(arg_verb, freep);
+
 static int write_hibernate_location_info(void) {
         _cleanup_free_ char *device = NULL, *type = NULL;
         _cleanup_free_ struct fiemap *fiemap = NULL;
@@ -317,7 +319,9 @@ static int parse_argv(int argc, char *argv[]) {
                                        "Usage: %s COMMAND",
                                        program_invocation_short_name);
 
-        arg_verb = argv[optind];
+        arg_verb = strdup(argv[optind]);
+        if (!arg_verb)
+                return log_oom();
 
         if (!STR_IN_SET(arg_verb, "suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate"))
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),