Commit Graph
28 Commits
Author SHA1 Message Date
Hamza El-Saawy 9f0d5dc7d2 Switch from sycall to windows (#295)
Where ever possible, use `golang.org/x/sys/windows` instead of `syscall`
(which has been deprecated since go1.11).

Using `windows.LocalFree` requires using `unsafe.Pointer`, which ensures
that the Go garbage collector does not try to free memory pre-maturely
if it was previously declared as a pointer.

Since `syscall.Handle` is part of API for `vhd` package, it was left
unchanged.

For security descriptor functions, switch to using
`windows.SECURITY_DESCRIPTOR` to avoid unnecessary byte manipulation and
panics due to missing input validation and error checking.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
2023-08-07 14:06:05 -04:00
Hamza El-Saawy 19a9f656e1 Update tests; run fuzzing (#294)
Run fuzzing tests in CI.

Use race detector when running tests.

Add missing `t.Helper()` calls.

Update test helpers in `pkg/bindfilter` to use `RtlGetNtVersionNumbers`
instead of reading registry, and skip tests if not running as admin.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
2023-07-21 18:06:41 -04:00
Hamza El-Saawy e268c11e27 Add lint and go generate steps to CI (#254)
* Add lint and go generate stages to CI

Add CI step to verify `go generate` was run on repo.
Add linter stage to CI along with linter config file,
`.golangci.yml`.
Will likely prefer revive over static-check.

Updated README Contributing section on linting requirements.

Added sequence ordering to make sure lint and go generate stages run
before tests and build.
This way, build and tests are not run on code that could potentially:

    1. not build due to `gofmt` issues;
    2. contain bugs;
    3. have to be re-submitted after issues are fixed; or
    4. contain outdated Win32 syscall or other auto-generated files.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>

* Fixed linter issues

Code changes to satisfy linters:

 - Ran `gofmt -s -w` on repo.
 - Broke up long lines.
 - When possible, changed names with incorrect initialism formatting
   - Added exceptions for exported variables.
 - Added exceptions for ALL_CAPS_WITH_UNDERSCORES code.
   - Switched to using `windows` or `syscall` definitions if possible;
     especially if some constants were unused.
 - Added `_ =` to satisfy error linter, and acknowledge that errors are
   being ignored.
 - Switched to using `errors.Is` and `As` in places, elsewhere added
   exceptions if error value was known to be `syscall.Errno`.
 - Removed bare returns.
 - Prevented variables from being overshadowed in certain places
   (ignoring cases of overshadowing `err`).
 - Renamed variables and functions (eg, `len`, `eventMetadata.bytes`) to
   prevent shadowing pre-built functions and imported pacakges.
 - Removed unused method receivers.
 - Added exceptions to certain unused (unexported) constants and
   functions.
   - Deleted unused `once` from `pkg/etw.providerMap`.
 - Renamed `noop.go` files to `main_other.go` or `doc.go`, to better fit
   style recommendations.
 - Added exceptions for non-secure use of SHA1 and weak crypto
   libraries.
 - Replaced `ioutil` with `io` and `os` (and `t.TempDir` in tests).
 - Added fully exhaustive checks for `switch` statements in `pkg/etw`.
 - Defined constant strings for `tools/mkwinsyscall`.
 - Removed unnecessary conversions.
 - Made sure `context.Cancel` was called.

Additionally, added `//go:build windows" constraints on files with
unexported code, since linter will complain about unused code on
non-Windows platforms.

Added a stub `main() {}` for `mkwinsyscall` for non-Windows builds, just in
case `//go:generate` directives are added to OS-agnostic files.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>

* PR: spelling, constants, fuzzing

Moved HVSocket fuzzing tests to separate file with go 1.18 build
constraint.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
2022-08-23 15:05:05 -04:00
Hamza El-Saawy d68e55cd0b Added HV Socket known IDs, Dial, bug fixes (#239)
* Added HV Socket known IDs, Dial, bug fixes

Added:
* Well-know Hyper-V VMIDs for parents, children, and loopback.
* VSock interop service GUID.
* `Dial()` and `DialContext()` to dial a specific Hyper-V socket at a
  known address (along with a corresponding `HvsockDialer` struct.

Bug fixes:
* Dial (and Listen) now properly initialize and set properties of their
  sockets after ConnectEx (and AcceptEx).
* The `socketError` used by `bind` was incorrect, it should be `int32(-1)`,
  not `uintptr(^0)`
* Return errors for `(*HvsockConn) SetDeadline`

Created a `sockets` package, currently only with syscalls to `Bind`,
`ConnectEx` and `GetSockName`, bypassing `syscall/windows` restrictions
on the types that can do so.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>

* PR: error handling bug, rebase, unexport, naming

* comments and todos statements
* spelling
* removed dead code
* changed names to be more conventional
* unexported socket code
* made `(*HvsockDialer) Dial` take `Context`, removed `DialContext`
* added default `Dial` function
* rebased onto main
* cleaned up `Dial(` retry loop

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>

* PR: RawSockaddr validation, `.As(` style

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
2022-07-21 19:33:50 -04:00
Hamza El-Saawy c62166d832 Merge pull request #223 from jcchavezs/patch-1
chore: removes unneeded receiver in timeoutError
2022-07-14 09:49:26 -04:00
José Carlos Chávez 4f8488cc54 chore: removes unneeded receiver in timeoutError
Signed-off-by: José Carlos Chávez <jcchavezs@gmail.com>
2022-07-14 10:23:56 +02:00
Hamza El-Saawy 0aa6c0a16b HvsockConn shutdown, and .IsClosed() function
Corrected `HvsockConn` `CloseRead`/`Write` to check if the socket
has been closed before attempting to shutdown the socket for
reading or writing.
Additionally, `shutdown` was not respecting whether to shutdown reading
or writing, and only shutting down the socket for reading.

Added `IsClosed` function to `win32File` (and therefore `win32Pipe` and
`win32MessageBytePipe`) and `HvsockConn` to check if the socket/pipe
has been closed already.

Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
2022-02-17 11:54:17 -05:00
Kevin Parsons f208b3299c Fix interface-wrapped nil returned by MakeOpenFile
Signed-off-by: Kevin Parsons <kevpar@microsoft.com>
2019-05-31 17:09:52 -07:00
John Starks 12afdbf8b8 Merge pull request #86 from azdagron/file-handle-access
provide access to underlying file handle
2019-05-16 09:56:58 -07:00
John Starks 7776571819 winio: Add AF_HYPERV listener 2019-04-21 15:35:05 -07:00
Andrew Harding 43ad592ec1 provide access to underlying file handle 2018-07-18 18:31:12 -06:00
Darren Stahl 6f4ae360a5 Remove workaround to perf issues in go1.6
Starting in go1.9, Golang lowers the timer frequency when not required
reducing CPU usage. This workaround prevents Golang from doing so,
and since the initial issue was fixed, I see no perf regressions.
This does not need to be conditional based on Golang verison, as the issue
being worked around was only in go1.6.

Signed-off-by: Darren Stahl <darst@microsoft.com>
2018-01-09 14:51:38 -08:00
Darren Stahl 3d52dc4a97 Test bug: Fix server connections not closing in TestEchoWithMessaging
Signed-off-by: Darren Stahl <darst@microsoft.com>
2017-08-04 10:24:26 -07:00
Darren Stahl c57b87d6d4 Prevent adding to a sync.WaitGroup that has a waiter
Signed-off-by: Darren Stahl <darst@microsoft.com>
2017-08-03 15:26:45 -07:00
Tim Ebringer 73020a3110 Bool is not atomic
The Go race detector doesn't like concurrent access to bool. This change
moves the bool to use atomicBool, and extends atomicBool with the swap()
method, to handle conditional use.
2017-07-24 21:04:39 -04:00
Kenfe-Mickael Laventure 1ba55a6b1b Don't increment the wait count if the file is closing
This prevent a deadlock if `prepareIo()` is called on a closing file as
`Done()` would never been called afterwards.

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
2017-07-19 18:15:28 +02:00
Darren Stahl a64f284add Move f.wg.Done() to Read and Write to avoid leaking handles
Signed-off-by: Darren Stahl <darst@microsoft.com>
2017-05-19 15:42:58 -07:00
Darren Stahl 899dbf3ba5 Apply read and write deadlines to pending IO
In order to upgrade to go1.8 all IO operations
including previous pending IO must have the deadline
set when SetReadDeadline or SetWriteDeadline is called

Signed-off-by: Darren Stahl <darst@microsoft.com>
2017-05-05 14:53:42 -07:00
Darren Stahl e9792bc98c Added runtime.KeepAlive for the new stricter 1.8 GC
Signed-off-by: Darren Stahl <darst@microsoft.com>
2017-05-03 12:47:12 -07:00
Simon Ferquel 7c7d6b461c Flush file buffers on CloseWrite
This forces any pending data to be sent to the remote party before
emitting the 0-length EOF message, to make sure it appears as a seperate
message.

This fixes the "TestEchoWithMessaging" test

Signed-off-by: Simon Ferquel <simon.ferquel@docker.com>
2017-03-17 16:57:20 +01:00
Cezar Sa Espinola 94c0518b08 Include build tags to allow go get on non-Windows platforms. Fixes #30 2016-10-06 18:00:50 -03:00
Darren Stahl 4191cdca28 Fixed error in #12
Signed-off-by: Darren Stahl <darst@microsoft.com>
2016-03-15 15:51:39 -07:00
Darren Stahl 3e4c0f5aa3 Fixes performance regression in GO 1.6
Signed-off-by: Darren Stahl <darst@microsoft.com>
2016-03-15 15:25:25 -07:00
John Starks fe517a5118 Misc. cleanup
Signed-off-by: John Starks <jostarks@microsoft.com>
2016-01-31 14:18:04 -08:00
John Starks 99eef7be8d Ensure DialPipe times eventually by default
Signed-off-by: John Starks <jostarks@microsoft.com>
2016-01-31 14:00:21 -08:00
John Starks 3191792462 Fix errors to better match net package
Signed-off-by: John Starks <jostarks@microsoft.com>
2016-01-31 13:47:08 -08:00
John Starks b0d265e6c2 Ensure win32PipeListener.Close() correctly aborts Listen() calls
Signed-off-by: John Starks <jostarks@microsoft.com>
2016-01-31 13:46:55 -08:00
John Starks f001f808a9 Add file and pipe Windows wrappers
This includes Reader, Writer, and Closer interfaces on top of
Windows file handles in a way that does not block the system thread
while the IO is outstanding.

This also includes net.Listener and net.Conn for named pipes.
2016-01-30 18:11:47 -08:00