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 via email to