Skip to content

Commit c21d242

Browse files
committed
feat: error out on qcow2 block devices
- Error out when qcow2 image is detected in block device validation
1 parent 97c5364 commit c21d242

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

cmd/vfkit/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ func newVMConfiguration(opts *cmdline.Options) (*config.VirtualMachine, error) {
104104
return nil, err
105105
}
106106

107+
if err := vmConfig.ValidBlkDevices(); err != nil {
108+
return nil, err
109+
}
110+
107111
if err := vmConfig.AddIgnitionFileFromCmdLine(opts.IgnitionPath); err != nil {
108112
return nil, fmt.Errorf("failed to add ignition file: %w", err)
109113
}

pkg/config/config.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,32 @@ func (vm *VirtualMachine) AddIgnitionFileFromCmdLine(cmdlineOpts string) error {
250250
return nil
251251
}
252252

253+
func (vm *VirtualMachine) ValidBlkDevices() error {
254+
for _, device := range vm.Devices {
255+
switch device.(type) {
256+
case *VirtioBlk:
257+
dev := device.(*VirtioBlk)
258+
imgPath := dev.ImagePath
259+
if imgPath != "" {
260+
file, err := os.Open(imgPath)
261+
if err != nil {
262+
return fmt.Errorf("failed to open file %s: %v", imgPath, err)
263+
}
264+
defer file.Close()
265+
header := make([]byte, 4)
266+
_, err = file.Read(header)
267+
if err != nil {
268+
return fmt.Errorf("failed to read the header of file %s: %v", imgPath, err)
269+
}
270+
if string(header) == "QFI\xfb" {
271+
return fmt.Errorf("vfkit does not support qcow2 block devices")
272+
}
273+
}
274+
}
275+
}
276+
return nil
277+
}
278+
253279
func TimeSyncNew(vsockPort uint) (VMComponent, error) {
254280

255281
if vsockPort > math.MaxUint32 {

pkg/config/config_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"os"
45
"testing"
56

67
"github.com/stretchr/testify/assert"
@@ -44,3 +45,28 @@ func TestNetworkBlockDevice_NoDevice(t *testing.T) {
4445
nbdItem := vm.NetworkBlockDevice("nbd2")
4546
require.Nil(t, nbdItem)
4647
}
48+
49+
func TestVirtualMachine_ValidBlkDevices(t *testing.T) {
50+
vm := &VirtualMachine{}
51+
52+
file, err := os.CreateTemp("", "test-*.img")
53+
require.NoError(t, err)
54+
defer os.Remove(file.Name())
55+
56+
// write qcow2 magic number
57+
_, err = file.Write([]byte("QFI\xfb"))
58+
require.NoError(t, err)
59+
60+
dev, err := VirtioBlkNew(file.Name())
61+
require.NoError(t, err)
62+
vm.Devices = append(vm.Devices, dev)
63+
64+
require.Error(t, vm.ValidBlkDevices())
65+
66+
// overwrite with non-qcow header
67+
file.Seek(0, 0)
68+
_, err = file.Write([]byte("NotQcow2"))
69+
require.NoError(t, err)
70+
71+
require.NoError(t, vm.ValidBlkDevices())
72+
}

0 commit comments

Comments
 (0)