eclipse-iceoryx / eclipse-iceoryx/iceoryx

'NamedPipe' should be more robust

Open
#2,201 0 comments 0 reactions 0 assignees View on GitHub
bug good first issue refactoring
Dominant language
C++
Stars
2.2k
Forks
492
Avg merge
18h 57m
Merged PRs (30d)
1

Description

## Brief description

When the server side of a `NamedPipe` destructs it's endpoint, it can lead to a termination of the process using the client side.

It should behave more like a `UnixDomainSocket` where the server side can close a socket but the client side can still try to access it. In the worst case this will lead to a runtime error which can be handled gracefully.

## Detailed information

On destruction, the server side `NamedPipe` destroys the `NamedPipeData` which will lead to the client side user of the `NamedPipe` accessing an invalid object. Instead of destruction the `NamedPipeData`unconditionally, it could be marked for destruction. This could be done with an atomic (compare) exchange on a state variable, e.g.

```cpp
enum class State {
READY,
IN_USE,
DESTRUCTION,
};
```

On construction the state variable will be set to `READY`.

When a client opens the `NamedPipe`, the state will be set to `IN_USE` by a compare and swap operation with `READY` being the expected state.

On destruction two scenarios need to be taken care of
1. The server side destroys the `NamedPipe`
- a simple atomic exchange is sufficient
- the server sets the state to `DESTRUCTION`
- if the old value is `READY`, it can be destructed
- if the old value is `IN_USE`, the client need to destroy the `NamedPipe`
2. The client side destroys the `NamedPipe`
- since it is not the owner, it needs to do a compare and swap operation with `READY` as new state
- the expected state is `IN_USE`
- if the CAS failed and the actual state is `DESTRUCTION`, the client needs to destroy the `NamedPipeData`

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.