Need help to understand small part of sourcecode

Simo Sorce idra at samba.org
Sun Dec 30 00:41:06 GMT 2001


Yes I tought it also, but in some places we prefer to get segfaults and fix problems than simply failing functions without apparent reason, I do not know if this is the case, I leave jerry, jeremy and other that better understands the printing code to make a better fix.

On Sun, Dec 30, 2001 at 08:30:48AM +0100, Claudia Moroder wrote:
> Hello Simo,
> 
> I see you changed to cvs the way status is passed instead of NULL.
> 
> For this case this is the solution, but this solutions leaves the door open
> for similar errors. What about to test in all functions if passed pointers
> are NULL ?  This checks should be conditionally compiled in this way samba
> would not be slowed down in the standard case. I remember in windows
> programmin there was a statement called ASSERT()
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dshow/htm/a
> ssert.asp .
> What about to use a similar solution ?
> 
> 
> Bye
> Andreas
> 
> -----Ursprüngliche Nachricht-----
> Von: "Simo Sorce" <idra at samba.org>
> An: "andreas moroder" <claudiamoroder at st-ulrich.suedtirol.net>
> Gesendet: Samstag, 29. Dezember 2001 10:43
> Betreff: Re: Need help to understand small part of sourcecode
> 
> 
> > On Fri, Dec 28, 2001 at 11:00:08PM +0100, andreas moroder wrote:
> > > Hello,
> > >
> > > it would be nice if anyone could explain me the following sections of
> source
> > > code
> > >
> > > In smbd/reply.c  in the function    reply_printqueue ( line 2550 .. )
> > >
> > >  print_queue_status(SNUM(conn), &queue,NULL) is called with the 3th
> parameter
> > > NULL.
> >
> > I think this is a bug.
> >
> > >
> > > in printing/printing.c there is the function print_queue_status
> > >
> > > .....
> > >         ZERO_STRUCTP(status);
> > >         slprintf(keystr, sizeof(keystr)-1, "STATUS/%s",
> lp_servicename(snum));
> > >         key.dptr = keystr;
> > >         key.dsize = strlen(keystr);
> > >         data = tdb_fetch(tdb, key);
> > >         if (data.dptr) {
> > >                 if (data.dsize == sizeof(*status)) {
> > >                         memcpy(status, data.dptr, sizeof(*status));
> <- ??
> > >
> > >                 }
> > >                 SAFE_FREE(data.dptr);
> > >         }
> > >
> > > the line <-?? is not clear to me
> > >
> > > if status is passed as NULL, the first parameter of memcopy is NULL. How
> can
> > > data.ptr be copied to nowhere ?
> >
> > it can't, my bet is that either memcpy see that src is null and return or
> we get a segfault here.
> >
> > >
> > > Do I miss anything ?
> > >
> > > (  I begin to have doubts, that memcpy(status, data.dptr,
> sizeof(*status))
> > > copies the pointer data.dptr to the pointer status ( not the data ), but
> in
> > > this case the SAFE_FREE would free the data status points )
> >
> > no, status is the pointer for a print_status_struct structure, this
> instruction mean we want to copy the content of data.dptr in the structure!
> >
> >
> > weel spotted, thanks.
> > --
> > Simo Sorce       idra at samba.org
> > -------------------------------
> > Samba Team http://www.samba.org
> 
> 

-- 
Simo Sorce       idra at samba.org
-------------------------------
Samba Team http://www.samba.org




More information about the samba-technical mailing list