[Opensrf-commits] r1194 - in trunk: include/opensrf src/libopensrf
svn at svn.open-ils.org
svn at svn.open-ils.org
Mon Dec 31 21:16:05 EST 2007
Author: miker
Date: 2007-12-31 20:52:44 -0500 (Mon, 31 Dec 2007)
New Revision: 1194
Modified:
trunk/include/opensrf/transport_message.h
trunk/src/libopensrf/transport_message.c
Log:
Patch from Scott McKellar:
1. Added the const qualifier in various places.
2. Eliminated some unnecessary calls to strlen(), where they were
used merely to determine whether a string was empty.
3. Ensured that all members of a new transport_message are
explicitly populated.
4. Plugged a memory leak in the case where strdup() fails.
5. Eliminated some unhelpful casts of malloc'd pointers.
6. Added some protective tests for NULL pointer parameters.
7. In several spots I replaced numeric literals with character
literals, both to make the code more readable and to avoid a needless
dependence on ASCII.
8. Rewrote the jid_get_resource function to avoid repeatedly
overwriting the same buffer.
Modified: trunk/include/opensrf/transport_message.h
===================================================================
--- trunk/include/opensrf/transport_message.h 2008-01-01 01:42:22 UTC (rev 1193)
+++ trunk/include/opensrf/transport_message.h 2008-01-01 01:52:44 UTC (rev 1194)
@@ -28,7 +28,7 @@
char* router_to;
char* router_class;
char* router_command;
- char* osrf_xid;
+ char* osrf_xid;
int is_error;
char* error_type;
int error_code;
@@ -42,16 +42,17 @@
// within this method.
// Returns NULL on error
// ---------------------------------------------------------------------------------
-transport_message* message_init( char* body, char* subject,
- char* thread, char* recipient, char* sender );
+transport_message* message_init( const char* body, const char* subject,
+ const char* thread, const char* recipient, const char* sender );
transport_message* new_message_from_xml( const char* msg_xml );
-void message_set_router_info( transport_message* msg, char* router_from,
- char* router_to, char* router_class, char* router_command, int broadcast_enabled );
+void message_set_router_info( transport_message* msg, const char* router_from,
+ const char* router_to, const char* router_class, const char* router_command,
+ int broadcast_enabled );
-void message_set_osrf_xid( transport_message* msg, char* osrf_xid );
+void message_set_osrf_xid( transport_message* msg, const char* osrf_xid );
// ---------------------------------------------------------------------------------
// Formats the Jabber message as XML for encoding.
@@ -93,7 +94,7 @@
/** Puts the domain portion of the given jid into the pre-allocated buffer */
void jid_get_domain( const char* jid, char buf[], int size );
-void set_msg_error( transport_message*, char* error_type, int error_code);
+void set_msg_error( transport_message*, const char* error_type, int error_code);
#endif
Modified: trunk/src/libopensrf/transport_message.c
===================================================================
--- trunk/src/libopensrf/transport_message.c 2008-01-01 01:42:22 UTC (rev 1193)
+++ trunk/src/libopensrf/transport_message.c 2008-01-01 01:52:44 UTC (rev 1194)
@@ -4,17 +4,16 @@
// ---------------------------------------------------------------------------------
// Allocates and initializes a new transport_message
// ---------------------------------------------------------------------------------
-transport_message* message_init( char* body,
- char* subject, char* thread, char* recipient, char* sender ) {
+transport_message* message_init( const char* body, const char* subject,
+ const char* thread, const char* recipient, const char* sender ) {
- transport_message* msg =
- (transport_message*) safe_malloc( sizeof(transport_message) );
+ transport_message* msg = safe_malloc( sizeof(transport_message) );
- if( body == NULL ) { body = ""; }
+ if( body == NULL ) { body = ""; }
if( thread == NULL ) { thread = ""; }
if( subject == NULL ) { subject = ""; }
if( sender == NULL ) { sender = ""; }
- if( recipient == NULL ) { recipient = ""; }
+ if( recipient == NULL ) { recipient = ""; }
msg->body = strdup(body);
msg->thread = strdup(thread);
@@ -27,21 +26,53 @@
msg->sender == NULL ) {
osrfLogError(OSRF_LOG_MARK, "message_init(): Out of Memory" );
+ free( msg->body );
+ free( msg->thread );
+ free( msg->subject );
+ free( msg->recipient );
+ free( msg->sender );
+ free( msg );
return NULL;
}
+ msg->router_from = NULL;
+ msg->router_to = NULL;
+ msg->router_class = NULL;
+ msg->router_command = NULL;
+ msg->osrf_xid = NULL;
+ msg->is_error = 0;
+ msg->error_type = NULL;
+ msg->error_code = 0;
+ msg->broadcast = 0;
+ msg->msg_xml = NULL;
+
return msg;
}
transport_message* new_message_from_xml( const char* msg_xml ) {
- if( msg_xml == NULL || strlen(msg_xml) < 1 )
+ if( msg_xml == NULL || *msg_xml == '\0' )
return NULL;
- transport_message* new_msg =
- (transport_message*) safe_malloc( sizeof(transport_message) );
+ transport_message* new_msg = safe_malloc( sizeof(transport_message) );
+ new_msg->body = NULL;
+ new_msg->subject = NULL;
+ new_msg->thread = NULL;
+ new_msg->recipient = NULL;
+ new_msg->sender = NULL;
+ new_msg->router_from = NULL;
+ new_msg->router_to = NULL;
+ new_msg->router_class = NULL;
+ new_msg->router_command = NULL;
+ new_msg->osrf_xid = NULL;
+ new_msg->is_error = 0;
+ new_msg->error_type = NULL;
+ new_msg->error_code = 0;
+ new_msg->broadcast = 0;
+ new_msg->msg_xml = NULL;
+
xmlKeepBlanksDefault(0);
xmlDocPtr msg_doc = xmlReadDoc( BAD_CAST msg_xml, NULL, NULL, 0 );
xmlNodePtr root = xmlDocGetRootElement(msg_doc);
@@ -54,7 +85,7 @@
xmlChar* router_to = xmlGetProp( root, BAD_CAST "router_to" );
xmlChar* router_class= xmlGetProp( root, BAD_CAST "router_class" );
xmlChar* broadcast = xmlGetProp( root, BAD_CAST "broadcast" );
- xmlChar* osrf_xid = xmlGetProp( root, BAD_CAST "osrf_xid" );
+ xmlChar* osrf_xid = xmlGetProp( root, BAD_CAST "osrf_xid" );
if( osrf_xid ) {
message_set_osrf_xid( new_msg, (char*) osrf_xid);
@@ -62,40 +93,40 @@
}
if( router_from ) {
- new_msg->sender = strdup((char*)router_from);
+ new_msg->sender = strdup((const char*)router_from);
} else {
if( sender ) {
- new_msg->sender = strdup((char*)sender);
+ new_msg->sender = strdup((const char*)sender);
xmlFree(sender);
}
}
if( recipient ) {
- new_msg->recipient = strdup((char*)recipient);
+ new_msg->recipient = strdup((const char*)recipient);
xmlFree(recipient);
}
if(subject){
- new_msg->subject = strdup((char*)subject);
+ new_msg->subject = strdup((const char*)subject);
xmlFree(subject);
}
if(thread) {
- new_msg->thread = strdup((char*)thread);
+ new_msg->thread = strdup((const char*)thread);
xmlFree(thread);
}
if(router_from) {
- new_msg->router_from = strdup((char*)router_from);
+ new_msg->router_from = strdup((const char*)router_from);
xmlFree(router_from);
}
if(router_to) {
- new_msg->router_to = strdup((char*)router_to);
+ new_msg->router_to = strdup((const char*)router_to);
xmlFree(router_to);
}
if(router_class) {
- new_msg->router_class = strdup((char*)router_class);
+ new_msg->router_class = strdup((const char*)router_class);
xmlFree(router_class);
}
if(broadcast) {
- if(strcmp((char*) broadcast,"0") )
+ if(strcmp((const char*) broadcast,"0") )
new_msg->broadcast = 1;
xmlFree(broadcast);
}
@@ -103,19 +134,19 @@
xmlNodePtr search_node = root->children;
while( search_node != NULL ) {
- if( ! strcmp( (char*) search_node->name, "thread" ) ) {
+ if( ! strcmp( (const char*) search_node->name, "thread" ) ) {
if( search_node->children && search_node->children->content )
- new_msg->thread = strdup( (char*) search_node->children->content );
+ new_msg->thread = strdup( (const char*) search_node->children->content );
}
- if( ! strcmp( (char*) search_node->name, "subject" ) ) {
+ if( ! strcmp( (const char*) search_node->name, "subject" ) ) {
if( search_node->children && search_node->children->content )
- new_msg->subject = strdup( (char*) search_node->children->content );
+ new_msg->subject = strdup( (const char*) search_node->children->content );
}
- if( ! strcmp( (char*) search_node->name, "body" ) ) {
+ if( ! strcmp( (const char*) search_node->name, "body" ) ) {
if( search_node->children && search_node->children->content )
- new_msg->body = strdup((char*) search_node->children->content );
+ new_msg->body = strdup((const char*) search_node->children->content );
}
search_node = search_node->next;
@@ -135,16 +166,19 @@
return new_msg;
}
-void message_set_osrf_xid( transport_message* msg, char* osrf_xid ) {
+void message_set_osrf_xid( transport_message* msg, const char* osrf_xid ) {
if(!msg) return;
if( osrf_xid )
msg->osrf_xid = strdup(osrf_xid);
else msg->osrf_xid = strdup("");
}
-void message_set_router_info( transport_message* msg, char* router_from,
- char* router_to, char* router_class, char* router_command, int broadcast_enabled ) {
+void message_set_router_info( transport_message* msg, const char* router_from,
+ const char* router_to, const char* router_class, const char* router_command,
+ int broadcast_enabled ) {
+ if( !msg ) return;
+
if(router_from)
msg->router_from = strdup(router_from);
else
@@ -178,8 +212,9 @@
/* encodes the message for traversal */
int message_prepare_xml( transport_message* msg ) {
- if( msg->msg_xml != NULL ) { return 1; }
- msg->msg_xml = message_to_xml( msg );
+ if( !msg ) return 0;
+ if( msg->msg_xml == NULL )
+ msg->msg_xml = message_to_xml( msg );
return 1;
}
@@ -199,7 +234,7 @@
free(msg->router_to);
free(msg->router_class);
free(msg->router_command);
- free(msg->osrf_xid);
+ free(msg->osrf_xid);
if( msg->error_type != NULL ) free(msg->error_type);
if( msg->msg_xml != NULL ) free(msg->msg_xml);
free(msg);
@@ -227,7 +262,7 @@
if( ! msg ) {
osrfLogWarning(OSRF_LOG_MARK, "Passing NULL message to message_to_xml()");
- return 0;
+ return NULL;
}
doc = xmlReadDoc( BAD_CAST "<message/>", NULL, NULL, XML_PARSE_NSCLEAN );
@@ -260,21 +295,21 @@
char* subject = msg->subject;
char* thread = msg->thread;
- if( thread && strlen(thread) > 0 ) {
+ if( thread && *thread ) {
thread_node = xmlNewChild(message_node, NULL, (xmlChar*) "thread", NULL );
xmlNodePtr txt = xmlNewText((xmlChar*) thread);
xmlAddChild(thread_node, txt);
xmlAddChild(message_node, thread_node);
}
- if( subject && strlen(subject) > 0 ) {
+ if( subject && *subject ) {
subject_node = xmlNewChild(message_node, NULL, (xmlChar*) "subject", NULL );
xmlNodePtr txt = xmlNewText((xmlChar*) subject);
xmlAddChild(subject_node, txt);
xmlAddChild( message_node, subject_node );
}
- if( body && strlen(body) > 0 ) {
+ if( body && *body ) {
body_node = xmlNewChild(message_node, NULL, (xmlChar*) "body", NULL);
xmlNodePtr txt = xmlNewText((xmlChar*) body);
xmlAddChild(body_node, txt);
@@ -283,7 +318,7 @@
xmlBufferPtr xmlbuf = xmlBufferCreate();
xmlNodeDump( xmlbuf, doc, xmlDocGetRootElement(doc), 0, 0);
- char* xml = strdup((char*) (xmlBufferContent(xmlbuf)));
+ char* xml = strdup((const char*) (xmlBufferContent(xmlbuf)));
xmlBufferFree(xmlbuf);
xmlFreeDoc( doc );
xmlCleanupParser();
@@ -294,16 +329,16 @@
void jid_get_username( const char* jid, char buf[], int size ) {
- if( jid == NULL ) { return; }
+ if( jid == NULL || buf == NULL || size <= 0 ) { return; }
/* find the @ and return whatever is in front of it */
int len = strlen( jid );
int i;
for( i = 0; i != len; i++ ) {
- if( jid[i] == 64 ) { /*ascii @*/
+ if( jid[i] == '@' ) {
if(i > size) i = size;
- strncpy( buf, jid, i );
- buf[i] = '\0'; // strncpy doesn't provide the nul
+ memcpy( buf, jid, i );
+ buf[i] = '\0';
return;
}
}
@@ -311,17 +346,19 @@
void jid_get_resource( const char* jid, char buf[], int size) {
- if( jid == NULL ) { return; }
- int len = strlen( jid );
- int i;
- for( i = 0; i!= len; i++ ) {
- if( jid[i] == 47 ) { /* ascii / */
- const char* start = jid + i + 1; /* right after the '/' */
- int rlen = len - (i+1);
- if(rlen > size) rlen = size;
- strncpy( buf, start, rlen );
- buf[rlen] = '\0'; // strncpy doesn't provide the nul
- }
+ if( jid == NULL || buf == NULL || size <= 0 ) { return; }
+
+ // Find the last slash, if any
+
+ const char* start = strrchr( jid, '/' );
+ if( start ) {
+
+ // Copy the text beyond the slash, up to a maximum size
+
+ size_t len = strlen( ++start );
+ if( len > size ) len = size;
+ memcpy( buf, start, len );
+ buf[ len ] = '\0';
}
}
@@ -335,9 +372,9 @@
int index2 = 0;
for( i = 0; i!= len; i++ ) {
- if(jid[i] == 64) /* ascii @ */
+ if(jid[i] == '@')
index1 = i + 1;
- else if(jid[i] == 47 && index1 != 0) /* ascii / */
+ else if(jid[i] == '/' && index1 != 0)
index2 = i;
}
@@ -349,9 +386,11 @@
}
}
-void set_msg_error( transport_message* msg, char* type, int err_code ) {
+void set_msg_error( transport_message* msg, const char* type, int err_code ) {
- if( type != NULL && strlen( type ) > 0 ) {
+ if( !msg ) return;
+
+ if( type != NULL && *type ) {
msg->error_type = safe_malloc( strlen(type)+1);
strcpy( msg->error_type, type );
msg->error_code = err_code;
More information about the opensrf-commits
mailing list