mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	client_invalid-section-data_and_pipe-overflow.patch by Petri Hintukainen
- Reset section data unpacker only after first non-full TS packet (last TS packet of section is typically not full - Do not close filter if socket buffer is full (EAGAIN, EWOULDBLOCK) (closing results in 100% CPU usage in VDR section handler)
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  *  $Id: filter.c,v 1.7 2007/04/23 11:33:26 schmirl Exp $ | ||||
|  *  $Id: filter.c,v 1.8 2007/04/23 12:00:27 schmirl Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "client/filter.h" | ||||
| @@ -79,19 +79,35 @@ bool cStreamdevFilter::PutSection(const uchar *Data, int Length) { | ||||
| 	if (m_Used + Length >= (int)sizeof(m_Buffer)) { | ||||
| 		esyslog("ERROR: Streamdev: Section handler buffer overflow (%d bytes lost)", | ||||
| 				Length); | ||||
| 		m_Used = 0; | ||||
| 		Reset(); | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	memcpy(m_Buffer + m_Used, Data, Length); | ||||
| 	m_Used += Length; | ||||
|  | ||||
| 	if (m_Used > 3) { | ||||
| 		int length = (((m_Buffer[1] & 0x0F) << 8) | m_Buffer[2]) + 3; | ||||
| 		if (m_Used == length) { | ||||
| 			if (write(m_Pipe[1], m_Buffer, length) < 0) | ||||
| 				return false; | ||||
| 			m_Used = 0; | ||||
| 			if (write(m_Pipe[1], m_Buffer, length) < 0) { | ||||
| 				if(errno == EAGAIN || errno == EWOULDBLOCK)  | ||||
| 					dsyslog("cStreamdevFilter::PutSection socket overflow, " | ||||
| 						"Pid %4d Tid %3d", m_Pid, m_Tid); | ||||
|  | ||||
| 				else | ||||
| 					return false; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (m_Used > length) { | ||||
| 			dsyslog("cStreamdevFilter::PutSection: m_Used > length !  Pid %2d, Tid%2d " | ||||
| 				"(len %3d, got %d/%d)", m_Pid, m_Tid, Length, m_Used, length); | ||||
| 			if(Length < TS_SIZE-5) { | ||||
| 				// TS packet not full -> this must be last TS packet of section data -> safe to reset now | ||||
| 				Reset(); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user