mirror of
https://github.com/X11Libre/xserver.git
synced 2026-09-28 21:33:09 +00:00
xace: add hooks + new access codes: core protocol cursor requests
This commit is contained in:
parent
b424e01ec5
commit
dc84bb3418
7 changed files with 113 additions and 107 deletions
92
dix/cursor.c
92
dix/cursor.c
|
|
@ -59,6 +59,7 @@ SOFTWARE.
|
|||
#include "cursorstr.h"
|
||||
#include "dixfontstr.h"
|
||||
#include "opaque.h"
|
||||
#include "xace.h"
|
||||
|
||||
typedef struct _GlyphShare {
|
||||
FontPtr font;
|
||||
|
|
@ -161,23 +162,25 @@ CheckForEmptyMask(CursorBitsPtr bits)
|
|||
* \param pmaskbits server-defined padding
|
||||
* \param argb no padding
|
||||
*/
|
||||
CursorPtr
|
||||
AllocCursorARGB(unsigned char *psrcbits, unsigned char *pmaskbits, CARD32 *argb,
|
||||
CursorMetricPtr cm,
|
||||
unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
|
||||
unsigned backRed, unsigned backGreen, unsigned backBlue)
|
||||
int
|
||||
AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
|
||||
CARD32 *argb, CursorMetricPtr cm,
|
||||
unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
|
||||
unsigned backRed, unsigned backGreen, unsigned backBlue,
|
||||
CursorPtr *ppCurs, ClientPtr client, XID cid)
|
||||
{
|
||||
CursorBitsPtr bits;
|
||||
CursorPtr pCurs;
|
||||
int nscr;
|
||||
int rc, nscr;
|
||||
ScreenPtr pscr;
|
||||
|
||||
*ppCurs = NULL;
|
||||
pCurs = (CursorPtr)xalloc(sizeof(CursorRec) + sizeof(CursorBits));
|
||||
if (!pCurs)
|
||||
{
|
||||
xfree(psrcbits);
|
||||
xfree(pmaskbits);
|
||||
return (CursorPtr)NULL;
|
||||
return BadAlloc;
|
||||
}
|
||||
bits = (CursorBitsPtr)((char *)pCurs + sizeof(CursorRec));
|
||||
bits->source = psrcbits;
|
||||
|
|
@ -207,6 +210,15 @@ AllocCursorARGB(unsigned char *psrcbits, unsigned char *pmaskbits, CARD32 *argb,
|
|||
pCurs->backGreen = backGreen;
|
||||
pCurs->backBlue = backBlue;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
|
||||
DixCreateAccess, pCurs);
|
||||
if (rc != Success) {
|
||||
FreeCursorBits(bits);
|
||||
xfree(pCurs);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* realize the cursor for every screen
|
||||
*/
|
||||
|
|
@ -222,59 +234,43 @@ AllocCursorARGB(unsigned char *psrcbits, unsigned char *pmaskbits, CARD32 *argb,
|
|||
}
|
||||
FreeCursorBits(bits);
|
||||
xfree(pCurs);
|
||||
return (CursorPtr)NULL;
|
||||
return BadAlloc;
|
||||
}
|
||||
}
|
||||
return pCurs;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* \param psrcbits server-defined padding
|
||||
* \param pmaskbits server-defined padding
|
||||
*/
|
||||
CursorPtr
|
||||
AllocCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
|
||||
CursorMetricPtr cm,
|
||||
unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
|
||||
unsigned backRed, unsigned backGreen, unsigned backBlue)
|
||||
{
|
||||
return AllocCursorARGB (psrcbits, pmaskbits, (CARD32 *) 0, cm,
|
||||
foreRed, foreGreen, foreBlue,
|
||||
backRed, backGreen, backBlue);
|
||||
*ppCurs = pCurs;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
|
||||
unsigned foreRed, unsigned foreGreen, unsigned foreBlue,
|
||||
unsigned backRed, unsigned backGreen, unsigned backBlue,
|
||||
CursorPtr *ppCurs, ClientPtr client)
|
||||
CursorPtr *ppCurs, ClientPtr client, XID cid)
|
||||
{
|
||||
FontPtr sourcefont, maskfont;
|
||||
unsigned char *srcbits;
|
||||
unsigned char *mskbits;
|
||||
CursorMetricRec cm;
|
||||
int res;
|
||||
int rc;
|
||||
CursorBitsPtr bits;
|
||||
CursorPtr pCurs;
|
||||
int nscr;
|
||||
ScreenPtr pscr;
|
||||
GlyphSharePtr pShare;
|
||||
|
||||
sourcefont = (FontPtr) SecurityLookupIDByType(client, source, RT_FONT,
|
||||
DixReadAccess);
|
||||
maskfont = (FontPtr) SecurityLookupIDByType(client, mask, RT_FONT,
|
||||
DixReadAccess);
|
||||
|
||||
if (!sourcefont)
|
||||
rc = dixLookupResource((pointer *)&sourcefont, source, RT_FONT, client,
|
||||
DixUseAccess);
|
||||
if (rc != Success)
|
||||
{
|
||||
client->errorValue = source;
|
||||
return(BadFont);
|
||||
return (rc == BadValue) ? BadFont : rc;
|
||||
}
|
||||
if (!maskfont && (mask != None))
|
||||
rc = dixLookupResource((pointer *)&maskfont, mask, RT_FONT, client,
|
||||
DixUseAccess);
|
||||
if (rc != Success && mask != None)
|
||||
{
|
||||
client->errorValue = mask;
|
||||
return(BadFont);
|
||||
return (rc == BadValue) ? BadFont : rc;
|
||||
}
|
||||
if (sourcefont != maskfont)
|
||||
pShare = (GlyphSharePtr)NULL;
|
||||
|
|
@ -322,13 +318,13 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
|
|||
client->errorValue = maskChar;
|
||||
return BadValue;
|
||||
}
|
||||
if ((res = ServerBitsFromGlyph(maskfont, maskChar, &cm, &mskbits)) != 0)
|
||||
return res;
|
||||
if ((rc = ServerBitsFromGlyph(maskfont, maskChar, &cm, &mskbits)))
|
||||
return rc;
|
||||
}
|
||||
if ((res = ServerBitsFromGlyph(sourcefont, sourceChar, &cm, &srcbits)) != 0)
|
||||
if ((rc = ServerBitsFromGlyph(sourcefont, sourceChar, &cm, &srcbits)))
|
||||
{
|
||||
xfree(mskbits);
|
||||
return res;
|
||||
return rc;
|
||||
}
|
||||
if (sourcefont != maskfont)
|
||||
{
|
||||
|
|
@ -398,6 +394,15 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
|
|||
pCurs->backGreen = backGreen;
|
||||
pCurs->backBlue = backBlue;
|
||||
|
||||
/* security creation/labeling check */
|
||||
rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
|
||||
DixCreateAccess, pCurs);
|
||||
if (rc != Success) {
|
||||
FreeCursorBits(bits);
|
||||
xfree(pCurs);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* realize the cursor for every screen
|
||||
*/
|
||||
|
|
@ -447,7 +452,8 @@ CreateRootCursor(char *unused1, unsigned int unused2)
|
|||
cm.xhot = 0;
|
||||
cm.yhot = 0;
|
||||
|
||||
curs = AllocCursor(NULL, NULL, &cm, 0, 0, 0, 0, 0, 0);
|
||||
AllocARGBCursor(NULL, NULL, NULL, &cm, 0, 0, 0, 0, 0, 0,
|
||||
&curs, serverClient, (XID)0);
|
||||
|
||||
if (curs == NullCursor)
|
||||
return NullCursor;
|
||||
|
|
@ -461,8 +467,8 @@ CreateRootCursor(char *unused1, unsigned int unused2)
|
|||
cursorfont = (FontPtr)LookupIDByType(fontID, RT_FONT);
|
||||
if (!cursorfont)
|
||||
return NullCursor;
|
||||
if (AllocGlyphCursor(fontID, 0, fontID, 1,
|
||||
0, 0, 0, ~0, ~0, ~0, &curs, serverClient) != Success)
|
||||
if (AllocGlyphCursor(fontID, 0, fontID, 1, 0, 0, 0, ~0, ~0, ~0,
|
||||
&curs, serverClient, (XID)0) != Success)
|
||||
return NullCursor;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue