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 <acon...@redhat.com> Authored: Thu Oct 12 07:47:59 2017 -0400 Committer: Alan Conway <acon...@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-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org