firebase / firebase/firebase-cpp-sdk
[Bug] Going offline/online after authenticating causes crash
- 主要语言
- C++
- 星标
- 326
- 派生
- 137
- 平均合并
- 3 天 9 小时
- 30 天内合并 PR
- 5
描述
### [REQUIRED] Please fill in the following fields:
* Pre-built SDK from the [website](https://firebase.google.com/download/cpp) or open-source from this repo: open source
* Firebase C++ SDK version: 8.1.0
* Problematic Firebase Component: database
* Other Firebase Components in use: auth
* Platform you are using the C++ SDK on: mac, linux
* Platform you are targeting: desktop
### [REQUIRED] Please describe the issue here:
An assert failure occurs if going offline/online too quickly after being authenticated. Persistent connections do not cancel their "fetch token" async work, and if two run at the same time, the app may crash.
> ASSERT: [...]/firebase-cpp-sdk/database/src/desktop/connection/persistent_connection.cc(578): connection_state_ == kDisconnected
This is problematic for my actual app, as I want to be able to reconnect as soon as the network becomes reachable. If the network becomes unreachable/reachable in rapid succession (very common), it will crash because of this race, which is 100% reproducible.
I noticed that in the ObjC SDK, a guard was added to make sure the "fetch token" routine was still valid when handling its result by using a simple counter. I'd imagine this would have a similarly simple fix.
#### Steps to reproduce:
Have you been able to reproduce this issue with just the [Firebase C++ quickstarts](https://github.com/firebase/quickstart-cpp) ? yes
What's the issue repro rate? 100%
#### Relevant Code:
Add the following to `desktop/testapp/src/common_main.cc` after authenticating (in quickstart-cpp):
```cpp
database->GoOffline();
database->GoOnline();
```
If some time has elapsed after authenticating (e.g., the database is connected), you can still reproduce it if you call GoOffline() / GoOnline() more than once.
```cpp
database->GoOffline();
database->GoOnline();
database->GoOffline();
database->GoOnline();
```
Here's a forked version of quickstart-cpp with the modifications in-place: https://github.com/mikepulaski/quickstart-cpp/tree/auth-token-race
贡献指南
调研方向
在 quickstart-cpp 示例中使用 desktop/testapp/src/common_main.cc 重现崩溃,然后检查 database/src/desktop/connection/persistent_connection.cc 中报告的 assertion 附近的代码。将反复调用 GoOffline()/GoOnline() 时的行为与所描述的 fetch-token 竞态进行比较。在身份验证后快速进行离线/在线切换不再触发 assertion 或崩溃,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- cpp
- 领域
- authentication, databases
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 35/100