node_desc.description buffer is received from the network and should
not be NULL-terminated. In such cases using it as regular string in
functions like strcmp() or printf() leads to segmentation faults.
This patch fixes such usages.

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 diags/src/saquery.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/diags/src/saquery.c b/diags/src/saquery.c
index 5b4a85e..f5b23fd 100644
--- a/diags/src/saquery.c
+++ b/diags/src/saquery.c
@@ -90,17 +90,21 @@ static void
 print_node_desc(ib_node_record_t *node_record)
 {
        ib_node_info_t *p_ni = &(node_record->node_info);
+       ib_node_desc_t *p_nd = &(node_record->node_desc);
        if (p_ni->node_type == IB_NODE_TYPE_CA)
        {
+               char desc[sizeof(p_nd->description) + 1];
+               memcpy(desc, p_nd->description, sizeof(p_nd->description));
+               desc[sizeof(desc) - 1] = '\0';
                printf("%6d  \"%s\"\n",
-                      cl_ntoh16(node_record->lid),
-                      node_record->node_desc.description);
+                      cl_ntoh16(node_record->lid), desc);
        }
 }
 
 void
 print_node_record(ib_node_record_t *node_record)
 {
+       char desc[sizeof(node_record->node_desc.description) + 1];
        ib_node_info_t *p_ni = NULL;
        p_ni = &(node_record->node_info);
         
@@ -117,6 +121,10 @@ print_node_record(ib_node_record_t *node
                break;
         }
 
+       memcpy(desc, node_record->node_desc.description,
+              sizeof(node_record->node_desc.description));
+       desc[sizeof(desc) - 1] = '\0';
+
        printf("NodeRecord dump:\n"
               "\t\tlid.....................0x%X\n"
               "\t\treserved................0x%X\n"
@@ -148,7 +156,7 @@ print_node_record(ib_node_record_t *node
               cl_ntoh32( p_ni->revision ),
               ib_node_info_get_local_port_num( p_ni ),
               cl_ntoh32( ib_node_info_get_vendor_id( p_ni )),
-              node_record->node_desc.description
+              desc
               );
 }
 
@@ -448,8 +456,9 @@ print_node_records(osm_bind_handle_t bin
                        print_node_desc(node_record);
                } else {
                        if (!requested_name ||
-                           (strcmp(requested_name,
-                                   (char *)node_record->node_desc.description) 
== 0)) {
+                           (strncmp(requested_name,
+                                    (char *)node_record->node_desc.description,
+                                    
sizeof(node_record->node_desc.description)) == 0)) {
                                print_node_record(node_record);
                                if (node_print_desc == UNIQUE_LID_ONLY) {
                                        return_mad();
@@ -481,7 +490,8 @@ get_lid_from_name(osm_bind_handle_t bind
        for (i = 0; i < result.result_cnt; i++) {
                node_record = osmv_get_query_node_rec(result.p_result_madw, i);
                p_ni = &(node_record->node_info);
-               if (name && strcmp(name, node_record->node_desc.description) == 
0) {
+               if (name && strncmp(name, (char 
*)node_record->node_desc.description,
+                                   sizeof(node_record->node_desc.description)) 
== 0) {
                        *lid = cl_ntoh16(node_record->lid);
                        break;
                }
-- 
1.4.3.2.g4bf7


_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to