avoid the malloc loop and just allocate the propper amount of data

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13684 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2004-04-05 13:34:32 +00:00
parent c5ba446dab
commit 23e937a42a
2 changed files with 80 additions and 104 deletions

View File

@@ -744,8 +744,7 @@ spnego_reply
} else { } else {
MechTypeList mechlist; MechTypeList mechlist;
MechType m0; MechType m0;
char mechtypelist_buf[256]; size_t buf_len;
size_t mechtypelist_sz;
gss_buffer_desc mic_buf, mech_buf; gss_buffer_desc mic_buf, mech_buf;
mechlist.len = 1; mechlist.len = 1;
@@ -761,26 +760,23 @@ spnego_reply
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
ret = encode_MechTypeList(mechtypelist_buf ASN1_MALLOC_ENCODE(MechTypeList, mech_buf.value, mech_buf.length,
+ sizeof(mechtypelist_buf) - 1, &mechlist, &buf_len, ret);
sizeof(mechtypelist_buf),
&mechlist, &mechtypelist_sz);
if (ret) { if (ret) {
free_NegTokenTarg(&targ); free_NegTokenTarg(&targ);
free_oid(&m0); free_oid(&m0);
*minor_status = ENOMEM; *minor_status = ENOMEM;
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
if (mech_buf.length != buf_len)
mech_buf.length = mechtypelist_sz; abort();
mech_buf.value = mechtypelist_buf
+ sizeof(mechtypelist_buf) - mechtypelist_sz;
mic_buf.length = targ.mechListMIC->length; mic_buf.length = targ.mechListMIC->length;
mic_buf.value = targ.mechListMIC->data; mic_buf.value = targ.mechListMIC->data;
ret = gss_verify_mic(minor_status, *context_handle, ret = gss_verify_mic(minor_status, *context_handle,
&mech_buf, &mic_buf, NULL); &mech_buf, &mic_buf, NULL);
free(mech_buf.value);
free_oid(&m0); free_oid(&m0);
} }
free_NegTokenTarg(&targ); free_NegTokenTarg(&targ);
@@ -811,6 +807,9 @@ spnego_initial
u_char *buf; u_char *buf;
size_t buf_size, buf_len; size_t buf_size, buf_len;
krb5_data data; krb5_data data;
#if 1
size_t ni_len;
#endif
memset (&ni, 0, sizeof(ni)); memset (&ni, 0, sizeof(ni));
@@ -905,12 +904,13 @@ spnego_initial
ASN1_MALLOC_ENCODE(NegotiationToken, buf, buf_size, ASN1_MALLOC_ENCODE(NegotiationToken, buf, buf_size,
&nt, &buf_len, ret); &nt, &buf_len, ret);
if (buf_size != buf_len)
data.data = buf; abort();
data.length = buf_len;
} }
#else #else
buf_size = 1024; ni_len = length_NegTokenInit(&ni);
buf_size = 1 + length_len(ni_len) + ni_len;
buf = malloc(buf_size); buf = malloc(buf_size);
if (buf == NULL) { if (buf == NULL) {
free_NegTokenInit(&ni); free_NegTokenInit(&ni);
@@ -918,48 +918,36 @@ spnego_initial
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
do { ret = encode_NegTokenInit(buf + buf_size - 1,
ret = encode_NegTokenInit(buf + buf_size -1, ni_len,
buf_size, &ni, &buf_len);
&ni, &buf_len); if (ret == 0 && ni_len != buf_len)
if (ret == 0) { abort();
size_t tmp;
ret = der_put_length_and_tag(buf + buf_size - buf_len - 1, if (ret == 0) {
buf_size - buf_len, size_t tmp;
buf_len,
CONTEXT,
CONS,
0,
&tmp);
if (ret == 0)
buf_len += tmp;
}
if (ret) {
if (ret == ASN1_OVERFLOW) {
u_char *tmp;
buf_size *= 2; ret = der_put_length_and_tag(buf + buf_size - buf_len - 1,
tmp = realloc (buf, buf_size); buf_size - buf_len,
if (tmp == NULL) { buf_len,
*minor_status = ENOMEM; CONTEXT,
free(buf); CONS,
free_NegTokenInit(&ni); 0,
return GSS_S_FAILURE; &tmp);
} if (ret == 0 && tmp + buf_len != buf_size)
buf = tmp; abort();
} else { }
*minor_status = ret; if (ret) {
free(buf); *minor_status = ret;
free_NegTokenInit(&ni); free(buf);
return GSS_S_FAILURE; free_NegTokenInit(&ni);
} return GSS_S_FAILURE;
} }
} while (ret == ASN1_OVERFLOW);
data.data = buf + buf_size - buf_len;
data.length = buf_len;
#endif #endif
data.data = buf;
data.length = buf_size;
free_NegTokenInit(&ni); free_NegTokenInit(&ni);
if (ret) if (ret)
return ret; return ret;

View File

@@ -744,8 +744,7 @@ spnego_reply
} else { } else {
MechTypeList mechlist; MechTypeList mechlist;
MechType m0; MechType m0;
char mechtypelist_buf[256]; size_t buf_len;
size_t mechtypelist_sz;
gss_buffer_desc mic_buf, mech_buf; gss_buffer_desc mic_buf, mech_buf;
mechlist.len = 1; mechlist.len = 1;
@@ -761,26 +760,23 @@ spnego_reply
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
ret = encode_MechTypeList(mechtypelist_buf ASN1_MALLOC_ENCODE(MechTypeList, mech_buf.value, mech_buf.length,
+ sizeof(mechtypelist_buf) - 1, &mechlist, &buf_len, ret);
sizeof(mechtypelist_buf),
&mechlist, &mechtypelist_sz);
if (ret) { if (ret) {
free_NegTokenTarg(&targ); free_NegTokenTarg(&targ);
free_oid(&m0); free_oid(&m0);
*minor_status = ENOMEM; *minor_status = ENOMEM;
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
if (mech_buf.length != buf_len)
mech_buf.length = mechtypelist_sz; abort();
mech_buf.value = mechtypelist_buf
+ sizeof(mechtypelist_buf) - mechtypelist_sz;
mic_buf.length = targ.mechListMIC->length; mic_buf.length = targ.mechListMIC->length;
mic_buf.value = targ.mechListMIC->data; mic_buf.value = targ.mechListMIC->data;
ret = gss_verify_mic(minor_status, *context_handle, ret = gss_verify_mic(minor_status, *context_handle,
&mech_buf, &mic_buf, NULL); &mech_buf, &mic_buf, NULL);
free(mech_buf.value);
free_oid(&m0); free_oid(&m0);
} }
free_NegTokenTarg(&targ); free_NegTokenTarg(&targ);
@@ -811,6 +807,9 @@ spnego_initial
u_char *buf; u_char *buf;
size_t buf_size, buf_len; size_t buf_size, buf_len;
krb5_data data; krb5_data data;
#if 1
size_t ni_len;
#endif
memset (&ni, 0, sizeof(ni)); memset (&ni, 0, sizeof(ni));
@@ -905,12 +904,13 @@ spnego_initial
ASN1_MALLOC_ENCODE(NegotiationToken, buf, buf_size, ASN1_MALLOC_ENCODE(NegotiationToken, buf, buf_size,
&nt, &buf_len, ret); &nt, &buf_len, ret);
if (buf_size != buf_len)
data.data = buf; abort();
data.length = buf_len;
} }
#else #else
buf_size = 1024; ni_len = length_NegTokenInit(&ni);
buf_size = 1 + length_len(ni_len) + ni_len;
buf = malloc(buf_size); buf = malloc(buf_size);
if (buf == NULL) { if (buf == NULL) {
free_NegTokenInit(&ni); free_NegTokenInit(&ni);
@@ -918,48 +918,36 @@ spnego_initial
return GSS_S_FAILURE; return GSS_S_FAILURE;
} }
do { ret = encode_NegTokenInit(buf + buf_size - 1,
ret = encode_NegTokenInit(buf + buf_size -1, ni_len,
buf_size, &ni, &buf_len);
&ni, &buf_len); if (ret == 0 && ni_len != buf_len)
if (ret == 0) { abort();
size_t tmp;
ret = der_put_length_and_tag(buf + buf_size - buf_len - 1, if (ret == 0) {
buf_size - buf_len, size_t tmp;
buf_len,
CONTEXT,
CONS,
0,
&tmp);
if (ret == 0)
buf_len += tmp;
}
if (ret) {
if (ret == ASN1_OVERFLOW) {
u_char *tmp;
buf_size *= 2; ret = der_put_length_and_tag(buf + buf_size - buf_len - 1,
tmp = realloc (buf, buf_size); buf_size - buf_len,
if (tmp == NULL) { buf_len,
*minor_status = ENOMEM; CONTEXT,
free(buf); CONS,
free_NegTokenInit(&ni); 0,
return GSS_S_FAILURE; &tmp);
} if (ret == 0 && tmp + buf_len != buf_size)
buf = tmp; abort();
} else { }
*minor_status = ret; if (ret) {
free(buf); *minor_status = ret;
free_NegTokenInit(&ni); free(buf);
return GSS_S_FAILURE; free_NegTokenInit(&ni);
} return GSS_S_FAILURE;
} }
} while (ret == ASN1_OVERFLOW);
data.data = buf + buf_size - buf_len;
data.length = buf_len;
#endif #endif
data.data = buf;
data.length = buf_size;
free_NegTokenInit(&ni); free_NegTokenInit(&ni);
if (ret) if (ret)
return ret; return ret;