Repository: qpid-proton Updated Branches: refs/heads/master 7e43dc32d -> 6d873ebed
- Fix 2 Code Analysis warnings in iocp.c - Fix one realloc leak and the fact that the realloc result was not checked. This rippled through codec.c as more functions needed to have error checking. Fix amended by astitc...@apache.org This closes #45 Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6d873ebe Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6d873ebe Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6d873ebe Branch: refs/heads/master Commit: 6d873ebed766fa8a1108f72837ce9b4e05cc5e09 Parents: 7e43dc3 Author: dcristoloveanu <dcri...@microsoft.com> Authored: Thu Jul 9 13:01:30 2015 -0700 Committer: Andrew Stitcher <astitc...@apache.org> Committed: Fri Jul 10 16:30:39 2015 -0400 ---------------------------------------------------------------------- proton-c/include/proton/error.h | 7 ++++++ proton-c/src/codec/codec.c | 43 +++++++++++++++++++++++++++++---- proton-c/src/error.c | 1 + proton-c/src/transport/transport.c | 32 +++++++++++------------- proton-c/src/windows/iocp.c | 4 +-- 5 files changed, 62 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6d873ebe/proton-c/include/proton/error.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/error.h b/proton-c/include/proton/error.h index c6c7d2e..2ed2f31 100644 --- a/proton-c/include/proton/error.h +++ b/proton-c/include/proton/error.h @@ -40,6 +40,7 @@ typedef struct pn_error_t pn_error_t; #define PN_TIMEOUT (-7) #define PN_INTR (-8) #define PN_INPROGRESS (-9) +#define PN_OUT_OF_MEMORY (-10) PN_EXTERN const char *pn_code(int code); @@ -53,6 +54,12 @@ PN_EXTERN int pn_error_code(pn_error_t *error); PN_EXTERN const char *pn_error_text(pn_error_t *error); PN_EXTERN int pn_error_copy(pn_error_t *error, pn_error_t *src); +#define PN_RETURN_IF_ERROR(x) \ +do {\ +int r = (x);\ +if (r < 0) return r; \ +} while (0) + #ifdef __cplusplus } #endif http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6d873ebe/proton-c/src/codec/codec.c ---------------------------------------------------------------------- diff --git a/proton-c/src/codec/codec.c b/proton-c/src/codec/codec.c index 573887e..76ed28e 100644 --- a/proton-c/src/codec/codec.c +++ b/proton-c/src/codec/codec.c @@ -417,8 +417,11 @@ void pn_data_clear(pn_data_t *data) static int pni_data_grow(pn_data_t *data) { - data->capacity = 2*(data->capacity ? data->capacity : 2); - data->nodes = (pni_node_t *) realloc(data->nodes, data->capacity * sizeof(pni_node_t)); + pni_nid_t new_capacity = 2 * (data->capacity ? data->capacity : 2); + pni_node_t *new_nodes = (pni_node_t *)realloc(data->nodes, new_capacity * sizeof(pni_node_t)); + if (new_nodes == NULL) return PN_OUT_OF_MEMORY; + data->capacity = new_capacity; + data->nodes = new_nodes; return 0; } @@ -1111,9 +1114,7 @@ static size_t pni_data_id(pn_data_t *data, pni_node_t *node) static pni_node_t *pni_data_new(pn_data_t *data) { - if (data->capacity <= data->size) { - pni_data_grow(data); - } + if ((data->capacity <= data->size) && (pni_data_grow(data) != 0)) return NULL; pni_node_t *node = pn_data_node(data, ++(data->size)); node->next = 0; node->down = 0; @@ -1369,6 +1370,8 @@ static pni_node_t *pni_data_add(pn_data_t *data) node = pn_data_node(data, current->next); } else { node = pni_data_new(data); + if (!node) return NULL; + // refresh the pointers in case we grew current = pni_data_current(data); parent = pn_data_node(data, data->parent); @@ -1387,6 +1390,8 @@ static pni_node_t *pni_data_add(pn_data_t *data) node = pn_data_node(data, parent->down); } else { node = pni_data_new(data); + if (!node) return NULL; + // refresh the pointers in case we grew parent = pn_data_node(data, data->parent); node->prev = 0; @@ -1398,6 +1403,8 @@ static pni_node_t *pni_data_add(pn_data_t *data) node = pn_data_node(data, 1); } else { node = pni_data_new(data); + if (!node) return NULL; + node->prev = 0; node->parent = 0; } @@ -1429,6 +1436,7 @@ ssize_t pn_data_decode(pn_data_t *data, const char *bytes, size_t size) int pn_data_put_list(pn_data_t *data) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_LIST; return 0; } @@ -1436,6 +1444,7 @@ int pn_data_put_list(pn_data_t *data) int pn_data_put_map(pn_data_t *data) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_MAP; return 0; } @@ -1443,6 +1452,7 @@ int pn_data_put_map(pn_data_t *data) int pn_data_put_array(pn_data_t *data, bool described, pn_type_t type) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_ARRAY; node->described = described; node->type = type; @@ -1458,6 +1468,7 @@ void pni_data_set_array_type(pn_data_t *data, pn_type_t type) int pn_data_put_described(pn_data_t *data) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_DESCRIBED; return 0; } @@ -1465,6 +1476,7 @@ int pn_data_put_described(pn_data_t *data) int pn_data_put_null(pn_data_t *data) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; pni_atom_init(&node->atom, PN_NULL); return 0; } @@ -1472,6 +1484,7 @@ int pn_data_put_null(pn_data_t *data) int pn_data_put_bool(pn_data_t *data, bool b) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_BOOL; node->atom.u.as_bool = b; return 0; @@ -1480,6 +1493,7 @@ int pn_data_put_bool(pn_data_t *data, bool b) int pn_data_put_ubyte(pn_data_t *data, uint8_t ub) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_UBYTE; node->atom.u.as_ubyte = ub; return 0; @@ -1488,6 +1502,7 @@ int pn_data_put_ubyte(pn_data_t *data, uint8_t ub) int pn_data_put_byte(pn_data_t *data, int8_t b) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_BYTE; node->atom.u.as_byte = b; return 0; @@ -1496,6 +1511,7 @@ int pn_data_put_byte(pn_data_t *data, int8_t b) int pn_data_put_ushort(pn_data_t *data, uint16_t us) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_USHORT; node->atom.u.as_ushort = us; return 0; @@ -1504,6 +1520,7 @@ int pn_data_put_ushort(pn_data_t *data, uint16_t us) int pn_data_put_short(pn_data_t *data, int16_t s) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_SHORT; node->atom.u.as_short = s; return 0; @@ -1512,6 +1529,7 @@ int pn_data_put_short(pn_data_t *data, int16_t s) int pn_data_put_uint(pn_data_t *data, uint32_t ui) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_UINT; node->atom.u.as_uint = ui; return 0; @@ -1520,6 +1538,7 @@ int pn_data_put_uint(pn_data_t *data, uint32_t ui) int pn_data_put_int(pn_data_t *data, int32_t i) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_INT; node->atom.u.as_int = i; return 0; @@ -1528,6 +1547,7 @@ int pn_data_put_int(pn_data_t *data, int32_t i) int pn_data_put_char(pn_data_t *data, pn_char_t c) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_CHAR; node->atom.u.as_char = c; return 0; @@ -1536,6 +1556,7 @@ int pn_data_put_char(pn_data_t *data, pn_char_t c) int pn_data_put_ulong(pn_data_t *data, uint64_t ul) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_ULONG; node->atom.u.as_ulong = ul; return 0; @@ -1544,6 +1565,7 @@ int pn_data_put_ulong(pn_data_t *data, uint64_t ul) int pn_data_put_long(pn_data_t *data, int64_t l) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_LONG; node->atom.u.as_long = l; return 0; @@ -1552,6 +1574,7 @@ int pn_data_put_long(pn_data_t *data, int64_t l) int pn_data_put_timestamp(pn_data_t *data, pn_timestamp_t t) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_TIMESTAMP; node->atom.u.as_timestamp = t; return 0; @@ -1560,6 +1583,7 @@ int pn_data_put_timestamp(pn_data_t *data, pn_timestamp_t t) int pn_data_put_float(pn_data_t *data, float f) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_FLOAT; node->atom.u.as_float = f; return 0; @@ -1568,6 +1592,7 @@ int pn_data_put_float(pn_data_t *data, float f) int pn_data_put_double(pn_data_t *data, double d) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_DOUBLE; node->atom.u.as_double = d; return 0; @@ -1576,6 +1601,7 @@ int pn_data_put_double(pn_data_t *data, double d) int pn_data_put_decimal32(pn_data_t *data, pn_decimal32_t d) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_DECIMAL32; node->atom.u.as_decimal32 = d; return 0; @@ -1584,6 +1610,7 @@ int pn_data_put_decimal32(pn_data_t *data, pn_decimal32_t d) int pn_data_put_decimal64(pn_data_t *data, pn_decimal64_t d) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_DECIMAL64; node->atom.u.as_decimal64 = d; return 0; @@ -1592,6 +1619,7 @@ int pn_data_put_decimal64(pn_data_t *data, pn_decimal64_t d) int pn_data_put_decimal128(pn_data_t *data, pn_decimal128_t d) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_DECIMAL128; memmove(node->atom.u.as_decimal128.bytes, d.bytes, 16); return 0; @@ -1600,6 +1628,7 @@ int pn_data_put_decimal128(pn_data_t *data, pn_decimal128_t d) int pn_data_put_uuid(pn_data_t *data, pn_uuid_t u) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_UUID; memmove(node->atom.u.as_uuid.bytes, u.bytes, 16); return 0; @@ -1608,6 +1637,7 @@ int pn_data_put_uuid(pn_data_t *data, pn_uuid_t u) int pn_data_put_binary(pn_data_t *data, pn_bytes_t bytes) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_BINARY; node->atom.u.as_bytes = bytes; return pni_data_intern_node(data, node); @@ -1616,6 +1646,7 @@ int pn_data_put_binary(pn_data_t *data, pn_bytes_t bytes) int pn_data_put_string(pn_data_t *data, pn_bytes_t string) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_STRING; node->atom.u.as_bytes = string; return pni_data_intern_node(data, node); @@ -1624,6 +1655,7 @@ int pn_data_put_string(pn_data_t *data, pn_bytes_t string) int pn_data_put_symbol(pn_data_t *data, pn_bytes_t symbol) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom.type = PN_SYMBOL; node->atom.u.as_bytes = symbol; return pni_data_intern_node(data, node); @@ -1632,6 +1664,7 @@ int pn_data_put_symbol(pn_data_t *data, pn_bytes_t symbol) int pn_data_put_atom(pn_data_t *data, pn_atom_t atom) { pni_node_t *node = pni_data_add(data); + if (node == NULL) return PN_OUT_OF_MEMORY; node->atom = atom; return pni_data_intern_node(data, node); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6d873ebe/proton-c/src/error.c ---------------------------------------------------------------------- diff --git a/proton-c/src/error.c b/proton-c/src/error.c index bbcdf7d..9bef0fc 100644 --- a/proton-c/src/error.c +++ b/proton-c/src/error.c @@ -129,6 +129,7 @@ const char *pn_code(int code) case PN_ARG_ERR: return "PN_ARG_ERR"; case PN_TIMEOUT: return "PN_TIMEOUT"; case PN_INTR: return "PN_INTR"; + case PN_OUT_OF_MEMORY: return "PN_OUT_OF_MEMORY"; default: return "<unknown>"; } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6d873ebe/proton-c/src/transport/transport.c ---------------------------------------------------------------------- diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c index 9ce01bd..7bce3b5 100644 --- a/proton-c/src/transport/transport.c +++ b/proton-c/src/transport/transport.c @@ -798,35 +798,32 @@ bool pni_disposition_batchable(pn_disposition_t *disposition) } } -void pni_disposition_encode(pn_disposition_t *disposition, pn_data_t *data) +static int pni_disposition_encode(pn_disposition_t *disposition, pn_data_t *data) { pn_condition_t *cond = &disposition->condition; switch (disposition->type) { case PN_RECEIVED: - pn_data_put_list(data); + PN_RETURN_IF_ERROR(pn_data_put_list(data)); pn_data_enter(data); - pn_data_put_uint(data, disposition->section_number); - pn_data_put_ulong(data, disposition->section_offset); + PN_RETURN_IF_ERROR(pn_data_put_uint(data, disposition->section_number)); + PN_RETURN_IF_ERROR(pn_data_put_ulong(data, disposition->section_offset)); pn_data_exit(data); - break; + return 0; case PN_ACCEPTED: case PN_RELEASED: - return; + return 0; case PN_REJECTED: - pn_data_fill(data, "[?DL[sSC]]", pn_condition_is_set(cond), ERROR, + return pn_data_fill(data, "[?DL[sSC]]", pn_condition_is_set(cond), ERROR, pn_condition_get_name(cond), pn_condition_get_description(cond), pn_condition_info(cond)); - break; case PN_MODIFIED: - pn_data_fill(data, "[ooC]", + return pn_data_fill(data, "[ooC]", disposition->failed, disposition->undeliverable, disposition->annotations); - break; default: - pn_data_copy(data, disposition->data); - break; + return pn_data_copy(data, disposition->data); } } @@ -2133,11 +2130,11 @@ static int pni_post_disp(pn_transport_t *transport, pn_delivery_t *delivery) if (!pni_disposition_batchable(&delivery->local)) { pn_data_clear(transport->disp_data); - pni_disposition_encode(&delivery->local, transport->disp_data); + PN_RETURN_IF_ERROR(pni_disposition_encode(&delivery->local, transport->disp_data)); return pn_post_frame(transport, AMQP_FRAME_TYPE, ssn->state.local_channel, - "DL[oIIo?DLC]", DISPOSITION, - role, state->id, state->id, delivery->local.settled, - (bool)code, code, transport->disp_data); + "DL[oIIo?DLC]", DISPOSITION, + role, state->id, state->id, delivery->local.settled, + (bool)code, code, transport->disp_data); } if (ssn_state->disp && code == ssn_state->disp_code && @@ -2186,8 +2183,7 @@ static int pni_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *d size_t full_size = bytes.size; pn_bytes_t tag = pn_buffer_bytes(delivery->tag); pn_data_clear(transport->disp_data); - pni_disposition_encode(&delivery->local, transport->disp_data); - + PN_RETURN_IF_ERROR(pni_disposition_encode(&delivery->local, transport->disp_data)); int count = pni_post_amqp_transfer_frame(transport, ssn_state->local_channel, link_state->local_handle, http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6d873ebe/proton-c/src/windows/iocp.c ---------------------------------------------------------------------- diff --git a/proton-c/src/windows/iocp.c b/proton-c/src/windows/iocp.c index 88ae973..404dd36 100644 --- a/proton-c/src/windows/iocp.c +++ b/proton-c/src/windows/iocp.c @@ -304,7 +304,7 @@ pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, sockaddr *addr, socklen_t *addrl pni_events_update(ld, ld->events & ~PN_READABLE); // No pending accepts pn_socket_t accept_sock; - if (result->base.status) { + if (FAILED(result->base.status)) { accept_sock = INVALID_SOCKET; pni_win32_error(ld->error, "accept failure", result->base.status); if (ld->iocp->iocp_trace) @@ -424,7 +424,7 @@ static void complete_connect(connect_result_t *result, HRESULT status) return; } - if (status) { + if (FAILED(status)) { iocpdesc_fail(iocpd, status, "Connect failure"); } else { release_sys_sendbuf(iocpd->socket); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org