mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	raop: fix sequence number overflow
Wrap sequence number when we reach uint16_t's max 0xFFFF.
This commit is contained in:
		
							parent
							
								
									81fa11e3a9
								
							
						
					
					
						commit
						b95aebdb2d
					
				
					 3 changed files with 29 additions and 3 deletions
				
			
		| 
						 | 
					@ -316,7 +316,12 @@ static size_t build_tcp_audio_packet(pa_raop_client *c, pa_memchunk *block, pa_m
 | 
				
			||||||
    buffer += packet->index / sizeof(uint32_t);
 | 
					    buffer += packet->index / sizeof(uint32_t);
 | 
				
			||||||
    raw += block->index;
 | 
					    raw += block->index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (c->seq == 0xFFFF) {
 | 
				
			||||||
 | 
					        pa_log_debug("wrapping sequence number");
 | 
				
			||||||
 | 
					        c->seq = pa_raop_packet_buffer_wrap_seq(c->pbuf, c->seq);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
        c->seq++;
 | 
					        c->seq++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memcpy(buffer, tcp_audio_header, sizeof(tcp_audio_header));
 | 
					    memcpy(buffer, tcp_audio_header, sizeof(tcp_audio_header));
 | 
				
			||||||
    buffer[1] |= htonl((uint32_t) c->seq);
 | 
					    buffer[1] |= htonl((uint32_t) c->seq);
 | 
				
			||||||
    buffer[2] = htonl(c->rtptime);
 | 
					    buffer[2] = htonl(c->rtptime);
 | 
				
			||||||
| 
						 | 
					@ -421,6 +426,11 @@ static size_t build_udp_audio_packet(pa_raop_client *c, pa_memchunk *block, pa_m
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    c->rtptime += length / 4;
 | 
					    c->rtptime += length / 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (c->seq == 0xFFFF) {
 | 
				
			||||||
 | 
					        pa_log_debug("wrapping sequence number");
 | 
				
			||||||
 | 
					        c->seq = pa_raop_packet_buffer_wrap_seq(c->pbuf, c->seq);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
        c->seq++;
 | 
					        c->seq++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_memblock_release(block->memblock);
 | 
					    pa_memblock_release(block->memblock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,13 +88,28 @@ void pa_raop_packet_buffer_reset(pa_raop_packet_buffer *pb, uint16_t seq) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint16_t pa_raop_packet_buffer_wrap_seq(pa_raop_packet_buffer *pb, uint16_t seq) {
 | 
				
			||||||
 | 
					    int seq_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_assert(pb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (seq > pb->seq)
 | 
				
			||||||
 | 
					        seq_shift = pb->seq - 1;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        seq_shift = seq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pb->seq -= seq_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return seq - seq_shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size) {
 | 
					pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size) {
 | 
				
			||||||
    pa_memchunk *packet = NULL;
 | 
					    pa_memchunk *packet = NULL;
 | 
				
			||||||
    size_t delta, i;
 | 
					    size_t delta, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_assert(pb);
 | 
					    pa_assert(pb);
 | 
				
			||||||
    pa_assert(pb->packets);
 | 
					    pa_assert(pb->packets);
 | 
				
			||||||
    pa_assert(seq > 0);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (seq == pb->seq)
 | 
					    if (seq == pb->seq)
 | 
				
			||||||
        packet = &pb->packets[pb->pos];
 | 
					        packet = &pb->packets[pb->pos];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,4 +35,5 @@ void pa_raop_packet_buffer_free(pa_raop_packet_buffer *pb);
 | 
				
			||||||
void pa_raop_packet_buffer_reset(pa_raop_packet_buffer *pb, uint16_t seq);
 | 
					void pa_raop_packet_buffer_reset(pa_raop_packet_buffer *pb, uint16_t seq);
 | 
				
			||||||
pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size);
 | 
					pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint16_t pa_raop_packet_buffer_wrap_seq(pa_raop_packet_buffer *pb, uint16_t seq);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue