[Xcb] GetWMSizeHints
Vincent Torri
Vincent.Torri at iecn.u-nancy.fr
Tue May 31 23:10:35 PDT 2005
On Tue, 31 May 2005, Jamey Sharp wrote:
> On Sat, 2005-05-14 at 14:23 +0200, Vincent Torri wrote:
> > On Fri, 13 May 2005, Jamey Sharp wrote:
> > > On Fri, 2005-05-13 at 08:50 +0200, Vincent Torri wrote:
> > > > I have written the code for GetWMSizeHints. I have a question about it:
> > > > in Xlib, they take into account some pre-ICCCM structures for the
> > > > SizeHints structure (that counts 15 members, instead of 18 for ICCCM v.
> > > > 1).
> > > > Should I take that into account too ? Or else the value returned by
> > > > XCBGetPropertyValue is always for ICCCM v. 1 ?
> > >
> > > If it's easy to be backwards-compatible, just do it. It's always better
> > > to support more existing configurations if the costs of doing so are
> > > low.
> >
> > Ok, it's done, I've added them in cvs. Please, have a look at it when you
> > get some time.
>
> OK, I've just looked over your ICCCM changes. The ideas are fine; thanks
> for the improvements! I also checked a recent small patch you committed
> to XCBImage.
>
> Minor things: I'm a little annoyed that you changed the whitespace
> around all of the function prototypes, particularly as part of a commit
> with real functionality changes, but that's alright. I'm also a little
> annoyed that the code you added didn't use the same indentation style as
> the rest of the source file, so I've committed a fix for that. These are
> no big deal.
sorry for this, i mainly use the gnu coding style. It has become a habit
to use it. Just one thinkg: if the indentation is not very a big problem
for me (unless it's more than 5 characters), i think that the code is more
readable when there is a space between the name of the function and the
open parenthesis.
i'll try to think about that for my next commits.
> The issue I really want to point out here, because it seems to have
> confused most of the people who have tried to use XCB, is that functions
> like XCBGetPropertyValue return pointers into the reply structure that
> you hand them. The idiom I've used in the past, as you apparently
> noticed while reading XCL source, is to memmove the variable-length part
> of a reply up to the beginning of the reply, after I'm done with all the
> fixed-length data. This saves a malloc and a free and avoids accessing
> free'd memory, leaking things, and trying to free inside the middle of a
> malloc'd block.
>
> Let's look at some code, and I'll try to make that clearer.
>
> int
> GetWMSizeHints (XCBConnection *c,
> XCBWINDOW window,
> XCBATOM property,
> SizeHints *hints,
> long *supplied)
> {
> /* ... */
> if (/* property is OK */)
> {
> unsigned char *prop;
> long length = XCBGetPropertyValueLength (rep);
> /* FIXME: in GetProp.c of xcl, one move the memory.
> * Should we do that too ? */
> prop = (unsigned char *) XCBGetPropertyValue (rep);
> prop[length] = '\0';
> hints = (SizeHints *)strdup (prop);
> /* ... */
> free (rep);
>
> return 1;
> }
>
> hints = NULL;
> free (rep);
>
> return 0;
> }
>
> To begin with, there are a couple of bugs here.
> * prop[length] is past the end of the allocated memory, so the
> above code will overrun its buffer every time.
so, the 'value' is at the end of the reply. Ok.
> * C has copy-by-value semantics: this code has no effect on the
> SizeHints structure provided by the caller.
ok, the memcpy is needed, as i free the reply
> If this is really the right API for this function, these bugs can be
> fixed pretty simply. Quit trying to assign pointers to hints:
>
> int ret = 0;
> /* ... */
> {
> memcpy(hints, XCBGetPropertyValue(rep),
> XCBGetPropertyValueLength(rep));
> /* ... */
> ret = 1;
> }
> free(rep);
> return ret;
>
> However, I'd probably be inclined to return a pointer to a
> newly-allocated SizeHints structure instead. The necessary changes for
> that are pretty straightforward.
ok.
> In the case of XCBImageGet, which has similar problems, I'd use the
> memmove approach, which unfortunately I don't have time to write about
> right now. I just want to point out for the moment that you can't free
> the return value of XCBGetImageData, as that doesn't point at the
> beginning of a malloc'd block, and you don't want to free the reply
> here, as the newly-allocated XCBImage structure has a pointer to the
> insides of the reply (which, when destroyed, will result in attempting
> to free the middle of a malloc'd block).
i'll look at it. it was the first thing i've wrote. I think it needs some
bug fixing :)
thanks
Vincent
More information about the xcb
mailing list