Author: rhs
Date: Sat Mar 23 19:24:57 2013
New Revision: 1460214
URL: http://svn.apache.org/r1460214
Log:
PROTON-160: improved error checking
Modified:
qpid/proton/trunk/proton-c/src/messenger.c
Modified: qpid/proton/trunk/proton-c/src/messenger.c
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger.c?rev=1460214&r1=1460213&r2=1460214&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger.c Sat Mar 23 19:24:57 2013
@@ -839,14 +839,19 @@ static bool pni_match(pn_matcher_t *matc
}
}
-static void pni_substitute(pn_matcher_t *matcher, const char *pattern, char
*dest)
+static size_t pni_substitute(pn_matcher_t *matcher, const char *pattern, char
*dest, size_t limit)
{
+ size_t result = 0;
+
while (*pattern) {
switch (*pattern) {
case '$':
pattern++;
if (*pattern == '$') {
- *dest++ = *pattern++;
+ if (result < limit) {
+ *dest++ = *pattern++;
+ }
+ result++;
} else {
size_t idx = 0;
while (isdigit(*pattern)) {
@@ -857,18 +862,29 @@ static void pni_substitute(pn_matcher_t
if (idx <= matcher->groups) {
pn_group_t *group = &matcher->group[idx];
for (size_t i = 0; i < group->size; i++) {
- *dest++ = group->start[i];
+ if (result < limit) {
+ *dest++ = group->start[i];
+ }
+ result++;
}
}
}
break;
default:
- *dest++ = *pattern++;
+ if (result < limit) {
+ *dest++ = *pattern++;
+ }
+ result++;
break;
}
}
- *dest = '\0';
+ if (result < limit) {
+ *dest = '\0';
+ }
+ result++;
+
+ return result;
}
static void pni_parse(pn_address_t *address)
@@ -889,9 +905,16 @@ static pn_route_t *pni_route(pn_messenge
pn_route_t *route = messenger->routes;
while (route) {
if (pni_match(&messenger->matcher, route->pattern, address)) {
- pni_substitute(&messenger->matcher, route->address, addr->text);
- pni_parse(addr);
- return route;
+ size_t n = pni_substitute(&messenger->matcher, route->address,
addr->text, PN_MAX_ADDR);
+ if (n < PN_MAX_ADDR) {
+ pni_parse(addr);
+ return route;
+ } else {
+ pn_error_format(messenger->error, PN_ERR,
+ "routing address exceeded maximum length: (%s -> %s)",
+ route->pattern, route->address);
+ return NULL;
+ }
}
route = route->next;
}
@@ -904,10 +927,15 @@ static pn_route_t *pni_route(pn_messenge
pn_connection_t *pn_messenger_resolve(pn_messenger_t *messenger, const char
*address, char **name)
{
- char domain[256];
- if (sizeof(domain) < strlen(address) + 1) return NULL;
+ char domain[1024];
+ if (sizeof(domain) < strlen(address) + 1) {
+ pn_error_format(messenger->error, PN_ERR,
+ "address exceeded maximum length: %s", address);
+ return NULL;
+ }
pni_route(messenger, address);
+ if (pn_error_code(messenger->error)) return NULL;
char *scheme = messenger->address.scheme;
char *user = messenger->address.user;
@@ -947,7 +975,13 @@ pn_connection_t *pn_messenger_resolve(pn
pn_connector_t *connector = pn_connector(messenger->driver, host,
port ? port : default_port(scheme),
NULL);
- if (!connector) return NULL;
+ if (!connector) {
+ pn_error_format(messenger->error, PN_ERR,
+ "unable to connect to %s: %s", address,
+ pn_driver_error(messenger->driver));
+ return NULL;
+ }
+
pn_connection_t *connection =
pn_messenger_connection(messenger, scheme, user, pass, host, port);
pn_transport_config(messenger, connector, connection);
@@ -1023,6 +1057,7 @@ pn_link_t *pn_messenger_target(pn_messen
pn_subscription_t *pn_messenger_subscribe(pn_messenger_t *messenger, const
char *source)
{
pni_route(messenger, source);
+ if (pn_error_code(messenger->error)) return NULL;
char *scheme = messenger->address.scheme;
char *host = messenger->address.host;
@@ -1037,21 +1072,15 @@ pn_subscription_t *pn_messenger_subscrib
return sub;
} else {
pn_error_format(messenger->error, PN_ERR,
- "unable to subscribe to source: %s (%s)", source,
+ "unable to subscribe to address %s: %s", source,
pn_driver_error(messenger->driver));
return NULL;
}
} else {
pn_link_t *src = pn_messenger_source(messenger, source);
- if (src) {
- pn_subscription_t *sub = (pn_subscription_t *) pn_link_get_context(src);
- return sub;
- } else {
- pn_error_format(messenger->error, PN_ERR,
- "unable to subscribe to source: %s (%s)", source,
- pn_driver_error(messenger->driver));
- return NULL;
- }
+ if (!src) return NULL;
+ pn_subscription_t *sub = (pn_subscription_t *) pn_link_get_context(src);
+ return sub;
}
}
@@ -1125,10 +1154,7 @@ int pn_messenger_put(pn_messenger_t *mes
outward_munge(messenger, msg);
const char *address = pn_message_get_address(msg);
pn_link_t *sender = pn_messenger_target(messenger, address);
- if (!sender)
- return pn_error_format(messenger->error, PN_ERR,
- "unable to send to address: %s (%s)", address,
- pn_driver_error(messenger->driver));
+ if (!sender) return pn_error_code(messenger->error);
pn_buffer_t *buf = messenger->buffer;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]