[libvirt] [PATCHv2 2/8] audit: split cgroup audit types to allow more information

Daniel P. Berrange berrange at redhat.com
Wed Mar 9 15:07:55 UTC 2011


On Tue, Mar 08, 2011 at 10:13:44PM -0700, Eric Blake wrote:
> Device names can be manipulated, so it is better to also log
> the major/minor device number corresponding to the cgroup ACL
> changes that libvirt made.  This required some refactoring
> of the relatively new qemu cgroup audit code.
> 
> Also, qemuSetupChardevCgroup was only auditing on failure, not success.


> +/* Return rdev=nn:mm in hex for block and character devices, rdev=?
> + * for other file types or stat failure, or NULL on allocation
> + * failure.  */
> +#if defined major && defined minor
> +static char *
> +qemuAuditGetRdev(const char *path)
> +{
> +    char *ret;
> +    struct stat sb;
> +
> +    if (stat(path, &sb) == 0 &&
> +        (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode))) {
> +        int maj = major(sb.st_rdev);
> +        int min = minor(sb.st_rdev);
> +        virAsprintf(&ret, "rdev=%02X:%02X", maj, min);
> +    } else {
> +        ret = strdup("rdev=?");
> +    }
> +    return ret;
> +}
> +#else
> +static char *
> +qemuAuditGetRdev(const char *path ATTRIBUTE_UNUSED)
> +{
> +    return strdup("rdev=?");
> +}
> +#endif

Rather than have the two  strdup("rdev=?")  calls, I reckon it
would be better to just return NULL. Then the caller can just
check for NULL itself & fallback to a static  "rdev=?".

In fact, perhaps this should just do

       virAsprintf(&ret, "%02X:%02X", maj, min);

And...

> +void
> +qemuAuditCgroupPath(virDomainObjPtr vm, virCgroupPtr cgroup,
> +                    const char *reason, const char *path, int rc)
> +{
> +    char *detail;
> +    char *rdev;
> +    char *extra;
> +
> +    /* Nothing to audit for regular files.  */
> +    if (rc > 0)
> +        return;
> +
> +    if (!(detail = virAuditEncode("path", path)) ||
> +        !(rdev = qemuAuditGetRdev(path)) ||
> +        virAsprintf(&extra, "path path=%s %s", path, rdev) < 0) {

...here do 

        virAsprintf(&extra, "path path=%s rdev=%s", path, VIR_AUDIT_STR(rdev)) < 0) {



ACK, to the rest of the patch though.


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list