Opened 3 years ago

Closed 2 years ago

Last modified 2 years ago

#12010 closed bug (fixed)

Incorrect return types for recv() and send() on Windows

Reported by: enolan Owned by: enolan
Priority: normal Milestone: 8.0.2
Component: Core Libraries Version: 8.0.1
Keywords: Cc: ekmett
Operating System: Windows Architecture: x86_64 (amd64)
Type of failure: Runtime crash Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s): Phab:D2170
Wiki Page:

Description

They return signed 32 bit ints on Windows, even on a 64 bit OS, rather than Linux's 64 bit ssize_t. This means when recv() returned -1 to signal an error we thought it was 4294967295. It was converted to an int, -1 and the buffer was memcpy'd which caused a segfault. Other bad stuff happened with send()s. The problem is in blockingReadRawBufferPtr and blockingWriteRawBufferPtr in GHC.IO.FD which are only called in the threaded RTS.

See also note CSsize in System.Posix.Internals.

I have a patch and a test incoming.

Change History (9)

comment:1 Changed 3 years ago by enolan

Differential Rev(s): Phab:D2170
Status: newpatch

comment:2 Changed 3 years ago by Tamar Christina <tamar@…>

In 1ee47c1b/ghc:

Use the correct return type for Windows' send()/recv() (Fix #12010)

Summary:
They return signed 32 bit ints on Windows, even on a 64 bit OS, rather than
Linux's 64 bit ssize_t. This means when recv() returned -1 to signal an error we
thought it was 4294967295. It was converted to an int, -1 and the buffer was
memcpy'd which caused a segfault. Other bad stuff happened with send()s.

See also note CSsize in System.Posix.Internals.

Add a test for #12010

Test Plan:
- GHC testsuite (T12010)
- http-conduit test (https://github.com/snoyberg/http-client/issues/191)

Reviewers: austin, hvr, bgamari, Phyx

Reviewed By: Phyx

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2170

GHC Trac Issues: #12010

comment:3 Changed 3 years ago by Phyx-

Resolution: fixed
Status: patchclosed

Thanks for the patch @enolan!

comment:4 Changed 3 years ago by Tamar Christina <tamar@…>

In a1f3bb8/ghc:

Fix failing T12010

Summary:
T12010 seems to be failing because it can't find the correct paths.
This gives the test some more qualified paths.

Test Plan: make TEST=12010

Reviewers: hvr, bgamari, austin, thomie

Reviewed By: austin

Differential Revision: https://phabricator.haskell.org/D2252

GHC Trac Issues: #12010

comment:5 Changed 3 years ago by mpickering

This test fails for me on OSX because

Wrong exit code (expected 0 , actual 2 )
Stdout:

Stderr:
T12010.hsc:12:10: fatal error: 'HsBase.h' file not found
#include "HsBase.h"
         ^
1 error generated.

comment:6 Changed 3 years ago by Thomas Miedema <thomasmiedema@…>

In 2230c882/ghc:

Testsuite: fix T12010 for real

* Use `extra_files` instead of (the deprecated) `extra_clean` (#11980).

* Don't depend on generated files from build tree
  (libraries/base/include/HsBaseConfig.h). Running
  'make test TEST=T12010' should work, even without building GHC first
  (it will use the system installed ghc).

Test Plan: 'make test TEST=T12010' on Linux and Windows.

Reviewed by: Phyx

Differential Revision: https://phabricator.haskell.org/D2256

GHC Trac Issues: #12010

comment:7 Changed 2 years ago by bgamari

Milestone: 8.0.2
Status: closedmerge
Version: 8.0.1

comment:8 Changed 2 years ago by bgamari

Status: mergeclosed

comment:9 Changed 2 years ago by Phyx-

Can you merge 2230c8822233d6d68f930170cd51d96169649056 as well @bgamari? Otherwise the test will fail.

Note: See TracTickets for help on using tickets.