Skip to content

Comments

dup() golang FDs in obj-C code#213

Merged
Code-Hex merged 4 commits intoCode-Hex:mainfrom
cfergeau:fddup
Feb 8, 2026
Merged

dup() golang FDs in obj-C code#213
Code-Hex merged 4 commits intoCode-Hex:mainfrom
cfergeau:fddup

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>
Copy link
Owner

@Code-Hex Code-Hex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@Code-Hex Code-Hex merged commit ccaf748 into Code-Hex:main Feb 8, 2026
10 checks passed
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?

2 participants