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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user