Add timeout to hid keyboard write operation

Co-authored-by: adam <adam@buildjet.com>
This commit is contained in:
Cursor Agent 2025-09-13 00:15:51 +00:00
parent 20783e6118
commit d7e5369990
1 changed files with 30 additions and 8 deletions

View File

@ -256,15 +256,37 @@ func (u *UsbGadget) keyboardWriteHidFile(modifier byte, keys []byte) error {
return err
}
_, err := u.writeWithTimeout(u.keyboardHidFile, append([]byte{modifier, 0x00}, keys[:hidKeyBufferSize]...))
if err != nil {
u.logWithSuppression("keyboardWriteHidFile", 100, u.log, err, "failed to write to hidg0")
u.keyboardHidFile.Close()
u.keyboardHidFile = nil
return err
data := append([]byte{modifier, 0x00}, keys[:hidKeyBufferSize]...)
file := u.keyboardHidFile
done := make(chan error, 1)
go func(f *os.File, payload []byte) {
_, err := f.Write(payload)
done <- err
}(file, data)
t := time.NewTimer(hidWriteTimeout)
defer t.Stop()
select {
case err := <-done:
if err != nil {
u.logWithSuppression("keyboardWriteHidFile", 100, u.log, err, "failed to write to hidg0")
_ = file.Close()
if u.keyboardHidFile == file {
u.keyboardHidFile = nil
}
return err
}
u.resetLogSuppressionCounter("keyboardWriteHidFile")
return nil
case <-t.C:
u.logWithSuppression("keyboardWriteHidFileTimeout", 100, u.log, fmt.Errorf("deadline exceeded"), "write timed out: %s", file.Name())
_ = file.Close()
if u.keyboardHidFile == file {
u.keyboardHidFile = nil
}
return fmt.Errorf("keyboard write timeout")
}
u.resetLogSuppressionCounter("keyboardWriteHidFile")
return nil
}
func (u *UsbGadget) UpdateKeysDown(modifier byte, keys []byte) KeysDownState {