Wireshark-dev: [Wireshark-dev] Anonymous union in epan/dissectors/packet-scsi-osd.c not valid w
Date: Sun, 5 Nov 2006 09:41:51 -0600
On Solaris 2.6, compiling 0.99.4 with the Sun C compiler fails because
anonymous unions are not valid. epan/dissectors/packet-scsi-osd.c has:
  typedef struct _scsi_osd_extra_data_t {
	  guint16 svcaction;
	  guint8  gsatype;
	  union {
		  struct {	/* gsatype: attribute list */
			  guint32 get_list_length;
			  guint32 get_list_offset;
			  guint32 get_list_allocation_length;
			  guint32 retreived_list_offset;
			  guint32 set_list_length;
			  guint32 set_list_offset;
		  };
	  };
  } scsi_osd_extra_data_t;

epan/emem.h had a similar problem awhile ago.

Patch attached.

-- 
albert chin (china@xxxxxxxxxxxxxxxxxx)
Index: epan/dissectors/packet-scsi-osd.c
===================================================================
--- epan/dissectors/packet-scsi-osd.c	(revision 19811)
+++ epan/dissectors/packet-scsi-osd.c	(working copy)
@@ -184,8 +184,8 @@
 			guint32 retreived_list_offset;
 			guint32 set_list_length;
 			guint32 set_list_offset;
-		};
-	};
+		} s;
+	} u;
 } scsi_osd_extra_data_t;
 
 static void
@@ -494,33 +494,33 @@
 		break;
 	case 3: /* 5.2.2.3  attribute list */
 		proto_tree_add_item(tree, hf_scsi_osd_get_attributes_list_length, tvb, offset, 4, 0);
-		extra_data->get_list_length=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.get_list_length=tvb_get_ntohl(tvb, offset);
 		offset+=4;
 
 		/* 4.12.5 */
-		extra_data->get_list_offset=tvb_get_ntohl(tvb, offset);
-		extra_data->get_list_offset=(extra_data->get_list_offset&0x0fffffff)<<((extra_data->get_list_offset>>28)&0x0f);
-		extra_data->get_list_offset<<=8;
-		proto_tree_add_uint(tree, hf_scsi_osd_get_attributes_list_offset, tvb, offset, 4, extra_data->get_list_offset);
+		extra_data->u.s.get_list_offset=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.get_list_offset=(extra_data->u.s.get_list_offset&0x0fffffff)<<((extra_data->u.s.get_list_offset>>28)&0x0f);
+		extra_data->u.s.get_list_offset<<=8;
+		proto_tree_add_uint(tree, hf_scsi_osd_get_attributes_list_offset, tvb, offset, 4, extra_data->u.s.get_list_offset);
 		offset+=4;
 
 		proto_tree_add_item(tree, hf_scsi_osd_get_attributes_allocation_length, tvb, offset, 4, 0);
-		extra_data->get_list_allocation_length=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.get_list_allocation_length=tvb_get_ntohl(tvb, offset);
 		offset+=4;
 
 		/* 4.12.5 */
-		extra_data->retreived_list_offset=tvb_get_ntohl(tvb, offset);
-		extra_data->retreived_list_offset=(extra_data->retreived_list_offset&0x0fffffff)<<((extra_data->retreived_list_offset>>28)&0x0f);
-		extra_data->retreived_list_offset<<=8;
-		proto_tree_add_uint(tree, hf_scsi_osd_retreived_attributes_offset, tvb, offset, 4, extra_data->retreived_list_offset);
+		extra_data->u.s.retreived_list_offset=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.retreived_list_offset=(extra_data->u.s.retreived_list_offset&0x0fffffff)<<((extra_data->u.s.retreived_list_offset>>28)&0x0f);
+		extra_data->u.s.retreived_list_offset<<=8;
+		proto_tree_add_uint(tree, hf_scsi_osd_retreived_attributes_offset, tvb, offset, 4, extra_data->u.s.retreived_list_offset);
 		offset+=4;
 
 		proto_tree_add_item(tree, hf_scsi_osd_set_attributes_list_length, tvb, offset, 4, 0);
-		extra_data->set_list_length=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.set_list_length=tvb_get_ntohl(tvb, offset);
 		offset+=4;
 
 		proto_tree_add_item(tree, hf_scsi_osd_set_attributes_list_offset, tvb, offset, 4, 0);
-		extra_data->set_list_offset=tvb_get_ntohl(tvb, offset);
+		extra_data->u.s.set_list_offset=tvb_get_ntohl(tvb, offset);
 		offset+=4;
 
 		/* 4 reserved bytes */
@@ -549,11 +549,11 @@
 /*qqq*/
 		break;
 	case 3: /* 5.2.2.3  attribute list */
-		if(extra_data->get_list_length){
-			dissect_osd_attributes_list(pinfo, tvb, extra_data->get_list_offset, tree);
+		if(extra_data->u.s.get_list_length){
+			dissect_osd_attributes_list(pinfo, tvb, extra_data->u.s.get_list_offset, tree);
 		}
-		if(extra_data->set_list_length){
-			proto_tree_add_text(tree, tvb, extra_data->set_list_offset, extra_data->set_list_length, "Set Attributes Data");
+		if(extra_data->u.s.set_list_length){
+			proto_tree_add_text(tree, tvb, extra_data->u.s.set_list_offset, extra_data->u.s.set_list_length, "Set Attributes Data");
 		}
 		break;
 	}
@@ -578,8 +578,8 @@
 /*qqq*/
 		break;
 	case 3: /* 5.2.2.3  attribute list */
-		if(extra_data->get_list_allocation_length){
-			dissect_osd_attributes_list(pinfo, tvb, extra_data->retreived_list_offset, tree);
+		if(extra_data->u.s.get_list_allocation_length){
+			dissect_osd_attributes_list(pinfo, tvb, extra_data->u.s.retreived_list_offset, tree);
 		}
 		break;
 	}