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