* some overriding compatibility reasons not to do so.
*/
-#define KRB5_SCC_FVNO_1 0x0501 /* krb v5, scc v1 */
+#define KRB5_SCC_FVNO_1 0x0501 /* krb v5, scc v1 */
#define KRB5_SCC_FVNO_2 0x0502 /* krb v5, scc v2 */
#define KRB5_SCC_FVNO_3 0x0503 /* krb v5, scc v3 */
#define KRB5_SCC_FVNO_4 0x0504 /* krb v5, scc v4 */
data->version = (fvno_bytes[0] << 8) + fvno_bytes[1];
if ((data->version != KRB5_SCC_FVNO_1) &&
(data->version != KRB5_SCC_FVNO_2) &&
- (data->version != KRB5_SCC_FVNO_3)) {
+ (data->version != KRB5_SCC_FVNO_3) &&
+ (data->version != KRB5_SCC_FVNO_4)) {
(void) krb5_unlock_file(context, fileno(f));
(void) fclose(f);
return KRB5_CCACHE_BADVNO;
}
- }
- data->file = f;
- return 0;
+ if (data->version == KRB5_SCC_FVNO_4) {
+ char buf[1024];
+ int len;
+
+ if (!fread((char *)fvno_bytes, sizeof(fvno_bytes), 1, f)) {
+ (void) krb5_unlock_file(context, fileno(f));
+ (void) fclose(f);
+ return KRB5_CCACHE_BADVNO;
+ }
+ if (len = (fvno_bytes[0] << 8) + fvno_bytes[1]) {
+ if (!fread(buf, len, 1, f)) {
+ (void) krb5_unlock_file(context, fileno(f));
+ (void) fclose(f);
+ return KRB5_CCACHE_BADVNO;
+ }
+ }
+ }
+ }
+ data->file = f;
+ return 0;
}
keyblock->contents = 0;
kret = krb5_scc_read_ui_2(context, id, &ui2);
- keyblock->keytype = ui2;
+ keyblock->enctype = ui2;
CHECK(kret);
- if ((data->version == KRB5_SCC_FVNO_1) ||
- (data->version == KRB5_SCC_FVNO_2))
- keyblock->etype = ETYPE_UNKNOWN;
- else {
+ if (data->version == KRB5_SCC_FVNO_3) {
+ /* This works because the old etype is the same as the new enctype. */
kret = krb5_scc_read_ui_2(context, id, &ui2);
- keyblock->etype = ui2;
+ keyblock->enctype = ui2;
CHECK(kret);
}
krb5_scc_data *data = (krb5_scc_data *)id->data;
krb5_error_code ret;
- ret = krb5_scc_store_ui_2(context, id, keyblock->keytype);
+ ret = krb5_scc_store_ui_2(context, id, keyblock->enctype);
CHECK(ret);
- if ((data->version != KRB5_SCC_FVNO_1) &&
- (data->version != KRB5_SCC_FVNO_2)) {
- ret = krb5_scc_store_ui_2(context, id, keyblock->etype);
+ if (data->version == KRB5_SCC_FVNO_3) {
+ ret = krb5_scc_store_ui_2(context, id, keyblock->enctype);
CHECK(ret);
}
ret = krb5_scc_store_int32(context, id, keyblock->length);