Re: [PATCH] libsemanage: Allow tmp files to be kept if a compile fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Richard, are you going to respin this?

On Tue, Jan 16, 2018 at 9:35 AM, William Roberts
<bill.c.roberts@xxxxxxxxx> wrote:
> On Tue, Jan 16, 2018 at 8:00 AM, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote:
>> On Tue, 2018-01-16 at 07:47 -0800, William Roberts wrote:
>>> On Mon, Jan 15, 2018 at 9:32 AM, Stephen Smalley
>>> <stephen.smalley@xxxxxxxxx> wrote:
>>> > On Jan 14, 2018 10:36 AM, "Richard Haines" <richard_c_haines@btinte
>>> > rnet.com>
>>> > wrote:
>>> >
>>> > Add new option to semanage.conf that allows the tmp build files
>>> > to be kept for debugging when building policy.
>>> >
>>> >
>>> > Would it be better to just retain the files by default if there is
>>> > an error?
>>>
>>> I thought about this as well, my reasoning as to why Richard's
>>> approach was
>>> better is that if someone does it N times trying to figure out an
>>> issue,
>>> then there would be N piles of files in the tmp folder. This way they
>>> have to opt in to have their tmp folder spammed.
>>
>> I believe that the tmp directories are deleted and re-created by
>> libsemanage each time before use (otherwise we'd have a different
>> problem with not removing them, since we could end up with a mix of
>> files from different, incomplete transactions being intermingled
>> there). So I don't think this would be a problem.  It might however
>
> Oh I see it looks like its just generating a /tmp "store" directory
> under the semanage path. I thought that enum was triggering a true
> /tmp style thing. I should have looksed closer.
>
>> require saving the commit success/failure result in the handle so that
>> we know in semanage_direct_disconnect() whether or not we should delete
>> it.
>
> Now that I understand that tid-bit, I think you're right, let's just
> leave it on error.
>
>>
>> If we truly need to make it optional, then I'd rather have it be an
>> option flag to semodule and a runtime setting of libsemanage (ala
>> reload, disable_dontaudit, etc) than a semanage.conf setting, as this
>> is something a user will want to be able to use without having to edit
>> a config file, re-run the transaction, and then re-edit the config file
>> each time.  But I'm not convinced we can't just make it the default
>> behavior whenever the commit fails.  Deleting the tmp files
>> automatically only really makes sense when it succeeds.
>
>
>
>>
>>>
>>> >
>>> >
>>> > Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>
>>> > ---
>>> >  libsemanage/man/man5/semanage.conf.5 |  8 ++++++++
>>> >  libsemanage/src/conf-parse.y         | 15 ++++++++++++++-
>>> >  libsemanage/src/conf-scan.l          |  1 +
>>> >  libsemanage/src/direct_api.c         | 21 ++++++++++++---------
>>> >  libsemanage/src/semanage_conf.h      |  1 +
>>> >  5 files changed, 36 insertions(+), 10 deletions(-)
>>> >
>>> > diff --git a/libsemanage/man/man5/semanage.conf.5
>>> > b/libsemanage/man/man5/semanage.conf.5
>>> > index 8f8de55a..10cab65a 100644
>>> > --- a/libsemanage/man/man5/semanage.conf.5
>>> > +++ b/libsemanage/man/man5/semanage.conf.5
>>> > @@ -121,6 +121,14 @@ and by default it is set to "false".
>>> >  Please note that since this option deletes all HLL files, an
>>> > updated HLL
>>> > compiler will not be able to recompile the original HLL file into
>>> > CIL.
>>> >  In order to compile the original HLL file into CIL, the same HLL
>>> > file will
>>> > need to be reinstalled.
>>> >
>>> > +.TP
>>> > +.B retain-tmp
>>> > +When set to "true", tmp directories (the sandbox at
>>> > \fBstore-root/\fR[\fIpolicy-store\fR]\fB/tmp \fRand/or the final
>>> > policy at
>>> > \fBstore-root/final/\fR[\fIpolicy-store\fR]) will be retained after
>>> > compilation to allow debugging of any build errors. Note that on a
>>> > successful build the sandbox becomes
>>> > \fBstore-root/\fR[\fIpolicy-store\fR]\fB/active\fR.
>>> > +.br
>>> > +The
>>> > +.B retain-tmp
>>> > +option can be set to either "true" or "false" and by default it is
>>> > set to
>>> > "false".
>>> > +
>>> >  .SH "SEE ALSO"
>>> >  .TP
>>> >  semanage(8)
>>> > diff --git a/libsemanage/src/conf-parse.y b/libsemanage/src/conf-
>>> > parse.y
>>> > index b527e893..f098e55d 100644
>>> > --- a/libsemanage/src/conf-parse.y
>>> > +++ b/libsemanage/src/conf-parse.y
>>> > @@ -61,7 +61,7 @@ static int parse_errors;
>>> >
>>> >  %token MODULE_STORE VERSION EXPAND_CHECK FILE_MODE SAVE_PREVIOUS
>>> > SAVE_LINKED TARGET_PLATFORM COMPILER_DIR IGNORE_MODULE_CACHE
>>> > STORE_ROOT
>>> >  %token LOAD_POLICY_START SETFILES_START SEFCONTEXT_COMPILE_START
>>> > DISABLE_GENHOMEDIRCON HANDLE_UNKNOWN USEPASSWD IGNOREDIRS
>>> > -%token BZIP_BLOCKSIZE BZIP_SMALL REMOVE_HLL
>>> > +%token BZIP_BLOCKSIZE BZIP_SMALL REMOVE_HLL RETAIN_TMP
>>> >  %token VERIFY_MOD_START VERIFY_LINKED_START VERIFY_KERNEL_START
>>> > BLOCK_END
>>> >  %token PROG_PATH PROG_ARGS
>>> >  %token <s> ARG
>>> > @@ -95,6 +95,7 @@ single_opt:     module_store
>>> >         |       bzip_blocksize
>>> >         |       bzip_small
>>> >         |       remove_hll
>>> > +       |       retain_tmp
>>> >          ;
>>> >
>>> >  module_store:   MODULE_STORE '=' ARG {
>>> > @@ -268,6 +269,17 @@ remove_hll:  REMOVE_HLL'=' ARG {
>>> >         free($3);
>>> >  }
>>> >
>>> > +retain_tmp:  RETAIN_TMP'=' ARG {
>>> > +       if (strcasecmp($3, "false") == 0) {
>>> > +               current_conf->retain_tmp = 0;
>>> > +       } else if (strcasecmp($3, "true") == 0) {
>>> > +               current_conf->retain_tmp = 1;
>>> > +       } else {
>>> > +               yyerror("retain-tmp can only be 'true' or
>>> > 'false'");
>>> > +       }
>>> > +       free($3);
>>> > +}
>>> > +
>>> >  command_block:
>>> >                  command_start external_opts BLOCK_END  {
>>> >                          if (new_external->path == NULL) {
>>> > @@ -352,6 +364,7 @@ static int semanage_conf_init(semanage_conf_t *
>>> > conf)
>>> >         conf->bzip_small = 0;
>>> >         conf->ignore_module_cache = 0;
>>> >         conf->remove_hll = 0;
>>> > +       conf->retain_tmp = 0;
>>> >
>>> >         conf->save_previous = 0;
>>> >         conf->save_linked = 0;
>>> > diff --git a/libsemanage/src/conf-scan.l b/libsemanage/src/conf-
>>> > scan.l
>>> > index 607bbf0b..e26c3494 100644
>>> > --- a/libsemanage/src/conf-scan.l
>>> > +++ b/libsemanage/src/conf-scan.l
>>> > @@ -54,6 +54,7 @@ handle-unknown    return HANDLE_UNKNOWN;
>>> >  bzip-blocksize return BZIP_BLOCKSIZE;
>>> >  bzip-small     return BZIP_SMALL;
>>> >  remove-hll     return REMOVE_HLL;
>>> > +retain-tmp     return RETAIN_TMP;
>>> >  "[load_policy]"   return LOAD_POLICY_START;
>>> >  "[setfiles]"      return SETFILES_START;
>>> >  "[sefcontext_compile]"      return SEFCONTEXT_COMPILE_START;
>>> > diff --git a/libsemanage/src/direct_api.c
>>> > b/libsemanage/src/direct_api.c
>>> > index a455612f..5d2a443c 100644
>>> > --- a/libsemanage/src/direct_api.c
>>> > +++ b/libsemanage/src/direct_api.c
>>> > @@ -326,7 +326,10 @@ static void
>>> > semanage_direct_destroy(semanage_handle_t *
>>> > sh
>>> >  static int semanage_direct_disconnect(semanage_handle_t * sh)
>>> >  {
>>> >         /* destroy transaction */
>>> > -       if (sh->is_in_transaction) {
>>> > +       if (sh->is_in_transaction)
>>> > +               semanage_release_trans_lock(sh);
>>> >
>>> >
>>> > Is it safe to release the trans lock before deleting the sandbox?
>>> >
>>> > +
>>> > +       if (!sh->conf->retain_tmp && sh->is_in_transaction) {
>>> >                 /* destroy sandbox */
>>> >                 if (semanage_remove_directory
>>> >                     (semanage_path(SEMANAGE_TMP,
>>> > SEMANAGE_TOPLEVEL)) < 0) {
>>> > @@ -342,7 +345,6 @@ static int
>>> > semanage_direct_disconnect(semanage_handle_t
>>> > * sh)
>>> >                                                 SEMANAGE_FINAL_TOPL
>>> > EVEL));
>>> >                         return -1;
>>> >                 }
>>> > -               semanage_release_trans_lock(sh);
>>> >         }
>>> >
>>> >         /* Release object databases: local modifications */
>>> > @@ -1639,13 +1641,14 @@ cleanup:
>>> >
>>> >         free(fc_buffer);
>>> >
>>> > -       /* regardless if the commit was successful or not, remove
>>> > the
>>> > -          sandbox if it is still there */
>>> > -       semanage_remove_directory(semanage_path
>>> > -                                 (SEMANAGE_TMP,
>>> > SEMANAGE_TOPLEVEL));
>>> > -       semanage_remove_directory(semanage_final_path
>>> > -                                 (SEMANAGE_FINAL_TMP,
>>> > -                                  SEMANAGE_FINAL_TOPLEVEL));
>>> > +       /* Delete sandbox unless requested by semanage.conf */
>>> > +       if (!sh->conf->retain_tmp) {
>>> > +               semanage_remove_directory(semanage_path
>>> > +                                         (SEMANAGE_TMP,
>>> > SEMANAGE_TOPLEVEL));
>>> > +               semanage_remove_directory(semanage_final_path
>>> > +                                         (SEMANAGE_FINAL_TMP,
>>> > +                                          SEMANAGE_FINAL_TOPLEVEL)
>>> > );
>>> > +       }
>>> >         umask(mask);
>>> >
>>> >         return retval;
>>> > diff --git a/libsemanage/src/semanage_conf.h
>>> > b/libsemanage/src/semanage_conf.h
>>> > index c99ac8c7..f7bba754 100644
>>> > --- a/libsemanage/src/semanage_conf.h
>>> > +++ b/libsemanage/src/semanage_conf.h
>>> > @@ -46,6 +46,7 @@ typedef struct semanage_conf {
>>> >         int bzip_blocksize;
>>> >         int bzip_small;
>>> >         int remove_hll;
>>> > +       int retain_tmp;
>>> >         int ignore_module_cache;
>>> >         char *ignoredirs;       /* ";" separated of list for
>>> > genhomedircon
>>> > to ignore */
>>> >         struct external_prog *load_policy;
>>> > --
>>> > 2.14.3
>>> >
>>> >
>>> >
>>>
>>>
>>>
>
>
>
> --
> Respectfully,
>
> William C Roberts



-- 
Respectfully,

William C Roberts




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux