Fix warnings from the Clang static analyzer.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 6 Oct 2018 16:18:45 +0000 (18:18 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 6 Oct 2018 19:47:27 +0000 (21:47 +0200)
configure.ac
src/control.c
src/invitation.c
src/net_setup.c
src/tincctl.c
src/tincctl.h
src/xalloc.h

index ca1264082f74c80a18228b351108a6f075553317..3ad2821fe75411cdd1985f5f3b116ab2d446d147 100644 (file)
@@ -181,6 +181,7 @@ AC_CHECK_HEADERS([netinet/tcp.h netinet/ip_icmp.h netinet/icmp6.h],
 
 dnl Checks for typedefs, structures, and compiler characteristics.
 tinc_ATTRIBUTE(__malloc__)
+tinc_ATTRIBUTE(__nonnull__)
 tinc_ATTRIBUTE(__warn_unused_result__)
 
 AC_CHECK_TYPES([struct ether_header, struct arphdr, struct ether_arp, struct ip, struct icmp, struct ip6_hdr, struct icmp6_hdr, struct nd_neighbor_solicit, struct nd_opt_hdr], , ,
index beda6c41c0e27b2008a7c6e36caca7eb4486011e..71258b58da2361c3ee072f8ed5b6b47a6bcdf482 100644 (file)
@@ -159,12 +159,12 @@ bool init_control(void) {
        // Get the address and port of the first listening socket
 
        char *localhost = NULL;
-       sockaddr_t sa;
+       sockaddr_t sa = {0};
        socklen_t len = sizeof(sa);
 
        // Make sure we have a valid address, and map 0.0.0.0 and :: to 127.0.0.1 and ::1.
 
-       if(getsockname(listen_socket[0].tcp.fd, (struct sockaddr *)&sa, &len)) {
+       if(getsockname(listen_socket[0].tcp.fd, &sa.sa, &len)) {
                xasprintf(&localhost, "127.0.0.1 port %s", myport);
        } else {
                if(sa.sa.sa_family == AF_INET) {
index 4c8597a66708142f5b4f54240520e84f422b4bfa..c3072cf2622dd7680d1ff828fcffd84035584583 100644 (file)
@@ -181,6 +181,7 @@ char *get_my_hostname() {
        if(!tty) {
                if(!hostname) {
                        fprintf(stderr, "Could not determine the external address or hostname. Please set Address manually.\n");
+                       free(port);
                        return NULL;
                }
 
@@ -199,6 +200,7 @@ again:
        if(!fgets(line, sizeof(line), stdin)) {
                fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
                free(hostname);
+               free(port);
                return NULL;
        }
 
@@ -644,7 +646,7 @@ static char *grep(const char *data, const char *var) {
 }
 
 static bool finalize_join(void) {
-       char *name = xstrdup(get_value(data, "Name"));
+       const char *name = get_value(data, "Name");
 
        if(!name) {
                fprintf(stderr, "No Name found in invitation!\n");
index d8b3116b488a2b6cc8bf27326923e17edbcb1348..d48c229990f45b7a205c2296de2a5ff670afd27e 100644 (file)
@@ -975,6 +975,7 @@ static bool setup_myself(void) {
                myself->incipher = NULL;
        } else if(!(myself->incipher = cipher_open_by_name(cipher))) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Unrecognized cipher type!");
+               free(cipher);
                return false;
        }
 
@@ -1002,6 +1003,7 @@ static bool setup_myself(void) {
                myself->indigest = NULL;
        } else if(!(myself->indigest = digest_open_by_name(digest, maclength))) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Unrecognized digest type!");
+               free(digest);
                return false;
        }
 
index 2fdab2a66a12a723096f361ad37ca52a28055ead..4f6660a9272ced8729b17330b897e9a0390102c4 100644 (file)
@@ -2151,7 +2151,7 @@ static bool try_bind(int port) {
        return success;
 }
 
-int check_port(char *name) {
+int check_port(const char *name) {
        if(try_bind(655)) {
                return 655;
        }
@@ -3175,10 +3175,7 @@ static int cmd_shell(int argc, char *argv[]) {
                        free(line);
                        rl_basic_word_break_characters = "\t\n ";
                        line = readline(prompt);
-
-                       if(line) {
-                               copy = xstrdup(line);
-                       }
+                       copy = line ? xstrdup(line) : NULL;
                } else {
                        line = fgets(buf, sizeof(buf), stdin);
                }
@@ -3224,6 +3221,9 @@ static int cmd_shell(int argc, char *argv[]) {
                }
 
                if(!strcasecmp(nargv[argc], "exit") || !strcasecmp(nargv[argc], "quit")) {
+#ifdef HAVE_READLINE
+                       free(copy);
+#endif
                        free(nargv);
                        return result;
                }
@@ -3252,6 +3252,9 @@ static int cmd_shell(int argc, char *argv[]) {
                }
        }
 
+#ifdef HAVE_READLINE
+       free(copy);
+#endif
        free(nargv);
 
        if(tty) {
index db7f45a37bed2c41c7db8c0dad61d7a1153a29ed..3f7d00373c510502558802beffff8277070dc5a1 100644 (file)
@@ -48,7 +48,7 @@ extern char *get_my_name(bool verbose);
 extern bool connect_tincd(bool verbose);
 extern bool sendline(int fd, char *format, ...);
 extern bool recvline(int fd, char *line, size_t len);
-extern int check_port(char *name);
+extern int check_port(const char *name);
 extern FILE *fopenmask(const char *filename, const char *mode, mode_t perms);
 extern ecdsa_t *get_pubkey(FILE *f);
 
index 493af5c0f245b1ac7f3b545d3c0bbb0ea8010291..ac24ebc6b424a0b0f504de5a40525c36f217e4f2 100644 (file)
@@ -53,7 +53,7 @@ static inline void *xrealloc(void *p, size_t n) {
        return p;
 }
 
-static inline char *xstrdup(const char *s) __attribute__((__malloc__));
+static inline char *xstrdup(const char *s) __attribute__((__malloc__, __nonnull__));
 static inline char *xstrdup(const char *s) {
        char *p = strdup(s);