Skip to content

Commit

Permalink
Rollup merge of #89472 - nagisa:nagisa/wsa-cleanup, r=dtolnay
Browse files Browse the repository at this point in the history
Only register `WSACleanup` if `WSAStartup` is actually ever called

See #85595

Fixes #85441
  • Loading branch information
Manishearth authored Oct 4, 2021
2 parents 8c7c689 + 5b4873a commit e021a10
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
17 changes: 11 additions & 6 deletions library/std/src/sys/windows/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

use crate::cmp;
use crate::io::{self, IoSlice, IoSliceMut, Read};
use crate::lazy::SyncOnceCell;
use crate::mem;
use crate::net::{Shutdown, SocketAddr};
use crate::os::windows::io::{
AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, OwnedSocket, RawSocket,
};
use crate::ptr;
use crate::sync::Once;
use crate::sys;
use crate::sys::c;
use crate::sys_common::net;
Expand All @@ -29,26 +29,31 @@ pub mod netc {

pub struct Socket(OwnedSocket);

static INIT: Once = Once::new();
static WSA_CLEANUP: SyncOnceCell<unsafe extern "system" fn() -> i32> = SyncOnceCell::new();

/// Checks whether the Windows socket interface has been started already, and
/// if not, starts it.
pub fn init() {
INIT.call_once(|| unsafe {
let _ = WSA_CLEANUP.get_or_init(|| unsafe {
let mut data: c::WSADATA = mem::zeroed();
let ret = c::WSAStartup(
0x202, // version 2.2
&mut data,
);
assert_eq!(ret, 0);

// Only register `WSACleanup` if `WSAStartup` is actually ever called.
// Workaround to prevent linking to `WS2_32.dll` when no network functionality is used.
// See issue #85441.
c::WSACleanup
});
}

pub fn cleanup() {
if INIT.is_completed() {
// only close the socket interface if it has actually been started
// only perform cleanup if network functionality was actually initialized
if let Some(cleanup) = WSA_CLEANUP.get() {
unsafe {
c::WSACleanup();
cleanup();
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions src/test/run-make/issue-85441/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# only-windows-msvc

-include ../../run-make-fulldeps/tools.mk

# Tests that WS2_32.dll is not unnecessarily linked, see issue #85441

all:
$(RUSTC) empty.rs
objdump -p $(TMPDIR)/empty.exe | $(CGREP) -v -i "WS2_32.dll"
1 change: 1 addition & 0 deletions src/test/run-make/issue-85441/empty.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fn main() {}

0 comments on commit e021a10

Please sign in to comment.