1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
Fix PAM const-qualifier detection for Hammerhead/illumos.
xdm keys the `XDM_PAM_QUAL` const qualifier (used on the pam_conv callback
and pam_get_item() arguments) on `#ifdef __sun`, assuming any __sun target
uses the classic Solaris non-const PAM prototypes. Hammerhead's GCC defines
__sun, but its <security/pam_appl.h> defaults to the CONST-qualified form
(int (*conv)(int, const struct pam_message **, ...) and pam_get_item(...,
const void **)) unless _PAM_LEGACY_NONCONST is defined. With __sun alone,
XDM_PAM_QUAL expands empty (non-const) and greet.c fails to compile under
GCC 14 with -Wincompatible-pointer-types (now a hard error):
greet.c:496: initialization of 'int (*)(int, const struct pam_message **,...)'
from incompatible pointer type 'int (*)(int, struct pam_message **,...)'
greet.c:588/613/735: passing argument 3 of 'pam_get_item' from incompatible
pointer type
Gate the non-const branch on _PAM_LEGACY_NONCONST as well, so the qualifier
matches whichever prototype form the PAM headers actually present. On
Hammerhead this selects `const`, matching the default headers; on a legacy
Solaris that defines _PAM_LEGACY_NONCONST it stays empty as before.
--- a/greeter/greet.c
+++ b/greeter/greet.c
@@ -152,9 +152,13 @@ static XtIntervalId pingTimeout;
#ifdef USE_PAM
-#ifdef __sun
-/* Solaris does not const qualify arguments to pam_get_item() or the
- PAM conversation function that Linux-PAM and others do. */
+#if defined(__sun) && defined(_PAM_LEGACY_NONCONST)
+/* Classic Solaris did not const qualify arguments to pam_get_item() or the
+ PAM conversation function that Linux-PAM and others do. Hammerhead's
+ <security/pam_appl.h> defaults to the const-qualified (non-legacy) form
+ unless _PAM_LEGACY_NONCONST is defined, and Hammerhead's GCC also defines
+ __sun, so key the qualifier on _PAM_LEGACY_NONCONST rather than on __sun
+ alone. */
# define XDM_PAM_QUAL /**/
#else
# define XDM_PAM_QUAL const
|