Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Aug 2001 06:12:15 +0900
From:      "Akinori MUSHA" <knu@iDaemons.org>
To:        Mike Barcroft <mike@FreeBSD.org>, audit@FreeBSD.org
Subject:   Re: adding -P option to pkg_delete(1)
Message-ID:  <86ofpl0yq8.wl@archon.local.idaemons.org>
In-Reply-To: <20010812164843.A29363@coffee.q9media.com>
References:  <86elqphctp.wl@archon.local.idaemons.org> <86d761hijs.wl@archon.local.idaemons.org> <20010812140750.B29132@coffee.q9media.com> <86snex15o4.wl@archon.local.idaemons.org> <20010812164843.A29363@coffee.q9media.com>

next in thread | previous in thread | raw e-mail | index | archive | help
At Sun, 12 Aug 2001 16:48:43 -0400,
Mike Barcroft wrote:
> 
> On Mon, Aug 13, 2001 at 03:42:19AM +0900, Akinori MUSHA wrote:
> > > This could probably be written better, so that you don't have to walk
> > > filename so many times.
> > 
> > Yes, alternatively you could write it as follows, for example:
> > 
> > 	/*  [^\/]\.so(\.\d+)*$  */
> > 	static Boolean
> > 	is_shlib(char *filename)
> > 	{
> > 	    char *p;
> > 	
> > 	    p = strrchr(filename, 's');
> > 	
> > 	    if (p == NULL || p[1] != 'o' ||
> > 	      p - filename < 2 || p[-1] != '.' || p[-2] == '/')
> > 		return FALSE;
> > 	
> > 	    p += 2;
> > 	
> > 	    /* skip version numbers */
> > 	    while (*p) {
> > 		if (*p != '.' || !isdigit(*++p))
> > 		    return FALSE;
> > 		while (isdigit(*++p))
> > 		    ;
> > 	    }
> > 	
> > 	    return TRUE;
> > 	}
> > 
> > (But I don't like this ;)
> 
> Neither do I.  Mostly because you could be accessing memory before
> filename starts.

No, no.  If (p - filename < 2) is false, the rest is not evaluated.
It would be more than just "don't like" if the code had such a
terrible flaw. ;)

The reason why I don't like it is because it goes to extremes for
performance, to result in less readable, inflexible code.

> I was thinking more along the lines of:
> 
> /*
>  * Returns TRUE if filename matches /\.so$/ or /\.so\.\d+$/, otherwise FALSE.
>  */
> static Boolean
> is_shlib(const char *filename)
> {
> 	int digit;
> 	char *p;
> 
> 	digit = 0;
> 	p = (char *)filename + strlen(filename); 
> 	while (--p > filename && isdigit(*p))
> 		digit = 1;
> 	if (p - 1 <= filename)
> 		return FALSE;
> 	if (digit && *p == '.')
> 		p--;
> 	if (p - 2 > filename && strncmp(p - 2, ".so", 3) == 0)
> 		return TRUE;
> 	else
> 		return FALSE;
> }

I found some problems with it:

  - Note that the .<num> part may repeat, not to mention Linux shared
    libraries.

  - is_shlib("foo/.so") will return TRUE, which can't be a shared
    library but aa dotfile.

  - is_shlib("foo.so4") will return TRUE, which probably isn't a
    shared library.


I'll try more later.  Thanks for sharing the work with me. :)

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"Freeze this moment a little bit longer, make each impression
  a little bit stronger..  Experience slips away -- Time stand still"

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86ofpl0yq8.wl>