@@ -136,6 +136,40 @@ bool gpp_creds_are_equal(gssx_cred *a, gssx_cred *b)
136
136
return true;
137
137
}
138
138
139
+ static krb5_error_code gpp_construct_cred (gssx_cred * creds , krb5_context ctx ,
140
+ krb5_creds * cred , char * cred_name )
141
+ {
142
+ XDR xdrctx ;
143
+ bool xdrok ;
144
+ krb5_error_code ret = 0 ;
145
+
146
+ memset (cred , 0 , sizeof (* cred ));
147
+
148
+ memcpy (cred_name , creds -> desired_name .display_name .octet_string_val ,
149
+ creds -> desired_name .display_name .octet_string_len );
150
+ cred_name [creds -> desired_name .display_name .octet_string_len ] = '\0' ;
151
+
152
+ ret = krb5_parse_name (ctx , cred_name , & cred -> client );
153
+ if (ret ) {
154
+ return ret ;
155
+ }
156
+
157
+ ret = krb5_parse_name (ctx , GPKRB_SRV_NAME , & cred -> server );
158
+ if (ret ) {
159
+ return ret ;
160
+ }
161
+
162
+ cred -> ticket .data = malloc (GPKRB_MAX_CRED_SIZE );
163
+ xdrmem_create (& xdrctx , cred -> ticket .data , GPKRB_MAX_CRED_SIZE ,
164
+ XDR_ENCODE );
165
+ xdrok = xdr_gssx_cred (& xdrctx , creds );
166
+ if (!xdrok ) {
167
+ return ENOSPC ;
168
+ }
169
+ cred -> ticket .length = xdr_getpos (& xdrctx );
170
+ return 0 ;
171
+ }
172
+
139
173
uint32_t gpp_store_remote_creds (uint32_t * min , bool default_creds ,
140
174
gss_const_key_value_set_t cred_store ,
141
175
gssx_cred * creds )
@@ -145,17 +179,18 @@ uint32_t gpp_store_remote_creds(uint32_t *min, bool default_creds,
145
179
krb5_creds cred ;
146
180
krb5_error_code ret ;
147
181
char cred_name [creds -> desired_name .display_name .octet_string_len + 1 ];
148
- XDR xdrctx ;
149
- bool xdrok ;
150
182
const char * cc_type ;
151
183
152
184
* min = 0 ;
153
185
154
- memset (& cred , 0 , sizeof (cred ));
155
-
156
186
ret = krb5_init_context (& ctx );
157
187
if (ret ) goto done ;
158
188
189
+ ret = gpp_construct_cred (creds , ctx , & cred , cred_name );
190
+ if (ret ) {
191
+ goto done ;
192
+ }
193
+
159
194
if (cred_store ) {
160
195
for (unsigned i = 0 ; i < cred_store -> count ; i ++ ) {
161
196
if (strcmp (cred_store -> elements [i ].key , "ccache" ) == 0 ) {
@@ -175,25 +210,6 @@ uint32_t gpp_store_remote_creds(uint32_t *min, bool default_creds,
175
210
if (ret ) goto done ;
176
211
}
177
212
178
- memcpy (cred_name , creds -> desired_name .display_name .octet_string_val ,
179
- creds -> desired_name .display_name .octet_string_len );
180
- cred_name [creds -> desired_name .display_name .octet_string_len ] = '\0' ;
181
-
182
- ret = krb5_parse_name (ctx , cred_name , & cred .client );
183
- if (ret ) goto done ;
184
-
185
- ret = krb5_parse_name (ctx , GPKRB_SRV_NAME , & cred .server );
186
- if (ret ) goto done ;
187
-
188
- cred .ticket .data = malloc (GPKRB_MAX_CRED_SIZE );
189
- xdrmem_create (& xdrctx , cred .ticket .data , GPKRB_MAX_CRED_SIZE , XDR_ENCODE );
190
- xdrok = xdr_gssx_cred (& xdrctx , creds );
191
- if (!xdrok ) {
192
- ret = ENOSPC ;
193
- goto done ;
194
- }
195
- cred .ticket .length = xdr_getpos (& xdrctx );
196
-
197
213
cc_type = krb5_cc_get_type (ctx , ccache );
198
214
if (strcmp (cc_type , "FILE" ) == 0 ) {
199
215
/* FILE ccaches don't handle updates properly: if they have the same
0 commit comments