~ubuntu-branches/ubuntu/maverick/krb5/maverick

« back to all changes in this revision

Viewing changes to src/lib/krb5/krb/srv_rcache.c

  • Committer: Bazaar Package Importer
  • Author(s): Sam Hartman
  • Date: 2009-05-07 16:16:34 UTC
  • mfrom: (13.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20090507161634-xqyk0s9na0le4flj
Tags: 1.7dfsg~beta1-4
When  decrypting the TGS response fails with the subkey, try with the
session key to work around Heimdal bug, Closes: #527353 

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
{
40
40
    krb5_rcache rcache = 0;
41
41
    char *cachename = 0, *cachetype;
42
 
    char tmp[4];
43
42
    krb5_error_code retval;
44
 
    int p, i;
45
 
    unsigned int len;
46
 
 
 
43
    unsigned int i;
 
44
    struct k5buf buf;
47
45
#ifdef HAVE_GETEUID
48
 
    unsigned long tens;
49
46
    unsigned long uid = geteuid();
50
47
#endif
51
48
    
54
51
    
55
52
    cachetype = krb5_rc_default_type(context);
56
53
 
57
 
    len = piece->length + 3 + 1;
 
54
    krb5int_buf_init_dynamic(&buf);
 
55
    krb5int_buf_add(&buf, cachetype);
 
56
    krb5int_buf_add(&buf, ":");
58
57
    for (i = 0; i < piece->length; i++) {
59
58
        if (piece->data[i] == '-')
60
 
            len++;
 
59
            krb5int_buf_add(&buf, "--");
61
60
        else if (!isvalidrcname((int) piece->data[i]))
62
 
            len += 3;
63
 
    }
64
 
 
65
 
#ifdef HAVE_GETEUID
66
 
    len += 2;   /* _<uid> */
67
 
    for (tens = 1; (uid / tens) > 9 ; tens *= 10)
68
 
        len++;
69
 
#endif
70
 
    
71
 
    cachename = malloc(strlen(cachetype) + 5 + len);
72
 
    if (!cachename) {
73
 
        retval = ENOMEM;
74
 
        goto cleanup;
75
 
    }
76
 
    strcpy(cachename, cachetype);
77
 
 
78
 
    p = strlen(cachename);
79
 
    cachename[p++] = ':';
80
 
    for (i = 0; i < piece->length; i++) {
81
 
        if (piece->data[i] == '-') {
82
 
            cachename[p++] = '-';
83
 
            cachename[p++] = '-';
84
 
            continue;
85
 
        }
86
 
        if (!isvalidrcname((int) piece->data[i])) {
87
 
            sprintf(tmp, "%03o", piece->data[i]);
88
 
            cachename[p++] = '-';
89
 
            cachename[p++] = tmp[0];
90
 
            cachename[p++] = tmp[1];
91
 
            cachename[p++] = tmp[2];
92
 
            continue;
93
 
        }
94
 
        cachename[p++] = piece->data[i];
95
 
    }
96
 
 
97
 
#ifdef HAVE_GETEUID
98
 
    cachename[p++] = '_';
99
 
    while (tens) {
100
 
        cachename[p++] = '0' + ((uid / tens) % 10);
101
 
        tens /= 10;
102
 
    }
103
 
#endif
104
 
 
105
 
    cachename[p++] = '\0';
 
61
            krb5int_buf_add_fmt(&buf, "-%03o", piece->data[i]);
 
62
        else
 
63
            krb5int_buf_add_len(&buf, &piece->data[i], 1);
 
64
    }
 
65
#ifdef HAVE_GETEUID
 
66
    krb5int_buf_add_fmt(&buf, "_%lu", uid);
 
67
#endif
 
68
 
 
69
    cachename = krb5int_buf_data(&buf);
 
70
    if (cachename == NULL)
 
71
        return ENOMEM;
106
72
 
107
73
    retval = krb5_rc_resolve_full(context, &rcache, cachename);
108
 
    if (retval) {
109
 
        rcache = 0;
 
74
    if (retval)
110
75
        goto cleanup;
111
 
    }
112
76
 
113
 
    /*
114
 
     * First try to recover the replay cache; if that doesn't work,
115
 
     * initialize it.
116
 
     */
117
 
    retval = krb5_rc_recover_or_initialize(context, rcache, context->clockskew);
118
 
    if (retval) {
119
 
        krb5_rc_close(context, rcache);
120
 
        rcache = 0;
 
77
    retval = krb5_rc_recover_or_initialize(context, rcache,
 
78
                                           context->clockskew);
 
79
    if (retval)
121
80
        goto cleanup;
122
 
    }
123
81
 
124
82
    *rcptr = rcache;
125
83
    rcache = 0;
127
85
 
128
86
cleanup:
129
87
    if (rcache)
130
 
        krb5_xfree(rcache);
 
88
        krb5_rc_close(context, rcache);
131
89
    if (cachename)
132
 
        krb5_xfree(cachename);
 
90
        free(cachename);
133
91
    return retval;
134
92
}