@@ -26,7 +26,7 @@ struct export_attrs {
26
26
27
27
struct export_name {
28
28
uint8_t type ;
29
- struct relmem domain ;
29
+ struct relmem dom_or_spn ;
30
30
struct relmem name ;
31
31
struct export_attrs attrs ;
32
32
};
@@ -38,7 +38,7 @@ struct export_keys {
38
38
uint32_t seq_num ;
39
39
};
40
40
41
- #define EXPORT_CTX_VER 0x0004
41
+ #define EXPORT_CTX_VER 0x0005
42
42
struct export_ctx {
43
43
uint16_t version ;
44
44
uint8_t role ;
@@ -211,7 +211,7 @@ static int export_name(struct export_state *state,
211
211
if (name -> data .user .domain ) {
212
212
ret = export_data_buffer (state , name -> data .user .domain ,
213
213
strlen (name -> data .user .domain ),
214
- & exp_name -> domain );
214
+ & exp_name -> dom_or_spn );
215
215
if (ret ) {
216
216
return ret ;
217
217
}
@@ -227,6 +227,14 @@ static int export_name(struct export_state *state,
227
227
break ;
228
228
case GSSNTLM_NAME_SERVER :
229
229
exp_name -> type = EXP_NAME_SERV ;
230
+ if (name -> data .server .spn ) {
231
+ ret = export_data_buffer (state , name -> data .server .spn ,
232
+ strlen (name -> data .server .spn ),
233
+ & exp_name -> dom_or_spn );
234
+ if (ret ) {
235
+ return ret ;
236
+ }
237
+ }
230
238
if (name -> data .server .name ) {
231
239
ret = export_data_buffer (state , name -> data .server .name ,
232
240
strlen (name -> data .server .name ),
@@ -599,10 +607,10 @@ static uint32_t import_name(uint32_t *minor_status,
599
607
case EXP_NAME_USER :
600
608
imp_name -> type = GSSNTLM_NAME_USER ;
601
609
dest = NULL ;
602
- if (name -> domain .len > 0 ) {
610
+ if (name -> dom_or_spn .len > 0 ) {
603
611
retmaj = import_data_buffer (& retmin , state ,
604
612
& dest , NULL , true,
605
- & name -> domain , true);
613
+ & name -> dom_or_spn , true);
606
614
if (retmaj != GSS_S_COMPLETE ) goto done ;
607
615
}
608
616
imp_name -> data .user .domain = (char * )dest ;
@@ -619,6 +627,14 @@ static uint32_t import_name(uint32_t *minor_status,
619
627
case EXP_NAME_SERV :
620
628
imp_name -> type = GSSNTLM_NAME_SERVER ;
621
629
dest = NULL ;
630
+ if (name -> dom_or_spn .len > 0 ) {
631
+ retmaj = import_data_buffer (& retmin , state ,
632
+ & dest , NULL , true,
633
+ & name -> dom_or_spn , true);
634
+ if (retmaj != GSS_S_COMPLETE ) goto done ;
635
+ }
636
+ imp_name -> data .server .spn = (char * )dest ;
637
+ dest = NULL ;
622
638
if (name -> name .len > 0 ) {
623
639
retmaj = import_data_buffer (& retmin , state ,
624
640
& dest , NULL , true,
@@ -878,9 +894,11 @@ uint32_t gssntlm_import_sec_context(uint32_t *minor_status,
878
894
return GSSERR ();
879
895
}
880
896
897
+ #define EXPORT_CRED_VER 0x0002
898
+
881
899
#pragma pack(push, 1)
882
900
struct export_cred {
883
- uint16_t version ; /* 0x00 0x02 */
901
+ uint16_t version ;
884
902
uint16_t type ;
885
903
886
904
struct export_name name ; /* user or server name */
@@ -933,7 +951,7 @@ uint32_t gssntlm_export_cred(uint32_t *minor_status,
933
951
state .exp_data = (uint8_t * )& ecred .data - (uint8_t * )& ecred ;
934
952
state .exp_len = state .exp_data ;
935
953
936
- ecred .version = htole16 (1 );
954
+ ecred .version = htole16 (EXPORT_CRED_VER );
937
955
938
956
switch (cred -> type ) {
939
957
case GSSNTLM_CRED_NONE :
@@ -1052,7 +1070,7 @@ uint32_t gssntlm_import_cred(uint32_t *minor_status,
1052
1070
ecred = (struct export_cred * )state .exp_struct ;
1053
1071
state .exp_data = (char * )ecred -> data - (char * )ecred ;
1054
1072
1055
- if (ecred -> version != le16toh (1 )) {
1073
+ if (ecred -> version != le16toh (EXPORT_CRED_VER )) {
1056
1074
set_GSSERRS (ERR_BADARG , GSS_S_DEFECTIVE_TOKEN );
1057
1075
goto done ;
1058
1076
}
0 commit comments