Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem with recent change to the calling sequence for the function 'ws_socket() #86

Open
grm1209 opened this issue Dec 12, 2023 · 4 comments
Labels

Comments

@grm1209
Copy link

grm1209 commented Dec 12, 2023

The recent change to the calling sequence for the function 'ws_socket(struct ws_server *ws_srv)' causes problems if the 'ws_server' structure is in the stack of the calling function and the function exits after calling a non-blocking 'ws_socket()'.

Previously, the callers 'ws_events' structure was copied the wsServer's 'ws_server' structure. Now, the caller's pointer to it's 'ws_server' structure is placed in the wsServer's 'ws_accept_params' structure.

When the calling function exits, it's 'ws_server' structure becomes undefined. The solution for the caller is to allocate the 'ws_server' structure in local space.

A note of this should be included in the documentation. And maybe the examples like 'echo' should do this instead of using stack allocation.

My environment:

  • wsServer version (commit hash)
  • OS version: Debian GNU/Linux 12 (bookworm)
    • If Linux:
      • kernel version: 6.1.0-15-amd64
      • Libc used: Debian GLIBC 2.36-9+deb12u3
  • Architecture: x86-64...
@grm1209 grm1209 added the possible-bug A bug not confirmed yet label Dec 12, 2023
@Theldus Theldus added bug and removed possible-bug A bug not confirmed yet labels Dec 14, 2023
@Theldus
Copy link
Owner

Theldus commented Dec 14, 2023

Hi @grm1209,
Yes, you are correct that the structure pointer is passed to 'ws_accept_params' but the 'ws_server' structure is indeed copied into memory as soon as the thread handling the connection is created.

What must be happening in your case is that the function returns even before this thread is created, and thus the structure is no longer valid. This is a bug and needs to be fixed.

I will address it as soon as possible. Thank you for bringing it to my attention.

Theldus added a commit that referenced this issue Dec 14, 2023
In PR #82, the signature of the ws_socket() function was modified to receive a
'ws_server' structure as a parameter. However, the content of this structure
was only copied later when the thread for performing accepts() was created.
This could lead to a situation where, if the 'ws_server' structure was
allocated on the stack, a potential function return (prior to thread execution)
would render the address invalid, effectively creating a race condition between
thread creation and function return.

The fix is straightforward: simply have the 'ws_accept_params' structure store
the 'ws_server' structure itself instead of a pointer to it.

This should address issue #86.
@Theldus
Copy link
Owner

Theldus commented Dec 14, 2023

@grm1209 could you confirm if commit 24e6fae fixes your problem?

@Vaibhav-singh78
Copy link

library has problem with socket accepting connection , can you help i am stuck here for two days

@Theldus
Copy link
Owner

Theldus commented Mar 18, 2024

Hi @Vaibhav-singh78,
Is your issue related to this one? if not, it would be much better to create a new issue...

Anyway, could you provide more details? your operating system? code used etc? An 'MRE' (Minimal, Reproducible Example) would be very useful to better understand your problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants