On 03/14/2013 12:26 PM, Laine Stump wrote: > On 03/13/2013 06:09 PM, Eric Blake wrote: >> On 03/13/2013 01:37 PM, Laine Stump wrote: >>> My commit 7a2e845a865dc7fa82d2393ea2a770cfc8cf00b4 (and its >>> prerequisites) managed to effectively ignore the >>> clear_emulator_capabilities setting in qemu.conf (visible in the code >>> as the VIR_EXEC_CLEAR_CAPS flag when qemu is being exec'ed), with the >>> result that the capabilities are always cleared regardless of the >>> qemu.conf setting. This patch fixes it by passing the flag through to >>> virSetUIDGIDWithCaps(), which uses it to decide whether or not to >>> clear existing capabilities before adding in those that were >>> requested. >>> >>> Note that the existing capabilities are *always* cleared if the new >>> process is going to run as non-root, since the whole point of running >>> non-root is to have the capabilities removed (it's still possible to >>> add back individual capabilities as needed though). >>> --- >>> This will need to be backported to v1.0.3-maint. >> Yeah, now that Fedora 19 has branched and settled on 1.0.3 as its >> starting point, it looks like v1.0.3-maint will be getting lots of fixes :) >> >>> + if (virSetUIDGIDWithCaps(cmd->uid, cmd->gid, cmd->capabilities, >>> + (cmd->flags & VIR_EXEC_CLEAR_CAPS)) < 0) { >> While gnulib guarantees that we have <stdbool.h>, it also states that we >> cannot rely on C99 rules for slamming random integers into 1 when >> converting into a bool context (especially true for C89 compilers using >> gnulib's emulation, but apparently there are also buggy C99 compilers >> that miscompile things). This should use '(cmd->flags & >> VIR_EXEC_CLEAR_CAPS) != 0' (or !! if you don't like != 0), just to be safe. >> >>> + /* First drop all caps (unless the requested uid is "unchanged" or >>> + * root and clearExistingCaps wasn't requested), then add back >>> + * those in capBits + the extra ones we need to change uid/gid and >>> + * change the capabilities bounding set. >>> */ >>> >>> - capng_clear(CAPNG_SELECT_BOTH); >>> + if (clearExistingCaps || (uid != 1 && uid != 0)) >> Did you mean uid != 0? > Well, actually I meant "uid != -1 && uid != 0" (and I had to look at it > 5 times to see that the negative sign was missing). > > I want to clear the existing caps if: > > A) clearExistingCaps is true (duh) > > or > > B) The new uid will be different, and it will be something other than > root > > >> ACK with those problems addressed. >> Okay, I pushed it after adding "!!" to the bool arg and fixing the "1" to "-1". I also pushed the patch to the v1.0.3-maint branch. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list