[lvm-devel] shared segtypes loading

Dave Wysochanski dwysocha at redhat.com
Thu Feb 8 16:31:45 UTC 2007


On Wed, 2007-02-07 at 16:15 -0600, dustin at v.igoro.us wrote:
> I'm new to this list, but a longtime user of lvm.  My brief googling for
> this problem turned up nothing, but if it has been discussed before,
> please tell me to RTFA and I'll look harder.
> 
> I believe I may have found a bug in the dynamic loading of segtypes in
> toolcontext.c.  I've posted a bunch of details at
>   http://bugs.gentoo.org/show_bug.cgi?id=131662
> but I'll summarize here to conserve your time.
> 
> When segtypes are loaded dynamically, _init_segtypes first adds them to
> cmd->segtypes:
> 
>         list_add(&cmd->segtypes, &segtype->list);
> 
> and then iterates over that same list, looking for a duplicate name:
> 
>         list_iterate_safe(sgtl, tmp, &cmd->segtypes) {
>                 segtype2 = list_item(sgtl, struct segment_type);
>                 if (!strcmp(segtype2->name, segtype->name)) {
>                         log_error("Duplicate segment type %s: "
>                                   ...
> 
> from my understanding, under any circumstances that this code is executed, at
> some point segtype2 == segtype, and thus the strcmp() returns zero.
> 
> I fixed this locally with a patch (attached to the above Gentoo ticket) tht
> just moves the list_add() below the duplicate check.  This seems effective, but
> the would-never-have-worked nature of this bug (and age of the relevant code)
> makes me suspect I'm missing something.
> 

Moving the add below the list_iterate_safe will still add it to the list
even if there's a duplicate right?  So maybe the right thing is
something like this:

Index: LVM2/lib/commands/toolcontext.c
===================================================================
--- LVM2.orig/lib/commands/toolcontext.c	2007-02-08 11:27:13.000000000 -0500
+++ LVM2/lib/commands/toolcontext.c	2007-02-08 11:27:24.000000000 -0500
@@ -777,7 +777,8 @@ static int _init_segtypes(struct cmd_con
 
 			list_iterate_safe(sgtl, tmp, &cmd->segtypes) {
 				segtype2 = list_item(sgtl, struct segment_type);
-				if (!strcmp(segtype2->name, segtype->name)) {
+				if ( (segtype2 != segtype) &&
+				     !strcmp(segtype2->name, segtype->name)) {
 					log_error("Duplicate segment type %s: "
 						  "unloading shared library %s",
 						  segtype->name, cv->v.str);





More information about the lvm-devel mailing list