Thanks Dok....

On Thu, 2006-06-29 at 18:25 +0200, Denis Oliver Kropp wrote:
> kandagatla.Srinivas wrote:
> > Hi All,
> > 
> > There is a major Bug in  DirectFB-0.9.25.1which will crash DFB.
> 

> Thanks for spotting this.
> 
> > Look at the below code..from(system/fbdev/fbdev.c)
> >        
> >  shared->cmap_memory = SHMALLOC( pool_data, 256 * 2 * 12 );
> >      shared->orig_cmap.start  = 0;
> >      shared->orig_cmap.len    = 256;
> >      shared->orig_cmap.red    = shared->cmap_memory + 256 * 2 * 0;
> >      shared->orig_cmap.green  = shared->cmap_memory + 256 * 2 * 1;
> >      shared->orig_cmap.blue   = shared->cmap_memory + 256 * 2 * 2;
> >      shared->orig_cmap.transp = shared->cmap_memory + 256 * 2 * 3;
> > 
> >      if (ioctl( dfb_fbdev->fd, FBIOGETCMAP, &shared->orig_cmap ) < 0) {
> >           D_PERROR( "DirectFB/FBDev: "
> >                     "Could not retrieve palette for backup!\n" );
> >           SHFREE( pool_data, shared->cmap_memory );
> 
> The easiest fix would be to simply not free the memory here,
> but saving 2k is a good idea :)
> 
I think we should go by saving of 2k Mem. and making the pointer to
NULL.

> > The below patch fixes the above discussed problem.
> > Mail me if you want more detail..
> > 
> > diff -urN 1/systems/fbdev/fbdev.c 2/systems/fbdev/fbdev.c
> > --- 1/systems/fbdev/fbdev.c 2006-06-29 10:09:34.000000000 +0530
> > +++ 2/systems/fbdev/fbdev.c 2006-05-03 12:52:37.000000000 +0530
> > @@ -508,36 +508,33 @@
> >       dfb_fbdev_var_to_mode( &shared->current_var,
> >                              &shared->current_mode );
> >  
> > -/*   shared->cmap_memory = SHMALLOC( pool_data, 256 * 2 * 12 );*/
> > -     shared->orig_cmap_memory = SHMALLOC( pool_data, 256 * 2 * 4 );
> > +     shared->cmap_memory = SHMALLOC( pool_data, 256 * 2 * 12 );
> 
> Took a few seconds to recognize that your patch is reversed :)
Sorry for that...
> 
> >       shared->orig_cmap.start  = 0;
> >       shared->orig_cmap.len    = 256;
> > -     shared->orig_cmap.red    = shared->orig_cmap_memory + 256 * 2 * 0;
> > -     shared->orig_cmap.green  = shared->orig_cmap_memory + 256 * 2 * 1;
> > -     shared->orig_cmap.blue   = shared->orig_cmap_memory + 256 * 2 * 2;
> > -     shared->orig_cmap.transp = shared->orig_cmap_memory + 256 * 2 * 3;
> > +     shared->orig_cmap.red    = shared->cmap_memory + 256 * 2 * 0;
> > +     shared->orig_cmap.green  = shared->cmap_memory + 256 * 2 * 1;
> > +     shared->orig_cmap.blue   = shared->cmap_memory + 256 * 2 * 2;
> > +     shared->orig_cmap.transp = shared->cmap_memory + 256 * 2 * 3;
> >  
> >       if (ioctl( dfb_fbdev->fd, FBIOGETCMAP, &shared->orig_cmap ) < 0) {
> >            D_PERROR( "DirectFB/FBDev: "
> >                      "Could not retrieve palette for backup!\n" );
> > -          SHFREE( pool_data, shared->orig_cmap_memory );
> > +          SHFREE( pool_data, shared->cmap_memory );
> >            shared->orig_cmap.len = 0;
> 
> Maybe it's even better to memset the cmap struct with zero to also NULL
> all the pointers and protect against accidental usage later on.
> 
Ya this will be the good idea to set the mem to 0 when we create the
struture instance only..
> >       }
> >  
> > -     shared->temp_cmap_memory = SHMALLOC( pool_data, 256 * 2 * 4 );
> >       shared->temp_cmap.len    = 256;
> > -     shared->temp_cmap.red    = shared->temp_cmap_memory + 256 * 2 * 4;
> > -     shared->temp_cmap.green  = shared->temp_cmap_memory + 256 * 2 * 5;
> > -     shared->temp_cmap.blue   = shared->temp_cmap_memory + 256 * 2 * 6;
> > -     shared->temp_cmap.transp = shared->temp_cmap_memory + 256 * 2 * 7;
> > +     shared->temp_cmap.red    = shared->cmap_memory + 256 * 2 * 4;
> > +     shared->temp_cmap.green  = shared->cmap_memory + 256 * 2 * 5;
> > +     shared->temp_cmap.blue   = shared->cmap_memory + 256 * 2 * 6;
> > +     shared->temp_cmap.transp = shared->cmap_memory + 256 * 2 * 7;
> 
> You forgot to change the offsets from 4,5,6,7 to 0,1,2,3 :)
> 
> > -     shared->current_cmap_memory = SHMALLOC( pool_data, 256 * 2 * 4 );
> >       shared->current_cmap.len    = 256;
> > -     shared->current_cmap.red    = shared->current_cmap_memory + 256 *
> > 2 * 8;
> > -     shared->current_cmap.green  = shared->current_cmap_memory + 256 *
> > 2 * 9;
> > -     shared->current_cmap.blue   = shared->current_cmap_memory + 256 *
> > 2 * 10;
> > -     shared->current_cmap.transp = shared->current_cmap_memory + 256 *
> > 2 * 11;
> > +     shared->current_cmap.red    = shared->cmap_memory + 256 * 2 * 8;
> > +     shared->current_cmap.green  = shared->cmap_memory + 256 * 2 * 9;
> > +     shared->current_cmap.blue   = shared->cmap_memory + 256 * 2 * 10;
> > +     shared->current_cmap.transp = shared->cmap_memory + 256 * 2 * 11;
> 
> dito
> 
> >       dfb_fbdev_get_pci_info( shared );
> >  
> > @@ -667,12 +664,7 @@
> >                           "Could not restore palette!\n" );
> >       }
> >  
> > -     if( shared->orig_cmap.len> 0) /* Check if memory IS allocated*/
> > -       SHFREE( shared->shmpool_data, shared->orig_cmap_memory );
> > -     if( shared->current_cmap.len> 0)/* Check if memory IS allocated*/
> > -       SHFREE( shared->shmpool_data, shared->current_cmap_memory );
> > -     if( shared->temp_cmap.len> 0)/* Check if memory IS allocated*/
> > -       SHFREE( shared->shmpool_data, shared->orig_cmap_memory );
> 
> Better keep pointers NULL if memory is not allocated and check for that 
> only.
I belive this function gets only called when we do the core shutdown..
or when the diretFB core closes.
but your point is valid for other SHFREE's... 
> 
> 
> 
> By that opportunity, we should add checks after SHMALLOC() to do
> D_OOSHM() if it returns NULL :-)
Sounds Intresting....
> 

Regards
Srinivas.Kandagatla
Celunite SoftSystems.
Hyderbad.


_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to