[Libguestfs] [PATCH] inspect: improve UsrMove detection (RHBZ#1186935)
Pino Toscano
ptoscano at redhat.com
Thu Mar 17 17:26:18 UTC 2016
On Thursday 17 March 2016 16:32:58 Richard W.M. Jones wrote:
> On Thu, Mar 17, 2016 at 12:25:18PM +0100, Pino Toscano wrote:
> > In case /usr is a symlink to /usr/bin, then we cannot rely on /usr/bin
> > to exist, since /usr might be in a different partition. Thus, in case
> > /bin is a symlink, check it points to "usr/bin".
> > ---
> > src/inspect-fs.c | 20 ++++++++++++++++++--
> > 1 file changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/inspect-fs.c b/src/inspect-fs.c
> > index 02fdb2a..0714ae1 100644
> > --- a/src/inspect-fs.c
> > +++ b/src/inspect-fs.c
> > @@ -43,6 +43,7 @@ static int check_filesystem (guestfs_h *g, const char *mountable,
> > int whole_device);
> > static void extend_fses (guestfs_h *g);
> > static int get_partition_context (guestfs_h *g, const char *partition, int *partnum_ret, int *nr_partitions_ret);
> > +static int is_symlink_to (guestfs_h *g, const char *file, const char *wanted_target);
> >
> > /* Find out if 'device' contains a filesystem. If it does, add
> > * another entry in g->fses.
> > @@ -215,8 +216,7 @@ check_filesystem (guestfs_h *g, const char *mountable,
> > /* Linux root? */
> > else if (is_dir_etc &&
> > (is_dir_bin ||
> > - (guestfs_is_symlink (g, "/bin") > 0 &&
> > - guestfs_is_dir (g, "/usr/bin") > 0)) &&
> > + is_symlink_to (g, "/bin", "usr/bin") > 0) &&
> > guestfs_is_file (g, "/etc/fstab") > 0) {
> > fs->is_root = 1;
> > fs->format = OS_FORMAT_INSTALLED;
> > @@ -366,6 +366,22 @@ get_partition_context (guestfs_h *g, const char *partition,
> > return 0;
> > }
> >
> > +static int
> > +is_symlink_to (guestfs_h *g, const char *file, const char *wanted_target)
> > +{
> > + CLEANUP_FREE char *target = NULL;
> > +
> > + if (guestfs_is_symlink (g, file) == 0)
> > + return 0;
> > +
> > + target = guestfs_readlink (g, file);
> > + /* This should not fail, but play safe. */
> > + if (target == NULL)
> > + return 0;
> > +
> > + return STREQ (target, wanted_target);
> > +}
> > +
> > int
> > guestfs_int_is_file_nocase (guestfs_h *g, const char *path)
> > {
>
> Yup, pretty good solution. ACK.
>
> However, worth checking what Debian is doing now, since they
> implemented UsrMove madness just recently.
I just tested it on a Debian/unstable VM and installing usrmerge, as
also described in https://wiki.debian.org/UsrMerge - the detection
worked.
Hence pushing -- thanks!
--
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20160317/327e4ac6/attachment.sig>
More information about the Libguestfs
mailing list