Re: [patch] libsemanage: do not hard link files

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

 



On 8/5/09 11:19 AM, "Stephen Smalley" <sds@xxxxxxxxxxxxx> wrote:

> Remove the support for hard linking files in semanage_copy_file, as it
> is unsafe and can leave the active store corrupted if something goes
> wrong during the transaction.  It also can leave the installed policy
> files with incorrect file modes or security contexts.
> 
> To do this safely, we would need to change all functions that write to
> the sandbox files to first unlink the destination file.  This was done
> in the original patch for the write_file helper but not for other cases.
> It would need to be done for all functions that open.*O_CREAT or
> fopen.*w on a file in the sandbox.
> 
> We also don't want this applied to the installed policy files, as they
> need to be created with appropriate file modes and security contexts
> that may differ from the sandbox files.  At present, the hard link
> support will only affect the installed policy files when they are first
> created; afterward the link() call will always fail with EEXIST since
> they are not unlinked prior to installation (nor would that be safe as
> it could leave the system without a policy - rename would make more
> sense in that situation).  If we were to re-introduce hard link support,
> we ought to use different helpers or flags for installing the policy
> files than for copying the active store to the temporary sandbox to
> avoid affecting both.
> 
> Signed-off-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>
> 
> diff --git a/libsemanage/src/direct_api.c b/libsemanage/src/direct_api.c
> index 855226a..d563841 100644
> --- a/libsemanage/src/direct_api.c
> +++ b/libsemanage/src/direct_api.c
> @@ -559,8 +559,6 @@ static int write_file(semanage_handle_t * sh,
>  {
> int out;
>  
> - /* Unlink no matter what, incase this file is a hard link, ignore error */
> - unlink(filename);
> if ((out =
>     open(filename, O_WRONLY | O_CREAT | O_TRUNC,
>  S_IRUSR | S_IWUSR)) == -1) {

Why remove the unlink() call here? Isn't it safer to leave this. Otherwise,
if the file was previously a hard link (say because the user was using a
version of libsemanage before your patch), we'll break things. Or am I
missing something?

Other than that I like the idea of removing the brokenness by always making
a copy.

Thanks,
Chad


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

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

  Powered by Linux