{
struct spnego_state *spnego_state = (struct spnego_state *)gensec_security->private_data;
size_t expected;
- NTSTATUS status;
bool ok;
*full_in = data_blob_null;
if (spnego_state->in_needed == 0) {
size_t size = 0;
+ int ret;
/*
* try to work out the size of the full
* input token, it might be fragmented
*/
- status = asn1_peek_full_tag(in, ASN1_APPLICATION(0), &size);
- if (!NT_STATUS_IS_OK(status) &&
- !NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
- status = asn1_peek_full_tag(in, ASN1_CONTEXT(1), &size);
+ ret = asn1_peek_full_tag(in, ASN1_APPLICATION(0), &size);
+ if ((ret != 0) && (ret != EAGAIN)) {
+ ret = asn1_peek_full_tag(in, ASN1_CONTEXT(1), &size);
}
- if (NT_STATUS_IS_OK(status) ||
- NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
+ if ((ret == 0) || (ret == EAGAIN)) {
spnego_state->in_needed = size;
} else {
/*
data->length = len;
}
-NTSTATUS asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size)
+int asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size)
{
struct asn1_data asn1;
size_t size;
ok = asn1_peek_tag_needed_size(&asn1, tag, &size);
if (!ok) {
- return NT_STATUS_INVALID_BUFFER_SIZE;
+ return EMSGSIZE;
}
if (size > blob.length) {
*packet_size = size;
- return STATUS_MORE_ENTRIES;
+ return EAGAIN;
}
*packet_size = size;
- return NT_STATUS_OK;
+ return 0;
}
bool asn1_write_enumerated(struct asn1_data *data, uint8_t v);
bool asn1_blob(const struct asn1_data *asn1, DATA_BLOB *blob);
void asn1_load_nocopy(struct asn1_data *data, uint8_t *buf, size_t len);
-NTSTATUS asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size);
+int asn1_peek_full_tag(DATA_BLOB blob, uint8_t tag, size_t *packet_size);
#endif /* _ASN_1_H */
*/
NTSTATUS ldap_full_packet(void *private_data, DATA_BLOB blob, size_t *packet_size)
{
+ int ret;
+
if (blob.length < 6) {
/*
* We need at least 6 bytes to workout the length
*/
return STATUS_MORE_ENTRIES;
}
- return asn1_peek_full_tag(blob, ASN1_SEQUENCE(0), packet_size);
+
+ ret = asn1_peek_full_tag(blob, ASN1_SEQUENCE(0), packet_size);
+ if (ret != 0) {
+ return map_nt_error_from_unix_common(ret);
+ }
+ return NT_STATUS_OK;
}