Merge pull request #2038 from dgageot/brownoxford-validate-cidr

Additional validation on virtualbox-hostonly-cidr
This commit is contained in:
Nathan LeClaire 2015-10-21 11:54:48 -07:00
commit 97fcc446d7
2 changed files with 42 additions and 4 deletions

View File

@ -45,6 +45,7 @@ const (
var (
ErrUnableToGenerateRandomIP = errors.New("unable to generate random IP")
ErrMustEnableVTX = errors.New("This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory.")
ErrNetworkAddrCidr = errors.New("host-only cidr must be specified with a host address, not a network address")
)
type Driver struct {
@ -658,19 +659,17 @@ func (d *Driver) setupHostOnlyNetwork(machineName string) error {
hostOnlyCIDR = defaultHostOnlyCIDR
}
ip, network, err := net.ParseCIDR(hostOnlyCIDR)
ip, network, err := parseAndValidateCIDR(hostOnlyCIDR)
if err != nil {
return err
}
nAddr := network.IP.To4()
dhcpAddr, err := getRandomIPinSubnet(network.IP)
if err != nil {
return err
}
nAddr := network.IP.To4()
lowerDHCPIP := net.IPv4(nAddr[0], nAddr[1], nAddr[2], byte(100))
upperDHCPIP := net.IPv4(nAddr[0], nAddr[1], nAddr[2], byte(254))
@ -695,6 +694,20 @@ func (d *Driver) setupHostOnlyNetwork(machineName string) error {
"--cableconnected2", "on")
}
func parseAndValidateCIDR(hostOnlyCIDR string) (net.IP, *net.IPNet, error) {
ip, network, err := net.ParseCIDR(hostOnlyCIDR)
if err != nil {
return nil, nil, err
}
networkAddress := network.IP.To4()
if ip.Equal(networkAddress) {
return nil, nil, ErrNetworkAddrCidr
}
return ip, network, nil
}
// createDiskImage makes a disk image at dest with the given size in MB. If r is
// not nil, it will be read as a raw disk image to convert from.
func createDiskImage(dest string, size int, r io.Reader) error {

View File

@ -152,6 +152,31 @@ func TestGetIPErrors(t *testing.T) {
}
}
func TestParseValidCIDR(t *testing.T) {
ip, network, err := parseAndValidateCIDR("192.168.100.1/24")
assert.Equal(t, "192.168.100.1", ip.String())
assert.Equal(t, "192.168.100.0", network.IP.String())
assert.Equal(t, "ffffff00", network.Mask.String())
assert.NoError(t, err)
}
func TestInvalidCIDR(t *testing.T) {
ip, network, err := parseAndValidateCIDR("192.168.100.1")
assert.EqualError(t, err, "invalid CIDR address: 192.168.100.1")
assert.Nil(t, ip)
assert.Nil(t, network)
}
func TestInvalidNetworkIpCIDR(t *testing.T) {
ip, network, err := parseAndValidateCIDR("192.168.100.0/24")
assert.Equal(t, ErrNetworkAddrCidr, err)
assert.Nil(t, ip)
assert.Nil(t, network)
}
func newTestDriver(name string) *Driver {
return NewDriver(name, "")
}