Skip to content

Commit af0c31c

Browse files
committed
[PR #1115] dix: replace XACE_SERVER_ACCESS by direct callback
PR: #1115
1 parent da5cab6 commit af0c31c

File tree

13 files changed

+56
-35
lines changed

13 files changed

+56
-35
lines changed

Xext/namespace/hook-server.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44

55
#include "dix/dix_priv.h"
66
#include "dix/registry_priv.h"
7+
#include "dix/server_priv.h"
78
#include "Xext/xacestr.h"
89

910
#include "namespace.h"
1011
#include "hooks.h"
1112

1213
void hookServerAccess(CallbackListPtr *pcbl, void *unused, void *calldata)
1314
{
14-
XNS_HOOK_HEAD(XaceServerAccessRec);
15+
XNS_HOOK_HEAD(ServerAccessCallbackParam);
1516

1617
if (subj->ns->superPower)
1718
goto pass;

Xext/namespace/namespace.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "dix/extension_priv.h"
88
#include "dix/property_priv.h"
99
#include "dix/selection_priv.h"
10+
#include "dix/server_priv.h"
1011
#include "include/os.h"
1112
#include "miext/extinit_priv.h"
1213
#include "Xext/xacestr.h"
@@ -37,13 +38,13 @@ NamespaceExtensionInit(void)
3738
AddCallback(&SelectionFilterCallback, hookSelectionFilter, NULL) &&
3839
AddCallback(&ExtensionAccessCallback, hookExtAccess, NULL) &&
3940
AddCallback(&ExtensionDispatchCallback, hookExtDispatch, NULL) &&
41+
AddCallback(&ServerAccessCallback, hookServerAccess, NULL) &&
4042
XaceRegisterCallback(XACE_CLIENT_ACCESS, hookClient, NULL) &&
4143
XaceRegisterCallback(XACE_DEVICE_ACCESS, hookDevice, NULL) &&
4244
XaceRegisterCallback(XACE_PROPERTY_ACCESS, hookPropertyAccess, NULL) &&
4345
XaceRegisterCallback(XACE_RECEIVE_ACCESS, hookReceive, NULL) &&
4446
XaceRegisterCallback(XACE_RESOURCE_ACCESS, hookResourceAccess, NULL) &&
45-
XaceRegisterCallback(XACE_SEND_ACCESS, hookSend, NULL) &&
46-
XaceRegisterCallback(XACE_SERVER_ACCESS, hookServerAccess, NULL)))
47+
XaceRegisterCallback(XACE_SEND_ACCESS, hookSend, NULL)))
4748
FatalError("NamespaceExtensionInit: allocation failure\n");
4849

4950
/* Do the serverClient */

Xext/security.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ in this Software without prior written authorization from The Open Group.
3535
#include "dix/registry_priv.h"
3636
#include "dix/request_priv.h"
3737
#include "dix/resource_priv.h"
38+
#include "dix/server_priv.h"
3839
#include "miext/extinit_priv.h"
3940
#include "os/audit.h"
4041
#include "os/auth.h"
@@ -767,7 +768,7 @@ SecurityExtension(CallbackListPtr *pcbl, void *unused, void *calldata)
767768
static void
768769
SecurityServer(CallbackListPtr *pcbl, void *unused, void *calldata)
769770
{
770-
XaceServerAccessRec *rec = calldata;
771+
ServerAccessCallbackParam *rec = calldata;
771772
SecurityStateRec *subj, *obj;
772773
Mask requested = rec->access_mode;
773774
Mask allowed = SecurityServerMask;
@@ -968,14 +969,14 @@ SecurityResetProc(ExtensionEntry * extEntry)
968969
DeleteCallback(&ClientStateCallback, SecurityClientState, NULL);
969970
DeleteCallback(&ExtensionAccessCallback, SecurityExtension, NULL);
970971
DeleteCallback(&ExtensionDispatchCallback, SecurityExtension, NULL);
972+
DeleteCallback(&ServerAccessCallback, SecurityServer, NULL);
971973

972974
XaceDeleteCallback(XACE_RESOURCE_ACCESS, SecurityResource, NULL);
973975
XaceDeleteCallback(XACE_DEVICE_ACCESS, SecurityDevice, NULL);
974976
XaceDeleteCallback(XACE_PROPERTY_ACCESS, SecurityProperty, NULL);
975977
XaceDeleteCallback(XACE_SEND_ACCESS, SecuritySend, NULL);
976978
XaceDeleteCallback(XACE_RECEIVE_ACCESS, SecurityReceive, NULL);
977979
XaceDeleteCallback(XACE_CLIENT_ACCESS, SecurityClient, NULL);
978-
XaceDeleteCallback(XACE_SERVER_ACCESS, SecurityServer, NULL);
979980
}
980981

981982
/* SecurityExtensionInit
@@ -1016,14 +1017,14 @@ SecurityExtensionInit(void)
10161017
ret &= AddCallback(&ClientStateCallback, SecurityClientState, NULL);
10171018
ret &= AddCallback(&ExtensionAccessCallback, SecurityExtension, NULL);
10181019
ret &= AddCallback(&ExtensionDispatchCallback, SecurityExtension, NULL);
1020+
ret &= AddCallback(&ServerAccessCallback, SecurityExtension, NULL);
10191021

10201022
ret &= XaceRegisterCallback(XACE_RESOURCE_ACCESS, SecurityResource, NULL);
10211023
ret &= XaceRegisterCallback(XACE_DEVICE_ACCESS, SecurityDevice, NULL);
10221024
ret &= XaceRegisterCallback(XACE_PROPERTY_ACCESS, SecurityProperty, NULL);
10231025
ret &= XaceRegisterCallback(XACE_SEND_ACCESS, SecuritySend, NULL);
10241026
ret &= XaceRegisterCallback(XACE_RECEIVE_ACCESS, SecurityReceive, NULL);
10251027
ret &= XaceRegisterCallback(XACE_CLIENT_ACCESS, SecurityClient, NULL);
1026-
ret &= XaceRegisterCallback(XACE_SERVER_ACCESS, SecurityServer, NULL);
10271028

10281029
if (!ret)
10291030
FatalError("SecurityExtensionSetup: Failed to register callbacks\n");

Xext/xace.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,6 @@ int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode)
9090
return rec.status;
9191
}
9292

93-
int XaceHookServerAccess(ClientPtr client, Mask access_mode)
94-
{
95-
XaceServerAccessRec rec = { client, access_mode, Success };
96-
CallCallbacks(&XaceHooks[XACE_SERVER_ACCESS], &rec);
97-
return rec.status;
98-
}
99-
10093
int XaceHookScreenAccess(ClientPtr client, ScreenPtr screen, Mask access_mode)
10194
{
10295
XaceScreenAccessRec rec = { client, screen, access_mode, Success };

Xext/xace.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4444
#define XACE_SEND_ACCESS 5
4545
#define XACE_RECEIVE_ACCESS 6
4646
#define XACE_CLIENT_ACCESS 7
47-
#define XACE_SERVER_ACCESS 9
4847
#define XACE_SELECTION_ACCESS 10
4948
#define XACE_SCREEN_ACCESS 11
5049
#define XACE_SCREENSAVER_ACCESS 12
@@ -77,7 +76,6 @@ int XaceHookSendAccess(ClientPtr client, DeviceIntPtr dev, WindowPtr win,
7776
xEventPtr ev, int count);
7877
int XaceHookReceiveAccess(ClientPtr client, WindowPtr win, xEventPtr ev, int count);
7978
int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode);
80-
int XaceHookServerAccess(ClientPtr client, Mask access_mode);
8179
int XaceHookScreenAccess(ClientPtr client, ScreenPtr screen, Mask access_mode);
8280
int XaceHookScreensaverAccess(ClientPtr client, ScreenPtr screen, Mask access_mode);
8381

Xext/xacestr.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,6 @@ typedef struct {
8686
int status;
8787
} XaceClientAccessRec;
8888

89-
/* XACE_SERVER_ACCESS */
90-
typedef struct {
91-
ClientPtr client;
92-
Mask access_mode;
93-
int status;
94-
} XaceServerAccessRec;
95-
9689
/* XACE_SELECTION_ACCESS */
9790
typedef struct {
9891
ClientPtr client;

Xext/xselinux_hooks.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3838
#include "dix/registry_priv.h"
3939
#include "dix/resource_priv.h"
4040
#include "dix/selection_priv.h"
41+
#include "dix/server_priv.h"
4142
#include "os/client_priv.h"
4243

4344
#include "inputstr.h"
@@ -732,7 +733,7 @@ SELinuxClient(CallbackListPtr *pcbl, void *unused, void *calldata)
732733
static void
733734
SELinuxServer(CallbackListPtr *pcbl, void *unused, void *calldata)
734735
{
735-
XaceServerAccessRec *rec = calldata;
736+
ServerAccessCallbackParam *rec = calldata;
736737
SELinuxSubjectRec *subj;
737738
SELinuxObjectRec *obj;
738739
SELinuxAuditRec auditdata = {.client = rec->client };
@@ -833,14 +834,14 @@ SELinuxFlaskReset(void)
833834
DeleteCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
834835
DeleteCallback(&ExtensionAccessCallback, SELinuxExtension, NULL);
835836
DeleteCallback(&ExtensionDispatchCallback, SELinuxExtension, NULL);
837+
DeleteCallback(&ServerAccessCallback, SELinuxServer, NULL);
836838

837839
XaceDeleteCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
838840
XaceDeleteCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
839841
XaceDeleteCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
840842
XaceDeleteCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
841843
XaceDeleteCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
842844
XaceDeleteCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
843-
XaceDeleteCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
844845
XaceDeleteCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
845846
XaceDeleteCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
846847
XaceDeleteCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);
@@ -927,14 +928,14 @@ SELinuxFlaskInit(void)
927928
ret &= AddCallback(&ResourceStateCallback, SELinuxResourceState, NULL);
928929
ret &= AddCallback(&ExtensionAccessCallback, SELinuxExtension, NULL);
929930
ret &= AddCallback(&ExtensionDispatchCallback, SELinuxExtension, NULL);
931+
ret &= AddCallback(&ServerAccessCallback, SELinuxServer, NULL);
930932

931933
ret &= XaceRegisterCallback(XACE_RESOURCE_ACCESS, SELinuxResource, NULL);
932934
ret &= XaceRegisterCallback(XACE_DEVICE_ACCESS, SELinuxDevice, NULL);
933935
ret &= XaceRegisterCallback(XACE_PROPERTY_ACCESS, SELinuxProperty, NULL);
934936
ret &= XaceRegisterCallback(XACE_SEND_ACCESS, SELinuxSend, NULL);
935937
ret &= XaceRegisterCallback(XACE_RECEIVE_ACCESS, SELinuxReceive, NULL);
936938
ret &= XaceRegisterCallback(XACE_CLIENT_ACCESS, SELinuxClient, NULL);
937-
ret &= XaceRegisterCallback(XACE_SERVER_ACCESS, SELinuxServer, NULL);
938939
ret &= XaceRegisterCallback(XACE_SELECTION_ACCESS, SELinuxSelection, NULL);
939940
ret &= XaceRegisterCallback(XACE_SCREEN_ACCESS, SELinuxScreen, NULL);
940941
ret &= XaceRegisterCallback(XACE_SCREENSAVER_ACCESS, SELinuxScreen, truep);

dix/dispatch.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ Equipment Corporation.
116116
#include "dix/screenint_priv.h"
117117
#include "dix/screensaver_priv.h"
118118
#include "dix/selection_priv.h"
119+
#include "dix/server_priv.h"
119120
#include "dix/window_priv.h"
120121
#include "include/resource.h"
121122
#include "miext/extinit_priv.h"
@@ -173,7 +174,9 @@ static int nextFreeClientID; /* always MIN free client ID */
173174

174175
static int nClients; /* number of authorized clients */
175176

176-
CallbackListPtr ClientStateCallback;
177+
CallbackListPtr ClientStateCallback = NULL;
178+
CallbackListPtr ServerAccessCallback = NULL;
179+
177180
OsTimerPtr dispatchExceptionTimer;
178181

179182
/* dispatchException & isItTimeToYield must be declared volatile since they
@@ -3281,7 +3284,7 @@ ProcListHosts(ClientPtr client)
32813284
REQUEST_SIZE_MATCH(xListHostsReq);
32823285

32833286
/* untrusted clients can't list hosts */
3284-
result = XaceHookServerAccess(client, DixReadAccess);
3287+
result = dixCallServerAccessCallback(client, DixReadAccess);
32853288
if (result != Success)
32863289
return result;
32873290

@@ -3410,7 +3413,7 @@ ProcGetFontPath(ClientPtr client)
34103413
/* REQUEST (xReq); */
34113414
REQUEST_SIZE_MATCH(xReq);
34123415

3413-
int rc = XaceHookServerAccess(client, DixGetAttrAccess);
3416+
int rc = dixCallServerAccessCallback(client, DixGetAttrAccess);
34143417
if (rc != Success)
34153418
return rc;
34163419

dix/dixfonts.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ Equipment Corporation.
6262
#include "dix/request_priv.h"
6363
#include "dix/rpcbuf_priv.h"
6464
#include "dix/screenint_priv.h"
65+
#include "dix/server_priv.h"
6566
#include "include/swaprep.h"
6667
#include "os/auth.h"
6768
#include "os/log_priv.h"
@@ -788,7 +789,7 @@ ListFonts(ClientPtr client, unsigned char *pattern, unsigned length,
788789
if (length > XLFDMAXFONTNAMELEN)
789790
return BadAlloc;
790791

791-
access = XaceHookServerAccess(client, DixGetAttrAccess);
792+
access = dixCallServerAccessCallback(client, DixGetAttrAccess);
792793
if (access != Success)
793794
return access;
794795

@@ -1066,7 +1067,7 @@ StartListFontsWithInfo(ClientPtr client, int length, unsigned char *pattern,
10661067
if (length > XLFDMAXFONTNAMELEN)
10671068
return BadAlloc;
10681069

1069-
access = XaceHookServerAccess(client, DixGetAttrAccess);
1070+
access = dixCallServerAccessCallback(client, DixGetAttrAccess);
10701071
if (access != Success)
10711072
return access;
10721073

@@ -1688,7 +1689,7 @@ SetFontPathElements(int npaths, unsigned char *paths, int *bad, Bool persist)
16881689
int
16891690
SetFontPath(ClientPtr client, int npaths, unsigned char *paths)
16901691
{
1691-
int err = XaceHookServerAccess(client, DixManageAccess);
1692+
int err = dixCallServerAccessCallback(client, DixManageAccess);
16921693

16931694
if (err != Success)
16941695
return err;
@@ -1777,7 +1778,7 @@ GetFontPath(ClientPtr client, int *count, int *length, unsigned char **result)
17771778
int len;
17781779
FontPathElementPtr fpe;
17791780

1780-
access = XaceHookServerAccess(client, DixGetAttrAccess);
1781+
access = dixCallServerAccessCallback(client, DixGetAttrAccess);
17811782
if (access != Success)
17821783
return access;
17831784

dix/server_priv.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* SPDX-License-Identifier: MIT OR X11
2+
*
3+
* Copyright © 2024 Enrico Weigelt, metux IT consult <[email protected]>
4+
*/
5+
#ifndef _XSERVER_DIX_SERVER_PRIV_H
6+
#define _XSERVER_DIX_SERVER_PRIV_H
7+
8+
#include "include/callback.h"
9+
#include "include/dix.h"
10+
11+
typedef struct {
12+
ClientPtr client;
13+
Mask access_mode;
14+
int status;
15+
} ServerAccessCallbackParam;
16+
17+
extern CallbackListPtr ServerAccessCallback;
18+
19+
static inline int dixCallServerAccessCallback(ClientPtr client, Mask access_mode)
20+
{
21+
ServerAccessCallbackParam rec = { client, access_mode, Success };
22+
CallCallbacks(&ServerAccessCallback, &rec);
23+
return rec.status;
24+
}
25+
26+
#endif /* _XSERVER_DIX_SERVER_PRIV_H */

0 commit comments

Comments
 (0)