Re: [pseudo] [PATCH 1/7] pseudo.h: Avoid accessing unallocated memory

Richard Purdie <[email protected]> Wed, 01 Jul 2026 17:47:03 +0100
Newsgroups org.yoctoproject.lists.yocto-patches
Message-ID <340bdc220ec5eff7e0542e825ddde89ce451531f.camel@linuxfoundation.org>
On Wed, 2026-07-01 at 11:40 -0500, Mark Hatle wrote:
> On 7/1/26 8:13 AM, Richard Purdie wrote:
> > We can call STARTSWITH in cases where the item being searched for is longer
> > than the string itself. Switch from memcmp to strncmp to avoid accessing
> > unassigned memory.
> > 
> > Signed-off-by: Richard Purdie <[email protected]>
> > ---
> >   pseudo.h | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/pseudo.h b/pseudo.h
> > index b6c13f2..1152c19 100644
> > --- a/pseudo.h
> > +++ b/pseudo.h
> > @@ -99,7 +99,7 @@ extern char *pseudo_version;
> >    #define PSEUDO_LIBDIR "lib"
> >   #endif
> >   
> > -#define STARTSWITH(x, y) (!memcmp((x), (y), sizeof(y) - 1))
> > +#define STARTSWITH(x, y) (strncmp(y, x, strlen(y)) == 0)
> 
> I've not looked at the users of STARTSWITH.  If they are all strings this is 
> fine.  I believe memcmp was originally used because it could be items with nulls 
> in it.  The bug may be that 'sizeof' was not calculated properly (specifically 
> checking both X and Y, only y.. which can lead that the issue.)

It is only used by pseudo_util.c against envp:

pseudo_util.c:		if (STARTSWITH(envp[i], PRELINK_LIBRARIES "=")) {
pseudo_util.c:		if (STARTSWITH(envp[i], PRELINK_LIBRARIES "=")) {
pseudo_util.c:		if (STARTSWITH(envp[i], PRELINK_PATH "=")) {
pseudo_util.c:		if (STARTSWITH(envp[i], PRELINK_LIBRARIES "=")) continue;
pseudo_util.c:		if (STARTSWITH(envp[i], PRELINK_PATH "=")) continue;

i.e. always on strings.

The bug is that y can be longer than x and the memcmp check doesn't
check for that. I could have put more logic in there but we may as well
just use strncmp.

Cheers,

Richard