[libvirt] [PATCH 1/3] Only check for IP forwarding, do not enable it
Michal Privoznik
mprivozn at redhat.com
Mon Oct 15 14:54:33 UTC 2012
On 15.10.2012 12:26, Benjamin Cama wrote:
> Enabling IP forwarding without the administrator's consent is bad. Only
> check for forwarding, do not enable it.
> ---
> src/network/bridge_driver.c | 56 +++++++++++++++++++++++++++++++++----------
> 1 files changed, 43 insertions(+), 13 deletions(-)
>
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index e1846ee..e3e8dc2 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -1853,19 +1853,51 @@ networkReloadIptablesRules(struct network_driver *driver)
> }
> }
>
> -/* Enable IP Forwarding. Return 0 for success, -1 for failure. */
> +#define SYSCTL_PATH "/proc/sys"
> +
> +/* Check for IP Forwarding. Return 0 if required family is enabled, -1 for failure. */
> static int
> -networkEnableIpForwarding(bool enableIPv4, bool enableIPv6)
> +networkCheckIpForwarding(bool checkIPv4, bool checkIPv6)
> {
> int ret = 0;
> - if (enableIPv4)
> - ret = virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n", 0);
> - if (enableIPv6 && ret == 0)
> - ret = virFileWriteStr("/proc/sys/net/ipv6/conf/all/forwarding", "1\n", 0);
> - return ret;
> -}
> + char *buf = NULL;
>
> -#define SYSCTL_PATH "/proc/sys"
> + if (checkIPv4) {
> + ret = virFileReadAll(SYSCTL_PATH "/net/ipv4/ip_forward", 2, &buf);
> + if (ret != 2)
> + goto error;
> + if (STRNEQ(buf, "1\n")) {
> + networkReportError(VIR_ERR_SYSTEM_ERROR,
> + _("IP forwarding is not enabled on your system"));
We dropped networkReportError and use virReportError instead. Moreover,
you miss "%s" there:
virReportError(VIR_ERR_SYSTEM_ERROR, "%s", _("blah"));
> + goto cleanup;
> + }
> + }
> + if (checkIPv6) {
> + if (ret > 0)
This check is useless since VIR_FREE(NULL) is safe.
> + VIR_FREE(buf);
> + ret = virFileReadAll(SYSCTL_PATH "/net/ipv6/conf/all/forwarding", 2, &buf);
> + if (ret != 2)
> + goto error;
> + if (STRNEQ(buf, "1\n")) {
> + networkReportError(VIR_ERR_SYSTEM_ERROR,
> + _("IPv6 forwarding is not enabled on your system"));
> + goto cleanup;
> + }
> + }
> +
> + VIR_FREE(buf);
> + return 0;
> +
> +error:
> + virReportSystemError(errno, "%s", _("cannot check for IP forwarding"));
> +cleanup:
> + if (ret > 0) {
> + VIR_FREE(buf);
> + return -1;
> + } else {
> + return ret;
> + }
> +}
We rather stick with flow:
static int
func(...)
{
int ret = -1;
... <commands> ...
if (cond) goto cleanup;
... <commands> ...
ret = 0;
cleanup:
return ret;
}
>
> static int
> networkSetIPv6Sysctls(virNetworkObjPtr network)
> @@ -2140,11 +2172,9 @@ networkStartNetworkVirtual(struct network_driver *driver,
> if (virNetDevSetOnline(network->def->bridge, 1) < 0)
> goto err2;
>
> - /* If forwardType != NONE, turn on global IP forwarding */
> + /* If forwardType != NONE, check for IP forwarding */
> if (network->def->forwardType != VIR_NETWORK_FORWARD_NONE &&
> - networkEnableIpForwarding(v4present, v6present) < 0) {
> - virReportSystemError(errno, "%s",
> - _("failed to enable IP forwarding"));
> + networkCheckIpForwarding(v4present, v6present) < 0) {
> goto err3;
> }
>
>
Well, I am not sure if we can do this. What would happen if some of our
users rely on this already? I mean, it's there since ages.
Michal
More information about the libvir-list
mailing list