diff --git a/subsys/net/lib/sockets/sockets.c b/subsys/net/lib/sockets/sockets.c index 3a0705266d5..8a9b8ce8dfb 100644 --- a/subsys/net/lib/sockets/sockets.c +++ b/subsys/net/lib/sockets/sockets.c @@ -525,10 +525,22 @@ int zsock_connect_ctx(struct net_context *ctx, const struct sockaddr *addr, cb = zsock_connected_cb; } - SET_ERRNO(net_context_recv(ctx, zsock_received_cb, K_NO_WAIT, - ctx->user_data)); - SET_ERRNO(net_context_connect(ctx, addr, addrlen, cb, timeout, - ctx->user_data)); + if (net_context_get_type(ctx) == SOCK_STREAM) { + /* For STREAM sockets net_context_recv() only installs + * recv callback w/o side effects, and it has to be done + * first to avoid race condition, when TCP stream data + * arrives right after connect. + */ + SET_ERRNO(net_context_recv(ctx, zsock_received_cb, + K_NO_WAIT, ctx->user_data)); + SET_ERRNO(net_context_connect(ctx, addr, addrlen, cb, + timeout, ctx->user_data)); + } else { + SET_ERRNO(net_context_connect(ctx, addr, addrlen, cb, + timeout, ctx->user_data)); + SET_ERRNO(net_context_recv(ctx, zsock_received_cb, + K_NO_WAIT, ctx->user_data)); + } } return 0;