[LTP] [PATCH 1/1] lapi/keyctl.h: Fix compilation on old kernel
Petr Vorel
pvorel@suse.cz
Tue Sep 22 10:55:14 CEST 2026
> > > Hi!
> > > > diff --git a/include/lapi/keyctl.h b/include/lapi/keyctl.h
> > > > index fdb68d1725..e1e46b7865 100644
> > > > --- a/include/lapi/keyctl.h
> > > > +++ b/include/lapi/keyctl.h
> > > > @@ -69,6 +69,12 @@ struct keyctl_dh_params {
> > > > };
> > > > #endif
> > > > +/* Fix for kernel < v4.20 */
> > > > +#if defined(HAVE_STRUCT_KEYCTL_DH_PARAMS) && \
> > > > + !defined(HAVE_STRUCT_KEYCTL_DH_PARAMS_PRIV)
> > > > +# define priv private
> > > > +#endif
> > > I do not like this one, we may end up redefining wrong priv and break
> > > everything.
> > > Given that the private stil exists in the structure for C code:
> > > (/usr/include/linux/keyctl.h)
> > > /* keyctl structures */
> > > struct keyctl_dh_params {
> > > union {
> > > #ifndef __cplusplus
> > > __s32 private;
> > > #endif
> > > __s32 priv;
> > > };
> > > __s32 prime;
> > > __s32 base;
> > > };
FYI the userspace keyutils.h uses only priv [1]:
struct keyctl_dh_params {
key_serial_t priv;
key_serial_t prime;
key_serial_t base;
};
[1] https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git/tree/keyutils.h
> > > We may as well use private in the tests consistently and update our
> > > fallback with the union as well.
Thinking about it twice, I think the original solution is safe enough, based on
autotools check. As I wrote before if you really don't want it, we'd need to
vendor the struct. At that point we don't need private.
Look at the diff I posted (I can post it officially as v2). The cons is
maintaining the struct (but we do it for the fallback anyway). Pros is getting
rid some of autotools checks (small speedup).
WDYT?
Kind regards,
Petr
> > When I looked in the struct in UAPI I considered define better, but indeed
> > mirroring UAPI the same way is really better.
> > I'll retest it and send v2.
> Just the only thing - we will need to have to use our custom struct
> e.g. ltp_keyctl_dh_params (similarly to ltp_statx), because the problem is on
> the code which defines struct keyctl_dh_params, but without that fallback.
> Kind regards,
> Petr
> > Kind regards,
> > Petr
diff --git include/lapi/keyctl.h include/lapi/keyctl.h
index fdb68d1725..d1cea85aba 100644
--- include/lapi/keyctl.h
+++ include/lapi/keyctl.h
@@ -61,13 +61,11 @@ static inline key_serial_t keyctl_join_session_keyring(const char *name) {
#endif /* defined(HAVE_KEYUTILS_H) && defined(HAVE_LIBKEYUTILS) */
-#ifndef HAVE_STRUCT_KEYCTL_DH_PARAMS
-struct keyctl_dh_params {
+struct ltp_keyctl_dh_params {
int32_t priv;
int32_t prime;
int32_t base;
};
-#endif
#ifndef HAVE_STRUCT_KEYCTL_KDF_PARAMS
struct keyctl_kdf_params {
diff --git m4/ltp-keyutils.m4 m4/ltp-keyutils.m4
index 35bad783e5..b073183405 100644
--- m4/ltp-keyutils.m4
+++ m4/ltp-keyutils.m4
@@ -9,9 +9,6 @@ AC_DEFUN([LTP_CHECK_KEYUTILS_SUPPORT], [
[AC_DEFINE(HAVE_LIBKEYUTILS, 1, [Define to 1 if you have libkeyutils installed.])
AC_SUBST(KEYUTILS_LIBS, "-lkeyutils")])
- AC_CHECK_TYPES([struct keyctl_dh_params, struct keyctl_kdf_params,
- struct keyctl_pkey_query, struct keyctl_pkey_params],,,
+ AC_CHECK_TYPES([struct keyctl_kdf_params, struct keyctl_pkey_query, struct keyctl_pkey_params],,,
[#include <linux/keyctl.h>])
-
- AC_CHECK_MEMBERS([struct keyctl_dh_params.priv],,,[#include <linux/keyctl.h>])
])
diff --git testcases/kernel/syscalls/keyctl/keyctl25.c testcases/kernel/syscalls/keyctl/keyctl25.c
index d1aa3425d4..a99503183a 100644
--- testcases/kernel/syscalls/keyctl/keyctl25.c
+++ testcases/kernel/syscalls/keyctl/keyctl25.c
@@ -15,7 +15,7 @@
#include "keyctl_common.h"
#include "keyctl_dh_data.h"
-static struct keyctl_dh_params *dh_params;
+static struct ltp_keyctl_dh_params *dh_params;
static unsigned char out_buf[256];
static void setup(void)
diff --git testcases/kernel/syscalls/keyctl/keyctl26.c testcases/kernel/syscalls/keyctl/keyctl26.c
index bdd852fb4c..df80aadb6c 100644
--- testcases/kernel/syscalls/keyctl/keyctl26.c
+++ testcases/kernel/syscalls/keyctl/keyctl26.c
@@ -15,7 +15,7 @@
#include "keyctl_common.h"
#include "keyctl_dh_data.h"
-static struct keyctl_dh_params *dh_params;
+static struct ltp_keyctl_dh_params *dh_params;
static void setup(void)
{
diff --git testcases/kernel/syscalls/keyctl/keyctl27.c testcases/kernel/syscalls/keyctl/keyctl27.c
index 13a1538ce6..0ecf7dc389 100644
--- testcases/kernel/syscalls/keyctl/keyctl27.c
+++ testcases/kernel/syscalls/keyctl/keyctl27.c
@@ -19,7 +19,7 @@
#define KDF_OTHERINFO "LTP-KDF-TEST-INFO"
-static struct keyctl_dh_params *dh_params;
+static struct ltp_keyctl_dh_params *dh_params;
static struct keyctl_kdf_params *kdf_params;
static unsigned char out_buf[32];
diff --git testcases/kernel/syscalls/keyctl/keyctl28.c testcases/kernel/syscalls/keyctl/keyctl28.c
index 4c7f6be17e..53a59322b4 100644
--- testcases/kernel/syscalls/keyctl/keyctl28.c
+++ testcases/kernel/syscalls/keyctl/keyctl28.c
@@ -21,9 +21,9 @@
#include "keyctl_common.h"
#include "keyctl_dh_data.h"
-static struct keyctl_dh_params *dh_params;
-static struct keyctl_dh_params *dh_bogus_prime;
-static struct keyctl_dh_params *dh_nonuser_prime;
+static struct ltp_keyctl_dh_params *dh_params;
+static struct ltp_keyctl_dh_params *dh_bogus_prime;
+static struct ltp_keyctl_dh_params *dh_nonuser_prime;
static struct keyctl_kdf_params *kdf_valid;
static struct keyctl_kdf_params *kdf_spare_nonzero;
@@ -33,7 +33,7 @@ static struct keyctl_kdf_params *kdf_unknown_hash;
static unsigned char out_buf[1025];
static struct tcase {
- struct keyctl_dh_params **params;
+ struct ltp_keyctl_dh_params **params;
void *buffer;
size_t buflen;
struct keyctl_kdf_params **kdf;
@@ -105,7 +105,7 @@ static void setup(void)
static void verify_negative(unsigned int n)
{
struct tcase *tc = &tcases[n];
- struct keyctl_dh_params *p = *tc->params;
+ struct ltp_keyctl_dh_params *p = *tc->params;
struct keyctl_kdf_params *kdf = tc->kdf ? *tc->kdf : NULL;
TST_EXP_FAIL2(keyctl(KEYCTL_DH_COMPUTE, (unsigned long)p,
More information about the ltp
mailing list