[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Evms-devel] Re: evmsgui crashes on alpha



On Sat, Feb 28, 2004 at 01:45:52PM -0800, Matt Zimmerman wrote:
> On Sat, Feb 28, 2004 at 11:57:58AM -0600, Steve Langasek wrote:

> > I know that evms 1.2 had problems such as this, where some unfortunate
> > casts resulted in 64-bit values being written to the address of a 32-bit
> > field.  I'm not currently using evms on alpha, but I can probably dig up
> > some patches to see whether they still apply to evms 2.2.

> > This ought to be filed as a grave bug against the Debian package, FWIW.

> This is #235328 now, and if you have any insight or patches, by all means
> send them to the BTS.

Ok, I resurrected the retired box long enough to pull my code changes
off of it, and sure enough, evms 2.2 has a 64-bit bug in the same place
as the evms 1.2 codebase.  This time I did a search through the code to
look for the same error in other parts of the code; attached is a patch
which addresses all instances that I found.  Apologies for not having
submitted this patch long ago.

FWIW, I could not reproduce the segfault in question on my current
system, probably because all my disks are using BSD disklabels, which
EVMS does not appear to understand; so this patch *might* not fix the
segfault in question -- but odds are good that it does.  If not, it
might be a good idea to build the whole system with -Wcast-align once,
to see what else shows up.

A bit of friendly 64-bit advise to the EVMS folks: if you have an
explicit data type in your code, don't substitute an arbitrary integer
type for it in your declarations; and if you *do*, at least don't use an
explicit cast to suppress the compiler warnings when you try to use its
address. ;)

Cheers,
-- 
Steve Langasek
postmodern programmer
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/multipath.c
+++ evms-2.2.2/plugins/md/multipath.c
@@ -690,7 +690,7 @@
 	storage_object_t * object;
 	int nr_disks;
 	unsigned long size = -1;
-	int tag;
+	TAG tag;
 	int index = 0;
 	int rc = 0;
 	int i;
@@ -720,7 +720,7 @@
 		return EINVAL;
 	}
 
-	while (!(rc = BlindExtractObject(objects, (TAG *)&tag, NULL, (void *)&object))) {		
+	while (!(rc = BlindExtractObject(objects, &tag, NULL, (void *)&object))) {		
 		volume->child_object[index] = object;
 		index ++;
 	}
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/md_dlist.c
+++ evms-2.2.2/plugins/md/md_dlist.c
@@ -240,12 +240,12 @@
 
 void empty_setup_funcs_queue(md_volume_t *vol)
 {
-	int tag;
+	TAG tag;
 	md_setup_func_t *setup;
 	
 	GoToStartOfList(vol->setup_funcs);
 
-	while (BlindExtractObject(vol->setup_funcs, (TAG *) &tag, NULL, (void**)&setup)==0) {
+	while (BlindExtractObject(vol->setup_funcs, &tag, NULL, (void**)&setup)==0) {
 		if (setup->setup_func) {
 			setup->proceed = FALSE;
 			setup->setup_func(vol, setup);
@@ -302,7 +302,7 @@
 int process_setup_funcs(storage_object_t *region)
 {
 	int rc=0;
-	int tag;
+	TAG tag;
 	md_setup_func_t *setup;
 	md_volume_t * vol;
 
@@ -321,7 +321,7 @@
 	
 	GoToStartOfList(vol->setup_funcs);
 
-	while (!rc && BlindExtractObject(vol->setup_funcs, (TAG *) &tag, NULL, (void**)&setup)==0) {
+	while (!rc && BlindExtractObject(vol->setup_funcs, &tag, NULL, (void**)&setup)==0) {
 		setup->proceed = TRUE;
 		rc = setup->setup_func(vol, setup);
 		EngFncs->engine_free(setup);
@@ -336,7 +336,7 @@
 
 void empty_ioctl_queue(md_volume_t *vol)
 {
-	int tag;
+	TAG tag;
 	md_ioctl_pkg_t *pkg;
 	
 	LOG_ENTRY();
@@ -346,7 +346,7 @@
 	}
 	GoToStartOfList(vol->ioctl_pkgs);
 
-	while (BlindExtractObject(vol->ioctl_pkgs, (TAG *) &tag, NULL, (void**)&pkg)==0) {
+	while (BlindExtractObject(vol->ioctl_pkgs, &tag, NULL, (void**)&pkg)==0) {
 		if (pkg->callback_func) {
 			pkg->callback_func(vol, pkg);
 		}
@@ -357,7 +357,7 @@
 
 void free_ioctl_pkgs(md_volume_t *vol)
 {
-	int tag;
+	TAG tag;
 	md_ioctl_pkg_t *pkg;
 	
 	LOG_ENTRY();
@@ -369,7 +369,7 @@
 
 	GoToStartOfList(vol->ioctl_cleanup);
 
-	while (BlindExtractObject(vol->ioctl_cleanup, (TAG *) &tag, NULL, (void**)&pkg)==0) {
+	while (BlindExtractObject(vol->ioctl_cleanup, &tag, NULL, (void**)&pkg)==0) {
 		if (pkg->callback_func) {
 			pkg->callback_func(vol, pkg);
 		}
@@ -451,7 +451,8 @@
 				      evms_md_ioctl_parm_t *parm)
 {
 	boolean removed = FALSE;
-	int rc, tag;
+	int rc;
+	TAG tag;
 	md_ioctl_pkg_t *pkg;
 
 	LOG_ENTRY();
@@ -459,7 +460,7 @@
 	GoToStartOfList(vol->ioctl_pkgs);
 	do {
 		rc = BlindGetObject(vol->ioctl_pkgs,
-				    (TAG *)&tag,
+				    &tag,
 				    NULL,
 				    TRUE,
 				    (ADDRESS *)&pkg);
@@ -546,7 +547,7 @@
 int process_md_ioctl_pkgs(storage_object_t *region)
 {
 	int rc=0;
-	int tag;
+	TAG tag;
 	void *handle;
 	md_ioctl_pkg_t *pkg;
 	md_volume_t * vol;
@@ -563,7 +564,7 @@
 	
 	GoToStartOfList(vol->ioctl_pkgs);
 
-	while (!rc && BlindExtractObject(vol->ioctl_pkgs, (TAG *) &tag, NULL, (void**)&pkg)==0) {
+	while (!rc && BlindExtractObject(vol->ioctl_pkgs, &tag, NULL, (void**)&pkg)==0) {
 		switch (pkg->cmd) {
 		case EVMS_MD_ADD:
 			disk_info = pkg->parm.disk_info;
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/raid5_mgr.c
+++ evms-2.2.2/plugins/md/raid5_mgr.c
@@ -347,7 +347,7 @@
 	int rc = 0;
 	storage_object_t * object = NULL;
 	dlist_t objects;
-	int tag;
+	TAG tag;
 
 	LOG_ENTRY();
 	if (!name) {
@@ -363,7 +363,7 @@
 				      VALID_INPUT_OBJECT,
 				      &objects);
 	if (!rc) {
-		while (BlindExtractObject(objects, (TAG *) &tag, NULL, (void**)&object)==0) {
+		while (BlindExtractObject(objects, &tag, NULL, (void**)&object)==0) {
 			if (!strncmp(object->name, name, EVMS_VOLUME_NAME_SIZE + 1)) {
 				break;
 			}
@@ -395,7 +395,7 @@
 	storage_object_t * object;
 	int nr_disks;
 	unsigned long size = -1;
-	int tag;
+	TAG tag;
 	int i, spare_disks=0, spare_index = 0, index = 0;
 	int rc = 0;
 	mdp_disk_t disk;
@@ -433,7 +433,7 @@
 		return ENOMEM;
 	}
 
-	while (!(rc = BlindExtractObject(objects, (TAG *)&tag, NULL, (void *)&object))) {
+	while (!(rc = BlindExtractObject(objects, &tag, NULL, (void *)&object))) {
 		size = min(size, object->size);	 /* Track smallest object for super block */
 		volume->child_object[index] = object;
 		index ++;
@@ -872,7 +872,8 @@
 	int rc = 0;
 	storage_object_t * object;
 	dlist_t tmp_list, selected_tmp_list;
-	int count, i, tag;
+	int count, i;
+	TAG tag;
 
 	LOG_ENTRY();
 
@@ -899,7 +900,7 @@
 	}
 
 	GoToStartOfList(selected_tmp_list);
-	while (!BlindExtractObject(selected_tmp_list, (TAG *)&tag, NULL, (void **)&object)) {
+	while (!BlindExtractObject(selected_tmp_list, &tag, NULL, (void **)&object)) {
 		LOG_DETAILS("Object %s selected, removing from spare list\n",object->name);
 		rc = DeleteObject(tmp_list, object);
 		if (rc) {
@@ -927,7 +928,7 @@
 		i = 0;
 		SET_STRING((*value_list)->value[i].s, MD_NO_SELECTION);
 		i++;
-		while (BlindExtractObject(tmp_list, (TAG *) &tag, NULL, (void**)&object)==0) {
+		while (BlindExtractObject(tmp_list, &tag, NULL, (void**)&object)==0) {
 			if (object->size >= min_size) {
 				(*value_list)->value[i].s = EngFncs->engine_alloc(strlen(object->name) + 1);
 				strcpy((*value_list)->value[i].s, object->name);
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/raid0_mgr.c
+++ evms-2.2.2/plugins/md/raid0_mgr.c
@@ -187,7 +187,7 @@
 	storage_object_t * object;
 	int nr_disks;
 	unsigned long size = -1;
-	int tag;
+	TAG tag;
 	int i, spare_disks = 0, index = 0;
 	int rc = 0;
 	mdp_disk_t disk;
@@ -221,7 +221,7 @@
 		return ENOMEM;
 	}
 
-	while (!(rc = BlindExtractObject(objects, (TAG *)&tag, NULL, (void *)&object))) {
+	while (!(rc = BlindExtractObject(objects, &tag, NULL, (void *)&object))) {
 		size = min(size, object->size);	 // track smallest object for super block
 		volume->child_object[index] = object;
 		index ++;
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/raid1_mgr.c
+++ evms-2.2.2/plugins/md/raid1_mgr.c
@@ -720,7 +720,7 @@
 	int rc = 0;
 	storage_object_t * object = NULL;
 	dlist_t objects;
-	int tag;
+	TAG tag;
 
 	LOG_ENTRY();
 	if (!name) {
@@ -736,7 +736,7 @@
 				 VALID_INPUT_OBJECT,
 				 &objects);
 	if (!rc) {
-		while (BlindExtractObject(objects, (TAG *) &tag, NULL, (void**)&object)==0) {
+		while (BlindExtractObject(objects, &tag, NULL, (void**)&object)==0) {
 			if (!strncmp(object->name ,name,128)) {
 				break;
 			}
@@ -767,7 +767,7 @@
 	storage_object_t * object;
 	int nr_disks;
 	unsigned long size = -1;
-	int tag;
+	TAG tag;
 	int i, spare_disks=0, spare_index = 0, index = 0;
 	int rc = 0;
 	mdp_disk_t disk;
@@ -804,7 +804,7 @@
 		return ENOMEM;
 	}
 
-	while (!(rc = BlindExtractObject(objects, (TAG *)&tag, NULL, (void *)&object))) {
+	while (!(rc = BlindExtractObject(objects, &tag, NULL, (void *)&object))) {
 		size = min(size, object->size);	 // track smallest object for super block
 		volume->child_object[index] = object;
 		index ++;
@@ -1288,7 +1288,8 @@
 	int rc = 0;
 	storage_object_t * object;
 	dlist_t tmp_list, selected_tmp_list;
-	int count, i, tag;
+	int count, i;
+	TAG tag;
 
 	LOG_ENTRY();
 	// get the list of objects to search for original volumes
@@ -1314,7 +1315,7 @@
 	}
 
 	GoToStartOfList(selected_tmp_list);
-	while (!BlindExtractObject(selected_tmp_list, (TAG *)&tag, NULL, (void **)&object)) {
+	while (!BlindExtractObject(selected_tmp_list, &tag, NULL, (void **)&object)) {
 		LOG_DETAILS("Object %s selected, removing from spare list\n",object->name);
 		rc = DeleteObject(tmp_list, object);
 		if (rc) {
@@ -1341,7 +1342,7 @@
 		i = 0;
 		SET_STRING((*value_list)->value[i].s,MD_NO_SELECTION);
 		i++;
-		while (BlindExtractObject(tmp_list, (TAG *) &tag, NULL, (void**)&object)==0) {
+		while (BlindExtractObject(tmp_list, &tag, NULL, (void**)&object)==0) {
 			if (object->size >= min_size) {
 				(*value_list)->value[i].s = EngFncs->engine_alloc(strlen(object->name) + 1);
 				strcpy((*value_list)->value[i].s, object->name);
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/linear_mgr.c
+++ evms-2.2.2/plugins/md/linear_mgr.c
@@ -512,7 +512,7 @@
 	storage_object_t * object;
 	int nr_disks;
 	unsigned long size = -1;
-	int tag;
+	TAG tag;
 	int i, index = 0;
 	int rc = 0;
 	mdp_disk_t disk;
@@ -532,7 +532,7 @@
 		LOG_EXIT_INT(EINVAL);
 		return EINVAL;
 	}
-	while (!(rc = BlindExtractObject(objects, (TAG *)&tag, NULL, (void *)&object))) {
+	while (!(rc = BlindExtractObject(objects, &tag, NULL, (void *)&object))) {
 		size = min(size, object->size);  // track smallest object for super block
 		volume->child_object[index] = object;
 		index ++;
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/md/md_discover.c
+++ evms-2.2.2/plugins/md/md_discover.c
@@ -853,7 +853,7 @@
 int md_discover_volumes( dlist_t input_list, dlist_t output_list) {
 	void * waste;
 	storage_object_t * object;
-	int tag;
+	TAG tag;
 	int rc = 0;
 	mdp_super_t      * md_super_buffer;
 
@@ -863,7 +863,7 @@
 	// A buffer for md_check_object_for_pv to use for reading
 	// the PV metadata.
 
-	while (!(rc = BlindExtractObject(input_list, (TAG *)&tag, NULL, (void *)&object))) {
+	while (!(rc = BlindExtractObject(input_list, &tag, NULL, (void *)&object))) {
 		if (object->data_type == DATA_TYPE) {
 			rc = md_check_for_pv(object, &md_super_buffer);
 			if (rc) {
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/jfs/fs_jfs.c
+++ evms-2.2.2/plugins/jfs/fs_jfs.c
@@ -385,7 +385,8 @@
  */
 static int fs_unmkfs_setup(logical_volume_t * volume)
 {
-	int tag, rc = 0;
+	TAG tag;
+	int rc = 0;
 	struct superblock  *sb_ptr = (struct superblock *)volume->private_data;
 	logsuper_t  *log_sb_ptr = NULL;
 	dlist_t JFS_vols;
@@ -416,7 +417,7 @@
 		 * checking for a match of the actual uuid of the external log, and the
 		 * uuid of the external log that is stored in the JFS volume's superblock.
 		 */
-		while (BlindExtractObject(JFS_vols, (TAG *) &tag, NULL, (void**)&extlog_vol)==0) {
+		while (BlindExtractObject(JFS_vols, &tag, NULL, (void**)&extlog_vol)==0) {
 			/* look for the JFS claimed volumes that are JFS external logs */
 			if ( Is_JFS_Log_Vol((logsuper_t *)extlog_vol->private_data) ) {
 				log_sb_ptr = (logsuper_t *)extlog_vol->private_data;
@@ -585,7 +586,8 @@
 static int fs_mkfs_setup(logical_volume_t * volume,
 			 option_array_t   * options)
 {
-	int  i, tag, rc = 0;
+	int  i, rc = 0;
+	TAG tag;
 	char  * ext_log_vol = NULL;
 	dlist_t  avail_ext_logs;
 	logical_volume_t * vol;
@@ -623,7 +625,7 @@
 		 */
 		rc = EngFncs->get_volume_list(NULL, NULL, 0, &avail_ext_logs);
 		GoToStartOfList(avail_ext_logs);
-		while (BlindExtractObject(avail_ext_logs, (TAG *) &tag, NULL, (void**)&vol)==0) {
+		while (BlindExtractObject(avail_ext_logs, &tag, NULL, (void**)&vol)==0) {
 			/*************************************************************
 			 *  TODO: When a min log volume size is put into mkfs.jfs,   *
 			 *  add that requirement here for validation of a volume to  *
@@ -765,7 +767,8 @@
 			    dlist_t         selected_volumes )
 {
 	int rc = 0;
-	int count, i, tag;
+	int count, i;
+	TAG tag;
 	logical_volume_t * vol;
 	dlist_t tmp_list, selected_tmp_list;
 
@@ -800,7 +803,7 @@
 	 * Loop through 'selected' volumes, remove them from temp list.
 	 */
 	GoToStartOfList(selected_tmp_list);
-	while (!BlindExtractObject(selected_tmp_list, (TAG *)&tag, NULL, (void **)&vol)) {
+	while (!BlindExtractObject(selected_tmp_list, &tag, NULL, (void **)&vol)) {
 		LOG_DETAILS("Volume %s selected, removing from 'available' list\n",vol->name);
 		rc = DeleteObject(tmp_list, vol);
 		if (rc) {
@@ -830,7 +833,7 @@
 		i = 0;
 		SET_STRING((*value_list)->value[i].s, NO_SELECTION);
 		i++;
-		while (BlindExtractObject(tmp_list, (TAG *) &tag, NULL, (void**)&vol)==0) {
+		while (BlindExtractObject(tmp_list, &tag, NULL, (void**)&vol)==0) {
 			/* add proper volumes to 'available volumes' list */
 			/*************************************************************
 			 *  TODO: When a min log volume size is put into mkfs.jfs,   *
@@ -866,7 +869,7 @@
 	dlist_t global_volumes;
 	logical_volume_t * volume;
 	void* waste;
-	int tag;
+	TAG tag;
 	int  rc = 0;
 
 	LOG_ENTRY();
@@ -891,7 +894,7 @@
 		EngFncs->get_volume_list(NULL, NULL, 0, &global_volumes);
 	}
 
-	while (!(rc = BlindExtractObject(global_volumes, (TAG *)&tag, NULL, (void **)&volume))) {
+	while (!(rc = BlindExtractObject(global_volumes, &tag, NULL, (void **)&volume))) {
 
 		switch (context->action) {
 			case EVMS_Task_mkfs:
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/ext2/fs_ext2.c
+++ evms-2.2.2/plugins/ext2/fs_ext2.c
@@ -630,7 +630,7 @@
 	dlist_t global_volumes;
 	logical_volume_t * volume;
 	void* waste;
-	int tag;
+	TAG tag;
 	int  rc = 0;
 	option_descriptor_t     *opt;
 
@@ -648,7 +648,7 @@
 
 	rc = EngFncs->get_volume_list(NULL, NULL, 0, &global_volumes);
 
-	while (!(rc = BlindExtractObject(global_volumes, (TAG *)&tag, NULL, (void **)&volume))) {
+	while (!(rc = BlindExtractObject(global_volumes, &tag, NULL, (void **)&volume))) {
 
 		switch (context->action) {
 		case EVMS_Task_mkfs:
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/s390/390segmgr.c
+++ evms-2.2.2/plugins/s390/390segmgr.c
@@ -1337,7 +1337,8 @@
 	int  rc = 0;
 	int count = 0;
 	storage_object_t * object;
-	int tag,waste;
+	TAG tag;
+	int waste;
 
 
 	LOG_ENTRY();
@@ -1345,7 +1346,7 @@
 	rc = GoToStartOfList(input_objects);
 	if (rc == 0) {
 
-		while ((rc=BlindExtractObject(input_objects, (TAG *)&tag, NULL, (void *)&object ))==DLIST_SUCCESS) {
+		while ((rc=BlindExtractObject(input_objects, &tag, NULL, (void *)&object ))==DLIST_SUCCESS) {
 
 			LOG_DEBUG("examining object %s\n", object->name );
 
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/ogfs/fs_ogfs.c
+++ evms-2.2.2/plugins/ogfs/fs_ogfs.c
@@ -684,7 +684,7 @@
  */
 static struct list_element *ogfs_unclaim_volumes(dlist_t volumes, struct list_element *volnames)
 {
-	int tag;
+	TAG tag;
 	logical_volume_t *volume;
 	struct list_element *head = NULL, *vnames = NULL;
 
@@ -696,7 +696,7 @@
 		
 	GoToStartOfList(volumes);
 
-	while (BlindExtractObject(volumes, (TAG *)&tag, NULL, (void**)&volume) == 0
+	while (BlindExtractObject(volumes, &tag, NULL, (void**)&volume) == 0
 		&& vnames != NULL) {
 		struct list_element *element;
 		
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/swap/swapfs.c
+++ evms-2.2.2/plugins/swap/swapfs.c
@@ -633,7 +633,7 @@
 	dlist_t global_volumes;
 	logical_volume_t * volume;
 	void* waste;
-	int tag;
+	TAG tag;
 	int  rc = 0;
 
 	LOG_ENTRY();
@@ -648,7 +648,7 @@
 
 	rc = EngFncs->get_volume_list(NULL, NULL, 0, &global_volumes);
 
-	while (!(rc = BlindExtractObject(global_volumes, (TAG *)&tag, NULL, (void **)&volume))) {
+	while (!(rc = BlindExtractObject(global_volumes, &tag, NULL, (void **)&volume))) {
 
 		switch (context->action) {
 		case EVMS_Task_mkfs:
only in patch2:
unchanged:
--- evms-2.2.2.orig/plugins/reiser/reiserfs.c
+++ evms-2.2.2/plugins/reiser/reiserfs.c
@@ -1162,7 +1162,7 @@
 	dlist_t global_volumes;
 	logical_volume_t * volume;
 	void* waste;
-	int tag;
+	TAG tag;
 	int  rc = 0;
 	value_list_t * value_list;
 
@@ -1180,7 +1180,7 @@
 
 	rc = EngFncs->get_volume_list(NULL, NULL, 0, &global_volumes);
 
-	while (!(rc = BlindExtractObject(global_volumes, (TAG *)&tag, NULL, (void **)&volume))) {
+	while (!(rc = BlindExtractObject(global_volumes, &tag, NULL, (void **)&volume))) {
 
 		switch (context->action) {
 		case EVMS_Task_mkfs:

Attachment: signature.asc
Description: Digital signature


Reply to: