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. > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list