You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by cl...@apache.org on 2013/02/03 09:22:00 UTC
svn commit: r1441872 - in /qpid/proton/trunk/proton-c: CMakeLists.txt
examples/messenger/c/recv.c src/codec/codec.c src/engine/engine.c
src/messenger.c src/proton.c src/sasl/sasl.c src/util.c
Author: cliffjansen
Date: Sun Feb 3 08:22:00 2013
New Revision: 1441872
URL: http://svn.apache.org/viewvc?rev=1441872&view=rev
Log:
PROTON-159: C++ support part 4. See https://reviews.apache.org/r/9088/
Modified:
qpid/proton/trunk/proton-c/CMakeLists.txt
qpid/proton/trunk/proton-c/examples/messenger/c/recv.c
qpid/proton/trunk/proton-c/src/codec/codec.c
qpid/proton/trunk/proton-c/src/engine/engine.c
qpid/proton/trunk/proton-c/src/messenger.c
qpid/proton/trunk/proton-c/src/proton.c
qpid/proton/trunk/proton-c/src/sasl/sasl.c
qpid/proton/trunk/proton-c/src/util.c
Modified: qpid/proton/trunk/proton-c/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/CMakeLists.txt?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/CMakeLists.txt (original)
+++ qpid/proton/trunk/proton-c/CMakeLists.txt Sun Feb 3 08:22:00 2013
@@ -187,7 +187,7 @@ if (CMAKE_COMPILER_IS_GNUCC)
if (ENABLE_WARNING_ERROR)
set (WERROR "-Werror")
endif (ENABLE_WARNING_ERROR)
- set (COMPILE_WARNING_FLAGS "${WERROR} -Wall -pedantic-errors -Wc++-compat -Wwrite-strings -Wsign-compare")
+ set (COMPILE_WARNING_FLAGS "${WERROR} -Wall -pedantic-errors -Wc++-compat -Wwrite-strings -Wsign-compare -Wvla")
set (COMPILE_LANGUAGE_FLAGS "-std=c99")
set (COMPILE_PLATFORM_FLAGS "-std=gnu99")
if (ENABLE_UNDEFINED_ERROR)
Modified: qpid/proton/trunk/proton-c/examples/messenger/c/recv.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/examples/messenger/c/recv.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/examples/messenger/c/recv.c (original)
+++ qpid/proton/trunk/proton-c/examples/messenger/c/recv.c Sun Feb 3 08:22:00 2013
@@ -135,8 +135,8 @@ int main(int argc, char** argv)
pn_messenger_get(messenger, message);
check(messenger);
- size_t buffsize = 1024;
- char buffer[buffsize];
+ char buffer[1024];
+ size_t buffsize = sizeof(buffer);
pn_data_t *body = pn_message_body(message);
pn_data_format(body, buffer, &buffsize);
Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Sun Feb 3 08:22:00 2013
@@ -141,23 +141,16 @@ int pn_bytes_format(pn_bytes_t *bytes, c
int pn_print_atom(pn_iatom_t atom)
{
- size_t size = 4;
- while (true) {
- char buf[size];
- pn_bytes_t bytes = pn_bytes(size, buf);
- int err = pn_format_atom(&bytes, atom);
- if (err) {
- if (err == PN_OVERFLOW) {
- size *= 2;
- continue;
- } else {
- return err;
- }
- } else {
- printf("%.*s", (int) (size - bytes.size), buf);
- return 0;
- }
- }
+ char buf[256];
+ unsigned size = 256;
+ pn_bytes_t bytes = pn_bytes(size, buf);
+ int err = pn_format_atom(&bytes, atom);
+ if (err && err != PN_OVERFLOW)
+ return err;
+ printf("%.*s", (int) (size - bytes.size), buf);
+ if (err)
+ printf("... (truncated)");
+ return 0;
}
int pn_format_atom(pn_bytes_t *bytes, pn_iatom_t atom)
@@ -400,24 +393,15 @@ ssize_t pn_format_atoms(char *buf, size_
int pn_print_atoms(const pn_atoms_t *atoms)
{
- int size = 128;
-
- while (true)
- {
- char buf[size];
- ssize_t n = pn_format_atoms(buf, size, *atoms);
- if (n < 0) {
- if (n == PN_OVERFLOW) {
- size *= 2;
- continue;
- } else {
- return n;
- }
- } else {
- printf("%.*s", (int) n, buf);
- return 0;
- }
- }
+ char buf[512];
+ memset(buf, 0, sizeof(buf));
+ ssize_t n = pn_format_atoms(buf, sizeof(buf) - 1, *atoms);
+ if (n < 0 && n != PN_OVERFLOW)
+ return n;
+ printf("%s", buf);
+ if (n == PN_OVERFLOW)
+ printf("... (truncated)");
+ return 0;
}
int pn_decode_atom(pn_bytes_t *bytes, pn_atoms_t *atoms);
@@ -991,6 +975,8 @@ struct pn_data_t {
size_t size;
pn_node_t *nodes;
pn_buffer_t *buf;
+ pn_iatom_t *iatoms;
+ size_t iatom_capacity;
size_t parent;
size_t current;
size_t base_parent;
@@ -1011,6 +997,8 @@ pn_data_t *pn_data(size_t capacity)
data->size = 0;
data->nodes = capacity ? (pn_node_t *) malloc(capacity * sizeof(pn_node_t)) : NULL;
data->buf = pn_buffer(64);
+ data->iatoms = 0;
+ data->iatom_capacity = 0;
data->parent = 0;
data->current = 0;
data->base_parent = 0;
@@ -1026,6 +1014,7 @@ void pn_data_free(pn_data_t *data)
free(data->nodes);
pn_buffer_free(data->buf);
pn_error_free(data->error);
+ free(data->iatoms);
free(data);
}
}
@@ -1730,16 +1719,18 @@ int pn_data_as_atoms(pn_data_t *data, pn
int pn_data_print(pn_data_t *data)
{
- pn_iatom_t atoms[data->size + data->extras];
- pn_atoms_t latoms = {.size=data->size + data->extras, .start=atoms};
+ size_t count = data->size + data->extras;
+ PN_ENSURE(data->iatoms, data->iatom_capacity, count, pn_iatom_t);
+ pn_atoms_t latoms = {count, data->iatoms};
pn_data_as_atoms(data, &latoms);
return pn_print_atoms(&latoms);
}
int pn_data_format(pn_data_t *data, char *bytes, size_t *size)
{
- pn_iatom_t atoms[data->size + data->extras];
- pn_atoms_t latoms = {.size=data->size + data->extras, .start=atoms};
+ size_t count = data->size + data->extras;
+ PN_ENSURE(data->iatoms, data->iatom_capacity, count, pn_iatom_t);
+ pn_atoms_t latoms = {count, data->iatoms};
pn_data_as_atoms(data, &latoms);
ssize_t sz = pn_format_atoms(bytes, *size, latoms);
@@ -2410,9 +2401,9 @@ ssize_t pn_data_decode(pn_data_t *data,
pn_bytes_t lbytes;
while (true) {
- pn_iatom_t atoms[asize];
+ PN_ENSURE(data->iatoms, data->iatom_capacity, asize, pn_iatom_t);
latoms.size = asize;
- latoms.start = atoms;
+ latoms.start = data->iatoms;
lbytes.size = size;
lbytes.start = (char *)bytes; // PROTON-77
Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Sun Feb 3 08:22:00 2013
@@ -1506,7 +1506,9 @@ int pn_do_attach(pn_dispatcher_t *disp)
&target, &tgt_dr, &tgt_exp, &tgt_timeout, &tgt_dynamic,
&idc);
if (err) return err;
- char strname[name.size + 1];
+ char strbuf[128]; // avoid malloc for most link names
+ char *strheap = (name.size >= sizeof(strbuf)) ? (char *) malloc(name.size + 1) : NULL;
+ char *strname = strheap ? strheap : strbuf;
strncpy(strname, name.start, name.size);
strname[name.size] = '\0';
@@ -1524,6 +1526,10 @@ int pn_do_attach(pn_dispatcher_t *disp)
link = link_state->link;
}
+ if (strheap) {
+ free(strheap);
+ }
+
pn_map_handle(ssn_state, handle, link_state);
PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_ACTIVE);
pn_terminus_t *rsrc = &link_state->link->remote_source;
Modified: qpid/proton/trunk/proton-c/src/messenger.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger.c Sun Feb 3 08:22:00 2013
@@ -710,7 +710,8 @@ static const char *default_port(const ch
}
pn_connection_t *pn_messenger_resolve(pn_messenger_t *messenger, char *address, char **name)
{
- char domain[strlen(address) + 1];
+ char domain[256];
+ if (sizeof(domain) < strlen(address) + 1) return NULL;
char *scheme = NULL;
char *user = NULL;
char *pass = NULL;
@@ -782,7 +783,8 @@ void pn_subscription_set_context(pn_subs
pn_link_t *pn_messenger_link(pn_messenger_t *messenger, const char *address, bool sender)
{
- char copy[(address ? strlen(address) : 0) + 1];
+ char copy[256];
+ if (sizeof(copy) <= (address ? strlen(address) : 0)) return NULL;
if (address) {
strcpy(copy, address);
} else {
@@ -830,7 +832,8 @@ pn_link_t *pn_messenger_target(pn_messen
pn_subscription_t *pn_messenger_subscribe(pn_messenger_t *messenger, const char *source)
{
- char copy[strlen(source) + 1];
+ char copy[256];
+ if (strlen(source) >= sizeof(copy)) return NULL;
strcpy(copy, source);
char *scheme = NULL;
@@ -916,17 +919,29 @@ int pn_messenger_set_incoming_window(pn_
static void outward_munge(pn_messenger_t *mng, pn_message_t *msg)
{
+ char stackbuf[256];
+ char *heapbuf = NULL;
+ char *buf = stackbuf;
const char *address = pn_message_get_reply_to(msg);
int len = address ? strlen(address) : 0;
if (len > 1 && address[0] == '~' && address[1] == '/') {
- char buf[len + strlen(mng->name) + 9];
+ unsigned needed = len + strlen(mng->name) + 9;
+ if (needed > sizeof(stackbuf)) {
+ heapbuf = (char *) malloc(needed);
+ buf = heapbuf;
+ }
sprintf(buf, "amqp://%s/%s", mng->name, address + 2);
pn_message_set_reply_to(msg, buf);
} else if (len == 0) {
- char buf[strlen(mng->name) + 8];
+ unsigned needed = strlen(mng->name) + 8;
+ if (needed > sizeof(stackbuf)) {
+ heapbuf = (char *) malloc(needed);
+ buf = heapbuf;
+ }
sprintf(buf, "amqp://%s", mng->name);
pn_message_set_reply_to(msg, buf);
}
+ if (heapbuf) free (heapbuf);
}
// static bool false_pred(pn_messenger_t *messenger) { return false; }
Modified: qpid/proton/trunk/proton-c/src/proton.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/proton.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/proton.c (original)
+++ qpid/proton/trunk/proton-c/src/proton.c Sun Feb 3 08:22:00 2013
@@ -39,6 +39,19 @@
#include <inttypes.h>
#include "protocol.h"
+typedef struct {
+ char *buf;
+ size_t capacity;
+} heap_buffer;
+
+heap_buffer client_msg, client_data, server_data, server_iresp;
+void free_heap_buffers() {
+ free(client_msg.buf);
+ free(client_data.buf);
+ free(server_data.buf);
+ free(server_iresp.buf);
+}
+
int buffer(int argc, char **argv)
{
pn_buffer_t *buf = pn_buffer(16);
@@ -112,7 +125,8 @@ void server_callback(pn_connector_t *cto
case PN_SASL_STEP:
{
size_t n = pn_sasl_pending(sasl);
- char iresp[n];
+ PN_ENSURE(server_iresp.buf, server_iresp.capacity, n, char);
+ char *iresp = server_iresp.buf;
pn_sasl_recv(sasl, iresp, n);
printf("%s", pn_sasl_remote_mechanisms(sasl));
printf(" response = ");
@@ -133,7 +147,8 @@ void server_callback(pn_connector_t *cto
struct server_context *ctx = (struct server_context *) pn_connector_context(ctor);
char tagstr[1024];
char msg[10*1024];
- char data[ctx->size + 16];
+ PN_ENSURE(server_data.buf, server_data.capacity, (size_t) ctx->size + 16, char);
+ char *data = server_data.buf;
for (int i = 0; i < ctx->size; i++) {
msg[i] = 'x';
}
@@ -279,8 +294,10 @@ void client_callback(pn_connector_t *cto
pn_connection_t *connection = pn_connector_connection(ctor);
char tagstr[1024];
- char msg[ctx->size];
- char data[ctx->size + 16];
+ PN_ENSURE(client_msg.buf, client_msg.capacity, (size_t) ctx->size, char);
+ char *msg = client_msg.buf;
+ PN_ENSURE(client_data.buf, client_data.capacity, (size_t) ctx->size + 16, char);
+ char *data = client_data.buf;
for (int i = 0; i < ctx->size; i++) {
msg[i] = 'x';
}
@@ -508,6 +525,7 @@ int main(int argc, char **argv)
}
pn_driver_free(drv);
+ free_heap_buffers();
return 0;
}
Modified: qpid/proton/trunk/proton-c/src/sasl/sasl.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/sasl/sasl.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/sasl/sasl.c (original)
+++ qpid/proton/trunk/proton-c/src/sasl/sasl.c Sun Feb 3 08:22:00 2013
@@ -194,7 +194,7 @@ void pn_sasl_plain(pn_sasl_t *sasl, cons
size_t usize = strlen(user);
size_t psize = strlen(pass);
size_t size = usize + psize + 2;
- char iresp[size];
+ char *iresp = (char *) malloc(size);
iresp[0] = 0;
memmove(iresp + 1, user, usize);
@@ -204,6 +204,7 @@ void pn_sasl_plain(pn_sasl_t *sasl, cons
pn_sasl_mechanisms(sasl, "PLAIN");
pn_sasl_send(sasl, iresp, size);
pn_sasl_client(sasl);
+ free(iresp);
}
void pn_sasl_done(pn_sasl_t *sasl, pn_sasl_outcome_t outcome)
Modified: qpid/proton/trunk/proton-c/src/util.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/util.c?rev=1441872&r1=1441871&r2=1441872&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/util.c (original)
+++ qpid/proton/trunk/proton-c/src/util.c Sun Feb 3 08:22:00 2013
@@ -62,13 +62,17 @@ ssize_t pn_quote_data(char *dst, size_t
void pn_fprint_data(FILE *stream, const char *bytes, size_t size)
{
- size_t capacity = 4*size + 1;
- char buf[capacity];
- ssize_t n = pn_quote_data(buf, capacity, bytes, size);
+ char buf[256];
+ ssize_t n = pn_quote_data(buf, 256, bytes, size);
if (n >= 0) {
fputs(buf, stream);
} else {
- fprintf(stderr, "pn_quote_data: %zi\n", n);
+ if (n == PN_OVERFLOW) {
+ fputs(buf, stream);
+ fputs("... (truncated)", stream);
+ }
+ else
+ fprintf(stderr, "pn_quote_data: %s\n", pn_code(n));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org