Skip to content

Conversation

@cfergeau
Copy link
Contributor

This PR addresses the issue described in #201.
The Code-Hex/vz APIs using an *os.File argument have a non-obvious limitation: the *os.File argument must be kept alive as long as the Code-Hex/vz object which uses them. If it was garbage collected, then this would cause errors.

This PR fixes this by ensuring the file descriptor is owned by Code-Hex/vz. This approach is backwards compatible with code that kept the *os.File alive.

Which issue(s) this PR fixes:

Fixes #201

Additional documentation

At the moment, when using Code-Hex/vz like this:
```
f, err := os.OpenFile(devPath, open_flags, 0)
if err != nil {
	return nil, fmt.Errorf("error opening file: %v", err)
}

attachment, err := vz.NewDiskBlockDeviceStorageDeviceAttachment(f, conf.ReadOnly, vz.DiskSynchronizationModeFull)
if err != nil {
	_ = f.Close()
	return nil, fmt.Errorf("error creating disk attachment: %v", err)
}
```

the developer has to know that `f` must be kept alive at least as long as the disk attachment is in use. If not, `f` will be garbage collected, its file descriptor will be closed, and the attachment becomes invalid. In this situation, the virtualization framework would return an error.

This commit simply adds a test case exhibiting this problem. This will
be improved in the next commits.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
…iptor

In order to solve Code-Hex#201, this
commit adds a `newFileHandleDupFd()` objective-C helper.

This helper calls `dup()` on its file descriptor argument, and wraps it in
a `NSFileHandle` with `closeOnDealloc:true`. This new file handle is
fully independent from its golang counterpart, if the golang `os.File`
holding the file descriptor is closed, the `NSFileHandle` will still be
valid.

This new helper is then used with vz.NewDiskBlockDeviceStorageDeviceAttachment.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
…ment

NewFileHandleNetworkDeviceAttachment has similar limitations as
NewDiskBlockDeviceStorageDeviceAttachment.
This commit fixes this by using newFileHandleDupFd to implement it.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
NewFileHandleSerialPortAttachment has similar limitations as
NewDiskBlockDeviceStorageDeviceAttachment.
This commit fixes this by using newFileHandleDupFd to implement it.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Use syscall.Dup or such in NewDiskBlockDeviceStorageDeviceAttachment?

1 participant