Skip to content

Commit 51647eb

Browse files
devnexenkrakjoe
authored andcommitted
socket: ancillary credentials build fix for non linux systems.
for systems using SO_PASSCRED sockopt flag but not using ucred struct.
1 parent 62bcb31 commit 51647eb

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

ext/sockets/config.m4

+28
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,34 @@ if test "$PHP_SOCKETS" != "no"; then
6262
AC_DEFINE(HAVE_AI_IDN,1,[Whether you have AI_IDN])
6363
fi
6464

65+
dnl Check for struct ucred
66+
dnl checking the header is not enough (eg DragonFlyBSD)
67+
AC_CACHE_CHECK([if ancillary credentials uses ucred],[ac_cv_ucred],
68+
[
69+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
70+
#include <sys/socket.h>
71+
]], [[struct ucred u = {.gid = 0};]])],
72+
[ac_cv_ucred=yes], [ac_cv_ucred=no])
73+
])
74+
75+
if test "$ac_cv_ucred" = yes; then
76+
AC_DEFINE(ANC_CREDS_UCRED,1,[Uses ucred struct])
77+
fi
78+
79+
dnl Check for struct cmsgcred
80+
AC_CACHE_CHECK([if ancillary credentials uses cmsgcred],[ac_cv_cmsgcred],
81+
[
82+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
83+
#include <sys/socket.h>
84+
]], [[struct cmsgcred c = {0};]])],
85+
[ac_cv_cmsgcred=yes], [ac_cv_cmsgcred=no])
86+
])
87+
88+
if test "$ac_cv_cmsgcred" = yes; then
89+
AC_DEFINE(ANC_CREDS_CMSGCRED,1,[Uses cmsgcred struct])
90+
fi
91+
92+
6593
PHP_SOCKETS_CFLAGS=-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
6694
case $host_alias in
6795
*darwin*) PHP_SOCKETS_CFLAGS="$PHP_SOCKETS_CFLAGS -D__APPLE_USE_RFC_3542"

ext/sockets/conversions.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -1297,13 +1297,20 @@ void to_zval_read_in6_pktinfo(const char *data, zval *zv, res_context *ctx)
12971297
}
12981298
#endif
12991299

1300-
/* CONVERSIONS for struct ucred */
1300+
/* CONVERSIONS for struct ucred/cmsgcred */
13011301
#ifdef SO_PASSCRED
13021302
static const field_descriptor descriptors_ucred[] = {
1303+
#if defined(ANC_CREDS_UCRED)
13031304
{"pid", sizeof("pid"), 1, offsetof(struct ucred, pid), from_zval_write_pid_t, to_zval_read_pid_t},
13041305
{"uid", sizeof("uid"), 1, offsetof(struct ucred, uid), from_zval_write_uid_t, to_zval_read_uid_t},
13051306
/* assume the type gid_t is the same as uid_t: */
13061307
{"gid", sizeof("gid"), 1, offsetof(struct ucred, gid), from_zval_write_uid_t, to_zval_read_uid_t},
1308+
#elif defined(ANC_CREDS_CMSGCRED)
1309+
{"pid", sizeof("pid"), 1, offsetof(struct cmsgcred, cmcred_pid), from_zval_write_pid_t, to_zval_read_pid_t},
1310+
{"uid", sizeof("uid"), 1, offsetof(struct cmsgcred, cmcred_uid), from_zval_write_uid_t, to_zval_read_uid_t},
1311+
/* assume the type gid_t is the same as uid_t: */
1312+
{"gid", sizeof("gid"), 1, offsetof(struct cmsgcred, cmcred_gid), from_zval_write_uid_t, to_zval_read_uid_t},
1313+
#endif
13071314
{0}
13081315
};
13091316
void from_zval_write_ucred(const zval *container, char *ucred_c, ser_context *ctx)

ext/sockets/sendrecvmsg.c

+9
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,13 @@ static void init_ancillary_registry(void)
121121
#endif
122122

123123
#ifdef SO_PASSCRED
124+
#ifdef ANC_CREDS_UCRED
124125
PUT_ENTRY(sizeof(struct ucred), 0, 0, from_zval_write_ucred,
125126
to_zval_read_ucred, SOL_SOCKET, SCM_CREDENTIALS);
127+
#else
128+
PUT_ENTRY(sizeof(struct cmsgcred), 0, 0, from_zval_write_ucred,
129+
to_zval_read_ucred, SOL_SOCKET, SCM_CREDS);
130+
#endif
126131
#endif
127132

128133
#ifdef SCM_RIGHTS
@@ -436,7 +441,11 @@ void php_socket_sendrecvmsg_init(INIT_FUNC_ARGS)
436441
REGISTER_LONG_CONSTANT("SCM_RIGHTS", SCM_RIGHTS, CONST_CS | CONST_PERSISTENT);
437442
#endif
438443
#ifdef SO_PASSCRED
444+
#ifdef SCM_CREDENTIALS
439445
REGISTER_LONG_CONSTANT("SCM_CREDENTIALS", SCM_CREDENTIALS, CONST_CS | CONST_PERSISTENT);
446+
#else
447+
REGISTER_LONG_CONSTANT("SCM_CREDS", SCM_CREDS, CONST_CS | CONST_PERSISTENT);
448+
#endif
440449
REGISTER_LONG_CONSTANT("SO_PASSCRED", SO_PASSCRED, CONST_CS | CONST_PERSISTENT);
441450
#endif
442451

0 commit comments

Comments
 (0)