> You're right, this is a bug. The FuzzyHostMatch truncates the base at
> the first numerical character it finds -- the sscanf equivalent of a
> greedy regex match (item.c):
>
> 1044 { struct Item *args;
> 1045 char *sp, refbase[CF_MAXVARSIZE];
> 1046 long cmp = -1, start = -1, end = -1;
> 1047
> 1048 sscanf(refhost,"%[^0-9]%ld",&refbase,&cmp);
> 1049
> 1050 Debug("Found refbase=%s,cmp=%d\n",refbase,cmp);
>
> Results in 'Found refbase=pa,cmp=2' given 'pa2-dhcp-192-168-230-46'
> (which happens to be my test box's hostname at the moment).
>
> I can't think of a ready fix for this but my printf format-fu is not
> strong -- spoiled by real regex engines, I guess. Maybe we should be
> scanning _backwards_ through 'refhost' looking for non-numerics?
> (Steve Rader are you still around? This is your code, steve... :-) )
Patch for 2.1.22 enclosed...
strncpy(refbase,refhost,strlen(refhost));
sp = refbase + strlen(refbase) - 1;
while ( isdigit((int)*sp) ) { sp--; }
sp++;
sscanf(sp,"%ld",&cmp);
*sp = '\0';
...instead.
Mark: let me know if it doesn't work for you.
steve
- - -
--- src/item.c.orig 2006-11-16 09:36:59.999034210 -0600
+++ src/item.c 2007-04-28 08:43:04.484690876 -0500
@@ -1027,14 +1027,14 @@
/*
* do something like...
- * @args = split(/,/,$s1);
* if ( $refhost !~ /(\d+)$/ ) {
- * return 1; # failure: no num in hostname
+ * return 1; # failure: refhost doesn't end in numeral
* }
- * if ( $1 < $args[1] || $1 > $args[2] ) {
- * return 1; # failure: hostname num not in range
+ * $hostnum = $1;
+ * if ( $hostnum < $args[1] || $hostnum > $args[2] ) {
+ * return 1; # failure: refhost hostnum not in range
* }
- * $refhost =~ s/^(.*?)\d.*$/$1/;
+ * $refhost =~ s/^(.*)\d.*$/$1/;
* if ( $refhost ne $args[0] ) {
* return 1; # failure: hostname doesn't match basename
* }
@@ -1042,12 +1042,16 @@
*/
{ struct Item *args;
- char *sp, refbase[CF_MAXVARSIZE];
+ char *sp, refbase[CF_MAXVARSIZE];
long cmp = -1, start = -1, end = -1;
-sscanf(refhost,"%[^0-9]%ld",&refbase,&cmp);
-
-Debug("Found refbase=%s,cmp=%d\n",refbase,cmp);
+strncpy(refbase,refhost,strlen(refhost));
+sp = refbase + strlen(refbase) - 1;
+while ( isdigit((int)*sp) ) { sp--; }
+sp++;
+sscanf(sp,"%ld",&cmp);
+*sp = '\0';
+Debug("SRDEBUG FuzzyHostMatch: refbase=%s,cmp=%d\n",refbase,cmp);
if (cmp < 0)
{
@@ -1063,13 +1067,13 @@
if ( cmp < start || cmp > end )
{
- Debug("Failed on numberical range (%d < %d < %d)",end,cmp,start);
+ Debug("SRDEBUG Failed on numberical range (%d < %d < %d)\n",end,cmp,start);
return 1;
}
if (strcmp(refbase,arg0) != 0)
{
- Debug("Failed on name %s != %s)",refbase,arg0);
+ Debug("SRDEBUG Failed on name (%s != %s)\n",refbase,arg0);
return 1;
}
--- src/functions.c.orig 2007-01-23 09:23:06.384149105 -0600
+++ src/functions.c 2007-04-28 08:36:40.000000000 -0500
@@ -461,16 +461,16 @@
/* VDEFAULTBINSERVER.name is relative domain name */
/* (see nameinfo.c ~line 145) */
-Debug("Parsing fuzzy host succeeded\n");
+Debug("SRDEBUG FuzzyHostParse(%s,%s) succeeded for
%s\n",argv[0],argv[1],VUQNAME);
if (FuzzyHostMatch(argv[0],argv[1],VUQNAME) == 0)
{
- Debug("SRDEBUG SUCCESS!\n");
+ Debug("SRDEBUG FuzzyHostMatch(%s,%s,%s)
succeeded\n",argv[0],argv[1],VUQNAME);
strcpy(value,CF_ANYCLASS);
}
else
{
- Debug("SRDEBUG FAILURE\n");
+ Debug("SRDEBUG FuzzyHostMatch(%s,%s,%s) failed\n",argv[0],argv[1],VUQNAME);
strcpy(value,CF_NOCLASS);
}
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine