You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/10/12 14:17:27 UTC

qpid-proton git commit: PROTON-1616: C/C++ fix issues reported by coverity

Repository: qpid-proton
Updated Branches:
  refs/heads/master 87bd8d97e -> e1425d8f0


PROTON-1616: C/C++ fix issues reported by coverity

See https://scan4.coverity.com/reports.htm#v30998/p10556


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/e1425d8f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/e1425d8f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/e1425d8f

Branch: refs/heads/master
Commit: e1425d8f0e3da391ae39ff98c5476d211b910cba
Parents: 87bd8d9
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Oct 12 07:47:59 2017 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Oct 12 09:57:05 2017 -0400

----------------------------------------------------------------------
 examples/c/broker.c                      |  8 +--
 examples/c/direct.c                      |  1 +
 examples/cpp/scheduled_send_03.cpp       |  1 +
 examples/cpp/service_bus.cpp             |  3 +-
 proton-c/bindings/cpp/src/value_test.cpp | 92 ++++++++++++++-------------
 proton-c/src/core/connection_driver.c    |  3 +-
 proton-c/src/proactor/epoll.c            | 16 +++--
 proton-c/src/sasl/default_sasl.c         |  2 +-
 proton-c/src/ssl/openssl.c               |  5 +-
 proton-c/src/tests/test_tools.h          |  2 +-
 10 files changed, 72 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/examples/c/broker.c
----------------------------------------------------------------------
diff --git a/examples/c/broker.c b/examples/c/broker.c
index f862133..d6cb753 100644
--- a/examples/c/broker.c
+++ b/examples/c/broker.c
@@ -70,7 +70,7 @@ typedef struct queue_t {
 
 static void queue_init(queue_t *q, const char* name, queue_t *next) {
   pthread_mutex_init(&q->lock, NULL);
-  strncpy(q->name, name, sizeof(q->name));
+  strncpy(q->name, name, sizeof(q->name)-1);
   VEC_INIT(q->messages);
   VEC_INIT(q->waiting);
   q->next = next;
@@ -80,7 +80,6 @@ static void queue_init(queue_t *q, const char* name, queue_t *next) {
 static void queue_destroy(queue_t *q) {
   size_t i;
   pthread_mutex_destroy(&q->lock);
-  free(q->name);
   for (i = 0; i < q->messages.len; ++i)
     free(q->messages.data[i].start);
   VEC_FINAL(q->messages);
@@ -169,8 +168,9 @@ void queues_init(queues_t *qs) {
 }
 
 void queues_destroy(queues_t *qs) {
-  queue_t *q;
-  for (q = qs->queues; q; q = q->next) {
+  while (qs->queues) {
+    queue_t *q = qs->queues;
+    qs->queues = qs->queues->next;
     queue_destroy(q);
     free(q);
   }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/examples/c/direct.c
----------------------------------------------------------------------
diff --git a/examples/c/direct.c b/examples/c/direct.c
index 63ae090..fb737a1 100644
--- a/examples/c/direct.c
+++ b/examples/c/direct.c
@@ -245,6 +245,7 @@ static bool handle(app_data_t* app, pn_event_t* event) {
      pn_transport_t *t = pn_event_transport(event);
      pn_transport_require_auth(t, false);
      pn_sasl_allowed_mechs(pn_sasl(t), "ANONYMOUS");
+     break;
    }
    case PN_CONNECTION_REMOTE_OPEN: {
      pn_connection_open(pn_event_connection(event)); /* Complete the open */

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/examples/cpp/scheduled_send_03.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/scheduled_send_03.cpp b/examples/cpp/scheduled_send_03.cpp
index 5299bde..d3ba8ab 100644
--- a/examples/cpp/scheduled_send_03.cpp
+++ b/examples/cpp/scheduled_send_03.cpp
@@ -49,6 +49,7 @@ class scheduled_sender : public proton::messaging_handler {
         url(s),
         interval(int(d*proton::duration::SECOND.milliseconds())), // Send interval.
         timeout(int(t*proton::duration::SECOND.milliseconds())), // Cancel after timeout.
+        work_queue(0),
         ready(true),            // Ready to send.
         canceled(false)         // Canceled.
     {}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/examples/cpp/service_bus.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/service_bus.cpp b/examples/cpp/service_bus.cpp
index 3ec7ad1..4b16a62 100644
--- a/examples/cpp/service_bus.cpp
+++ b/examples/cpp/service_bus.cpp
@@ -263,7 +263,8 @@ class sequence : public proton::messaging_handler {
   public:
     static sequence *the_sequence;
 
-    sequence (const std::string &c, const std::string &e) : sequence_no(0),
+    sequence (const std::string &c, const std::string &e) :
+        container(0), sequence_no(0),
         snd(c, e), rcv_red(c, e, "red"), rcv_green(c, e, "green"), rcv_null(c, e, NULL) {
         the_sequence = this;
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/bindings/cpp/src/value_test.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/value_test.cpp b/proton-c/bindings/cpp/src/value_test.cpp
index d9f0f4a..236310b 100644
--- a/proton-c/bindings/cpp/src/value_test.cpp
+++ b/proton-c/bindings/cpp/src/value_test.cpp
@@ -79,51 +79,55 @@ template <class T, class U> void map_test(const U& values, const string& s) {
 }
 
 int main(int, char**) {
-    int failed = 0;
-    scalar_test_group<value>(failed);
-
-    // Sequence tests
-    RUN_TEST(failed, sequence_test<list<bool> >(
-                 ARRAY, many<bool>() + false + true, "@PN_BOOL[false, true]"));
-    RUN_TEST(failed, sequence_test<vector<int> >(
-                 ARRAY, many<int>() + -1 + 2, "@PN_INT[-1, 2]"));
-    RUN_TEST(failed, sequence_test<deque<string> >(
-                 ARRAY, many<string>() + "a" + "b", "@PN_STRING[\"a\", \"b\"]"));
-    RUN_TEST(failed, sequence_test<deque<symbol> >(
-                 ARRAY, many<symbol>() + "a" + "b", "@PN_SYMBOL[:a, :b]"));
-    RUN_TEST(failed, sequence_test<vector<value> >(
-                 LIST, many<value>() + value(0) + value("a"), "[0, \"a\"]"));
-    RUN_TEST(failed, sequence_test<vector<scalar> >(
-                 LIST, many<scalar>() + scalar(0) + scalar("a"), "[0, \"a\"]"));
-
-    // // Map tests
-    typedef pair<string, uint64_t> si_pair;
-    many<si_pair> si_pairs;
-    si_pairs << si_pair("a", 0) << si_pair("b", 1) << si_pair("c", 2);
-
-    RUN_TEST(failed, (map_test<map<string, uint64_t> >(
-                          si_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
-    RUN_TEST(failed, (map_test<vector<si_pair> >(
-                          si_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
-
-    many<std::pair<value,value> > value_pairs(si_pairs);
-    RUN_TEST(failed, (map_test<map<value, value> >(
-                          value_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
-
-    many<pair<scalar,scalar> > scalar_pairs(si_pairs);
-    RUN_TEST(failed, (map_test<map<scalar, scalar> >(
-                          scalar_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
-
-    annotation_key ak(si_pairs[0].first);
-    pair<annotation_key, message_id> p(si_pairs[0]);
-    many<pair<annotation_key, message_id> > restricted_pairs(si_pairs);
-    RUN_TEST(failed, (map_test<map<annotation_key, message_id> >(
-                          restricted_pairs, "{:a=0, :b=1, :c=2}")));
+    try {
+        int failed = 0;
+        scalar_test_group<value>(failed);
+
+        // Sequence tests
+        RUN_TEST(failed, sequence_test<list<bool> >(
+                     ARRAY, many<bool>() + false + true, "@PN_BOOL[false, true]"));
+        RUN_TEST(failed, sequence_test<vector<int> >(
+                     ARRAY, many<int>() + -1 + 2, "@PN_INT[-1, 2]"));
+        RUN_TEST(failed, sequence_test<deque<string> >(
+                     ARRAY, many<string>() + "a" + "b", "@PN_STRING[\"a\", \"b\"]"));
+        RUN_TEST(failed, sequence_test<deque<symbol> >(
+                     ARRAY, many<symbol>() + "a" + "b", "@PN_SYMBOL[:a, :b]"));
+        RUN_TEST(failed, sequence_test<vector<value> >(
+                     LIST, many<value>() + value(0) + value("a"), "[0, \"a\"]"));
+        RUN_TEST(failed, sequence_test<vector<scalar> >(
+                     LIST, many<scalar>() + scalar(0) + scalar("a"), "[0, \"a\"]"));
+
+        // // Map tests
+        typedef pair<string, uint64_t> si_pair;
+        many<si_pair> si_pairs;
+        si_pairs << si_pair("a", 0) << si_pair("b", 1) << si_pair("c", 2);
+
+        RUN_TEST(failed, (map_test<map<string, uint64_t> >(
+                              si_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
+        RUN_TEST(failed, (map_test<vector<si_pair> >(
+                              si_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
+
+        many<std::pair<value,value> > value_pairs(si_pairs);
+        RUN_TEST(failed, (map_test<map<value, value> >(
+                              value_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
+
+        many<pair<scalar,scalar> > scalar_pairs(si_pairs);
+        RUN_TEST(failed, (map_test<map<scalar, scalar> >(
+                              scalar_pairs, "{\"a\"=0, \"b\"=1, \"c\"=2}")));
+
+        annotation_key ak(si_pairs[0].first);
+        pair<annotation_key, message_id> p(si_pairs[0]);
+        many<pair<annotation_key, message_id> > restricted_pairs(si_pairs);
+        RUN_TEST(failed, (map_test<map<annotation_key, message_id> >(
+                              restricted_pairs, "{:a=0, :b=1, :c=2}")));
 
 #if PN_CPP_HAS_CPP11
-    RUN_TEST(failed, sequence_test<forward_list<binary> >(
-                 ARRAY, many<binary>() + binary("xx") + binary("yy"), "@PN_BINARY[b\"xx\", b\"yy\"]"));
-    RUN_TEST(failed, (map_test<unordered_map<string, uint64_t> >(si_pairs, "")));
+        RUN_TEST(failed, sequence_test<forward_list<binary> >(
+                     ARRAY, many<binary>() + binary("xx") + binary("yy"), "@PN_BINARY[b\"xx\", b\"yy\"]"));
+        RUN_TEST(failed, (map_test<unordered_map<string, uint64_t> >(si_pairs, "")));
 #endif
-    return failed;
+        return failed;
+    } catch (const std::exception& e) {
+        std::cout << "ERROR in main(): " << e.what() << std::endl;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/src/core/connection_driver.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/connection_driver.c b/proton-c/src/core/connection_driver.c
index 7c0f597..b60746b 100644
--- a/proton-c/src/core/connection_driver.c
+++ b/proton-c/src/core/connection_driver.c
@@ -33,6 +33,7 @@ struct driver_batch {
 static pn_event_t *batch_next(pn_event_batch_t *batch) {
   pn_connection_driver_t *d =
     (pn_connection_driver_t*)((char*)batch - offsetof(pn_connection_driver_t, batch));
+  if (!d->collector) return NULL;
   pn_event_t *handled = pn_collector_prev(d->collector);
   if (handled) {
     switch (pn_event_type(handled)) {
@@ -40,7 +41,7 @@ static pn_event_t *batch_next(pn_event_batch_t *batch) {
       pn_transport_bind(d->transport, d->connection);
       break;
      case PN_TRANSPORT_CLOSED:  /* No more events after TRANSPORT_CLOSED  */
-      if (d->collector) pn_collector_release(d->collector);
+      pn_collector_release(d->collector);
       break;
      default:
       break;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/src/proactor/epoll.c
----------------------------------------------------------------------
diff --git a/proton-c/src/proactor/epoll.c b/proton-c/src/proactor/epoll.c
index 3cec04c..d5a323c 100644
--- a/proton-c/src/proactor/epoll.c
+++ b/proton-c/src/proactor/epoll.c
@@ -1153,10 +1153,10 @@ static pn_event_batch_t *pconnection_process(pconnection_t *pc, uint32_t events,
 static void configure_socket(int sock) {
   int flags = fcntl(sock, F_GETFL);
   flags |= O_NONBLOCK;
-  fcntl(sock, F_SETFL, flags);
+  (void)fcntl(sock, F_SETFL, flags); // TODO: check for error
 
   int tcp_nodelay = 1;
-  setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*) &tcp_nodelay, sizeof(tcp_nodelay));
+  (void)setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*) &tcp_nodelay, sizeof(tcp_nodelay));
 }
 
 /* Called with context.lock held */
@@ -1177,9 +1177,9 @@ static void pconnection_start(pconnection_t *pc) {
 
   int fd = pc->psocket.sockfd;
   socklen_t len = sizeof(pc->local.ss);
-  getsockname(fd, (struct sockaddr*)&pc->local.ss, &len);
+  (void)getsockname(fd, (struct sockaddr*)&pc->local.ss, &len);
   len = sizeof(pc->remote.ss);
-  getpeername(fd, (struct sockaddr*)&pc->remote.ss, &len);
+  (void)getpeername(fd, (struct sockaddr*)&pc->remote.ss, &len); /* Ignore error, leave ss null */
 
   start_polling(&pc->timer.epoll_io, efd);  // TODO: check for error
   epoll_extended_t *ee = &pc->psocket.epoll_io;
@@ -1203,6 +1203,8 @@ static void pconnection_maybe_connect_lh(pconnection_t *pc) {
           pc->psocket.sockfd = fd;
           pconnection_start(pc);
           return;               /* Async connection started */
+        } else {
+          close(fd);
         }
       }
       /* connect failed immediately, go round the loop to try the next addr */
@@ -1395,6 +1397,8 @@ void pn_proactor_listen(pn_proactor_t *p, pn_listener_t *l, const char *addr, in
         ps->epoll_io.wanted = EPOLLIN;
         ps->epoll_io.polling = false;
         start_polling(&ps->epoll_io, ps->proactor->epollfd);  // TODO: check for error
+      } else {
+        close(fd);
       }
     }
   }
@@ -1654,7 +1658,7 @@ pn_proactor_t *pn_proactor() {
   }
   if (p->epollfd >= 0) close(p->epollfd);
   if (p->eventfd >= 0) close(p->eventfd);
-  if (p->interruptfd >= 0) close(p->eventfd);
+  if (p->interruptfd >= 0) close(p->interruptfd);
   ptimer_finalize(&p->timer);
   if (p->collector) pn_free(p->collector);
   free (p);
@@ -1990,7 +1994,7 @@ void pn_proactor_disconnect(pn_proactor_t *p, pn_condition_t *cond) {
 
   // Second pass: different locking, close the pcontexts, free them if !disconnect_ops
   bool notify = false;
-  for (ctx = disconnecting_pcontexts; ctx; ctx = ctx ? ctx->next : NULL) {
+  for (ctx = disconnecting_pcontexts; ctx; ctx = ctx->next) {
     bool do_free = false;
     bool ctx_notify = true;
     pmutex *ctx_mutex = NULL;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/src/sasl/default_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/default_sasl.c b/proton-c/src/sasl/default_sasl.c
index 66dd318..64ffd3a 100644
--- a/proton-c/src/sasl/default_sasl.c
+++ b/proton-c/src/sasl/default_sasl.c
@@ -159,7 +159,7 @@ bool default_sasl_process_mechanisms(pn_transport_t *transport, const char *mech
       pnx_sasl_is_included_mech(transport, pn_bytes(9, found))) {
     pnx_sasl_set_selected_mechanism(transport, ANONYMOUS);
     if (username) {
-      size_t size = strlen(username);
+      size_t size = strlen(username+1);
       char *iresp = (char *) malloc(size);
       if (!iresp) return false;
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/src/ssl/openssl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c
index 669f975..3929f88 100644
--- a/proton-c/src/ssl/openssl.c
+++ b/proton-c/src/ssl/openssl.c
@@ -806,7 +806,7 @@ bool pn_ssl_get_cipher_name(pn_ssl_t *ssl0, char *buffer, size_t size )
   if (buffer && size) *buffer = '\0';
   if (ssl->ssl && (c = SSL_get_current_cipher( ssl->ssl ))) {
     const char *v = SSL_CIPHER_get_name(c);
-    if (v) {
+    if (buffer && v) {
       pni_snprintf( buffer, size, "%s", v );
       return true;
     }
@@ -822,7 +822,7 @@ bool pn_ssl_get_protocol_name(pn_ssl_t *ssl0, char *buffer, size_t size )
   if (buffer && size) *buffer = '\0';
   if (ssl->ssl && (c = SSL_get_current_cipher( ssl->ssl ))) {
     const char *v = SSL_CIPHER_get_version(c);
-    if (v) {
+    if (buffer && v) {
       pni_snprintf( buffer, size, "%s", v );
       return true;
     }
@@ -1373,7 +1373,6 @@ int pn_ssl_get_cert_fingerprint(pn_ssl_t *ssl0, char *fingerprint, size_t finger
 
     pni_ssl_t *ssl = get_ssl_internal(ssl0);
     X509 *cert = get_peer_certificate(ssl);
-    if (!cert) return PN_ERR;
 
     if(cert) {
         unsigned int len;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e1425d8f/proton-c/src/tests/test_tools.h
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/test_tools.h b/proton-c/src/tests/test_tools.h
index ed832c6..f34b790 100644
--- a/proton-c/src/tests/test_tools.h
+++ b/proton-c/src/tests/test_tools.h
@@ -198,7 +198,7 @@ bool test_str_equal_(test_t *t, const char* want, const char* got, const char *f
 
 /* Ensure buf has at least size bytes, use realloc if need be */
 void rwbytes_ensure(pn_rwbytes_t *buf, size_t size) {
-  if (buf->size < size) {
+  if (buf->start == NULL || buf->size < size) {
     buf->start = (char*)realloc(buf->start, size);
     buf->size = size;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org