mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	Live: Crash for invalid live stream state when unmount HTTP. v6.0.146 (#4141)
When unpublishing, the handler callback that will stop the coroutine:
```cpp
_can_publish = true;
handler->on_unpublish(req);
```
In this handler, the `http_unmount` will be called:
```cpp
void SrsHttpStreamServer::http_unmount(SrsRequest* r)
    cache->stop();
```
In this `http_unmount` function, there could be context switching. In
such a situation, a new connection might publish the stream while the
unpublish process is freeing the stream, leading to a crash.
To prevent a new publisher, we should change the state only after all
handlers and hooks are completed.
---------
Co-authored-by: liumengte <liumengte@visionular.com>
Co-authored-by: winlin <winlinvip@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									fa3dc3bf69
								
							
						
					
					
						commit
						957140db51
					
				
					 2 changed files with 4 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -7,6 +7,7 @@ The changelog for SRS.
 | 
			
		|||
<a name="v6-changes"></a>
 | 
			
		||||
 | 
			
		||||
## SRS 6.0 Changelog
 | 
			
		||||
* v6.0, 2024-08-14, Merge [#4141](https://github.com/ossrs/srs/pull/4141): Live: Crash for invalid live stream state when unmount HTTP. v6.0.146 (#4141)
 | 
			
		||||
* v6.0, 2024-08-13, Merge [#4092](https://github.com/ossrs/srs/pull/4092): Config: Improve env config to support multi values. v6.0.146 (#4092)
 | 
			
		||||
* v6.0, 2024-07-27, Merge [#4127](https://github.com/ossrs/srs/pull/4127): Transcode: Support video codec such as h264_qsv and libx265. v6.0.145 (#4127)
 | 
			
		||||
* v6.0, 2024-07-27, Merge [#4101](https://github.com/ossrs/srs/pull/4101): GB28181: Support external SIP server. v6.0.144 (#4101)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2633,7 +2633,6 @@ void SrsLiveSource::on_unpublish()
 | 
			
		|||
 | 
			
		||||
    srs_trace("cleanup when unpublish");
 | 
			
		||||
 | 
			
		||||
    _can_publish = true;
 | 
			
		||||
    if (!_source_id.empty()) {
 | 
			
		||||
        _pre_source_id = _source_id;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -2655,6 +2654,8 @@ void SrsLiveSource::on_unpublish()
 | 
			
		|||
    if (consumers.empty()) {
 | 
			
		||||
        stream_die_at_ = srs_get_system_time();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _can_publish = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
srs_error_t SrsLiveSource::create_consumer(SrsLiveConsumer*& consumer)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue