Hi,

From: Masatake YAMATO <[email protected]>
Subject: Re: [LTP] [PATCH 2/3] Proc01: Fix for PPC64 and Support 
SELinux-enabled Environment v2
Date: Thu, 12 Feb 2009 21:09:13 +0900 (JST)

> Sorry to be late.
> 
>> > Index: testcases/kernel/fs/proc/proc01.c
>> > ===================================================================
>> > RCS file: /cvsroot/ltp/ltp/testcases/kernel/fs/proc/proc01.c,v
>> > retrieving revision 1.13
>> > diff -u -u -r1.13 proc01.c
>> > --- testcases/kernel/fs/proc/proc01.c      5 Feb 2009 11:20:49 -0000       
>> > 1.13
>> > +++ testcases/kernel/fs/proc/proc01.c      6 Feb 2009 06:38:22 -0000
>> > @@ -107,19 +107,12 @@
>> >  
>> >  /* If a particular LSM is enabled, it is expected that some entries can
>> >     be read successfully. */
>> > -#ifdef HAVE_SELINUX_SELINUX_H
>> >  const char lsm_should_work[][PATH_MAX] =
>> >    {
>> >      "/proc/self/attr/*",
>> >      "/proc/self/task/[0-9]*/attr/*",
>> >      ""
>> >    };
>> > -#else
>> > -const char lsm_should_work[][PATH_MAX] =
>> > -  {
>> > -    ""
>> > -  };
>> > -#endif
>> >  
>> 
>> No, the above #ifdef statement is intended to make things easier for
>> other LSMs to add their specific entries there. The empty
>> lsm_should_work in the case that none of LSMs is found just to avoid a
>> compilation warning when the code is walking the array below,
>> 
>>   if (is_lsm_enabled())
>>     {
>>       for (i = 0; lsm_should_work[i][0] != '\0'; i++)
>>         {
>>           if (!strcmp(obj, lsm_should_work[i])
>>               || !fnmatch(lsm_should_work[i], obj, FNM_PATHNAME))
>>             return 0;
>>         }
>>     }
> 
> I'm wrong. I misunderstood your code.  I should not touch the array.
> It seems that I did not understand what I would like to do.
>     
>> >  /* Known files that does not honor O_NONBLOCK, so they will hang
>> >     the test while being read. */
>> > @@ -132,7 +125,7 @@
>> >  /* Check if a particular LSM is enabled. */
>> >  int is_lsm_enabled(void)
>> >  {
>> > -#ifdef HAVE_SELINUX_SELINUX_H
>> > +#if defined(HAVE_SELINUX_SELINUX_H) && defined(HAVE_LIBSELINUX)
>> 
>> Is it possible to combine those two macros together if both headers and
>> libraries are detected? I can't think of any use case that you want to
>> try them separately.
> 
> In this patch I'd like to handle the following two odd situations:
> 
> <1> selinux.h is available, but libselinux is not.
> <2> libselinux is available, but selinux.h is not.
>
> My proposals to avoid *compile time error*:
> 
> Under <1> let is_lsm_enabled return 0.
> Under <2> provide the declaration for is_selinux_enabled.
> 
> Could you review again?
>

NAck. Please see comments below.

> 
> 
> Signed-off-by: Masatake YAMATO <[email protected]>
> 
> diff -ruN old/m4/ltp-common.m4 new/m4/ltp-common.m4
> --- old/m4/ltp-common.m4      1970-01-01 09:00:00.000000000 +0900
> +++ new/m4/ltp-common.m4      2009-02-06 15:35:23.000000000 +0900
> @@ -0,0 +1,35 @@
> +dnl
> +dnl Copyright (c) Red Hat Inc., 2009
> +dnl
> +dnl This program is free software;  you can redistribute it and/or
> +dnl modify it under the terms of the GNU General Public License as
> +dnl published by the Free Software Foundation; either version 2 of
> +dnl the License, or (at your option) any later version.
> +dnl
> +dnl This program is distributed in the hope that it will be useful,
> +dnl but WITHOUT ANY WARRANTY;  without even the implied warranty of
> +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> +dnl the GNU General Public License for more details.
> +dnl
> +dnl You should have received a copy of the GNU General Public License
> +dnl along with this program;  if not, write to the Free Software
> +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
> +dnl USA
> +dnl
> +dnl Author: Masatake YAMATO <[email protected]>
> +dnl
> +
> +# LTP_CHECK_LIB(/LIBRARY/,/FUNCTIONS/,[/OTHER-LIBRARIES/])
> +# --------------------------------------------------
> +# LTP_CHECK_LIB works like AC_CHECK_LIB.
> +# But it is customized for LTP.
> +#
> +# 1. LIBS is not updated even if /FUNCTION/ is found in /LIBRARY/.
> +# 2. Instead of LIBS, /LIBRARY/_LIBS is set.
> +# 3. LIBS_/LIBRARY/ is passed to AC_SUBST.
> +#
> +AC_DEFUN([LTP_CHECK_LIB],LIBRARY_LIBS
> +[AH_TEMPLATE(AS_TR_CPP([HAVE_LIB$1]),
> +[Define to 1 if you have the `$1' library (-l$1).])
> +AC_CHECK_LIB($1,$2,[AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1)) 
> AS_TR_CPP([$1_LIBS])="-l$1 $3"],,$3)
> +AC_SUBST(AS_TR_CPP([$1_LIBS]))])
> 

With or without libselinux-devel, the messages from ./configure script
does not look good.

checking selinux/selinux.h usability... no
checking selinux/selinux.h presence... no
checking for selinux/selinux.h... no
./configure: line 5983: LIBRARY_LIBS: command not found
checking for is_selinux_enabled in -lselinux... no
configure: creating ./config.status

checking for selinux/selinux.h... yes
./configure: line 5983: LIBRARY_LIBS: command not found
checking for is_selinux_enabled in -lselinux... yes
configure: creating ./config.status
config.status: creating config.mk

> Index: m4/ltp-selinux.m4
> ===================================================================
> RCS file: /cvsroot/ltp/ltp/m4/ltp-selinux.m4,v
> retrieving revision 1.1
> diff -u -r1.1 ltp-selinux.m4
> --- m4/ltp-selinux.m4 5 Feb 2009 11:18:58 -0000       1.1
> +++ m4/ltp-selinux.m4 12 Feb 2009 11:56:20 -0000
> @@ -22,8 +22,6 @@
>  dnl
>  AC_DEFUN([LTP_CHECK_SELINUX],
>  [dnl
> -AC_CHECK_HEADERS(selinux/selinux.h,[
> -        SELINUX_LIBS="-lselinux"],[
> -        SELINUX_LIBS=""])
> -AC_SUBST(SELINUX_LIBS)
> +AC_CHECK_HEADERS(selinux/selinux.h)
> +LTP_CHECK_LIB(selinux,is_selinux_enabled)
>  ])

It is unnecessary to have two separate macros HAVE_SELINUX_SELINUX_H and
HAVE_LIBSELINUX here, since you don't want to treat those two situation
differently, do you?

<1> selinux.h is available, but libselinux is not.
<2> libselinux is available, but selinux.h is not.

How about to have one here like HAVE_LIBSELINX_DEVEL?

if HAVE_SELINUX_SELINUX_H && HAVE_LIBSELINUX; then
   HAVE_LIBSELINUX_DEVEL = 1
else
   HAVE_LIBSELINUX_DEVEL = 0
fi

In either of those situations, the test just let is_lsm_enabled() return
0, and don't call SELinux specific is_selinux_enabled() at all.

> Index: testcases/kernel/fs/proc/proc01.c
> ===================================================================
> RCS file: /cvsroot/ltp/ltp/testcases/kernel/fs/proc/proc01.c,v
> retrieving revision 1.13
> diff -u -r1.13 proc01.c
> --- testcases/kernel/fs/proc/proc01.c 5 Feb 2009 11:20:49 -0000       1.13
> +++ testcases/kernel/fs/proc/proc01.c 12 Feb 2009 11:56:25 -0000
> @@ -39,8 +39,14 @@
>  #include <fcntl.h>
>  #include <fnmatch.h>
>  
> -#ifdef HAVE_SELINUX_SELINUX_H
> +#if defined(HAVE_SELINUX_SELINUX_H)
>  #include <selinux/selinux.h>
> +#else
> +# if defined(HAVE_LIBSELINUX)
> +  extern int is_selinux_enabled (void);
> +# else
> +  int is_selinux_enabled (void) { return 0; }
> +# endif
>  #endif
>  

It is probably better to merge the alternative definition of
is_selinux_enabled() to the is_lsm_enabled() below, so the code is more
maintainable, and we set a better example for the people to add the next
LSM specific code in the future.

#ifdef HAVE_LIBSELINUX_DEVEL
#include <selinux/selinux.h>
#endif

...

int is_lsm_enabled(void)
{
#ifdef HAVE_LIBSELINUX_DEVEL
  return is_selinux_enabled();
#else
  return 0;
#endif
}

CAI Qian

>  #include "test.h"
> @@ -132,11 +138,7 @@
>  /* Check if a particular LSM is enabled. */
>  int is_lsm_enabled(void)
>  {
> -#ifdef HAVE_SELINUX_SELINUX_H
>    return is_selinux_enabled();
> -#else
> -  return 0;
> -#endif
>  }
>  
>  /* Verify expected failures, and then let the test to continue. */


------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to