Xephyr-Xv: fix a crash when host X support several ports
* hw/kdrive/ephyr/ephyrvideo.c: (ephyrXVPrivQueryHostAdaptors): properly set port private luke. This fixes a crash when the host Xv supports multiple ports. Make sure number of ports cannot be zero.
This commit is contained in:
		
							parent
							
								
									a38ad562a6
								
							
						
					
					
						commit
						47e6dff89e
					
				| 
						 | 
				
			
			@ -404,7 +404,8 @@ ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
 | 
			
		|||
    EphyrHostAttribute *attributes=NULL ;
 | 
			
		||||
    EphyrHostImageFormat *image_formats=NULL ;
 | 
			
		||||
    int num_video_formats=0, base_port_id=0,
 | 
			
		||||
        num_attributes=0, num_formats=0, i=0;
 | 
			
		||||
        num_attributes=0, num_formats=0, i=0,
 | 
			
		||||
        port_priv_offset=0;
 | 
			
		||||
    unsigned num_encodings=0 ;
 | 
			
		||||
    Bool is_ok = FALSE ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -441,6 +442,12 @@ ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
 | 
			
		|||
                   ephyrHostXVAdaptorArrayAt (a_this->host_adaptors, i) ;
 | 
			
		||||
        if (!cur_host_adaptor)
 | 
			
		||||
            continue ;
 | 
			
		||||
        a_this->adaptors[i].nPorts =
 | 
			
		||||
                            ephyrHostXVAdaptorGetNbPorts (cur_host_adaptor) ;
 | 
			
		||||
        if (a_this->adaptors[i].nPorts <=0) {
 | 
			
		||||
            EPHYR_LOG_ERROR ("Could not find any port of adaptor %d\n", i) ;
 | 
			
		||||
            continue ;
 | 
			
		||||
        }
 | 
			
		||||
        a_this->adaptors[i].type =
 | 
			
		||||
                        ephyrHostXVAdaptorGetType (cur_host_adaptor) ;
 | 
			
		||||
        a_this->adaptors[i].type |= XvWindowMask ;
 | 
			
		||||
| 
						 | 
				
			
			@ -475,16 +482,18 @@ ephyrXVPrivQueryHostAdaptors (EphyrXVPriv *a_this)
 | 
			
		|||
                                               &num_video_formats);
 | 
			
		||||
        a_this->adaptors[i].pFormats = (KdVideoFormatPtr) video_formats ;
 | 
			
		||||
        a_this->adaptors[i].nFormats = num_video_formats ;
 | 
			
		||||
        /* got a_this->adaptors[i].nPorts already
 | 
			
		||||
        a_this->adaptors[i].nPorts =
 | 
			
		||||
                            ephyrHostXVAdaptorGetNbPorts (cur_host_adaptor) ;
 | 
			
		||||
        */
 | 
			
		||||
        a_this->adaptors[i].pPortPrivates =
 | 
			
		||||
                xcalloc (a_this->adaptors[i].nPorts,
 | 
			
		||||
                         sizeof (DevUnion) + sizeof (EphyrPortPriv)) ;
 | 
			
		||||
        port_priv_offset = a_this->adaptors[i].nPorts;
 | 
			
		||||
        for (j=0; j < a_this->adaptors[i].nPorts; j++) {
 | 
			
		||||
            int port_priv_offset = a_this->adaptors[i].nPorts ;
 | 
			
		||||
            EphyrPortPriv *port_priv =
 | 
			
		||||
                (EphyrPortPriv*)
 | 
			
		||||
                    &a_this->adaptors[i].pPortPrivates[port_priv_offset + j];
 | 
			
		||||
            EphyrPortPriv *port_privs_base =
 | 
			
		||||
                    (EphyrPortPriv*)&a_this->adaptors[i].pPortPrivates[port_priv_offset];
 | 
			
		||||
            EphyrPortPriv *port_priv = &port_privs_base[j] ;
 | 
			
		||||
            port_priv->port_number = base_port_id + j;
 | 
			
		||||
            port_priv->current_adaptor = &a_this->adaptors[i] ;
 | 
			
		||||
            port_priv->xv_priv = a_this ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue