From 4db692a8bd94b8233317a1897d74f710b4d2eb5b Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 10 Oct 2000 07:27:02 +0000 Subject: [PATCH] Added id_payload_parse_data function --- lib/silccore/silcpayload.c | 44 ++++++++++++++++++++++++++++++++++++-- lib/silccore/silcpayload.h | 2 ++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/silccore/silcpayload.c b/lib/silccore/silcpayload.c index 50c409d9..5d2cacab 100644 --- a/lib/silccore/silcpayload.c +++ b/lib/silccore/silcpayload.c @@ -36,7 +36,7 @@ struct SilcIDPayloadStruct { unsigned char *id; }; -/* Parses data and return ID payload into payload structure */ +/* Parses buffer and return ID payload into payload structure */ SilcIDPayload silc_id_payload_parse(SilcBuffer buffer) { @@ -51,10 +51,11 @@ SilcIDPayload silc_id_payload_parse(SilcBuffer buffer) SILC_STR_UI_SHORT(&new->len), SILC_STR_END); + silc_buffer_pull(buffer, 4); + if (new->len > buffer->len) goto err; - silc_buffer_pull(buffer, 4); silc_buffer_unformat(buffer, SILC_STR_UI_XNSTRING_ALLOC(&new->id, new->len), SILC_STR_END); @@ -67,6 +68,45 @@ SilcIDPayload silc_id_payload_parse(SilcBuffer buffer) return NULL; } +/* Parses data and return ID payload into payload structure. */ + +SilcIDPayload silc_id_payload_parse_data(unsigned char *data, + unsigned int len) +{ + SilcIDPayload new; + SilcBuffer buffer; + + SILC_LOG_DEBUG(("Parsing ID payload")); + + buffer = silc_buffer_alloc(len); + silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + silc_buffer_put(buffer, data, len); + + new = silc_calloc(1, sizeof(*new)); + + silc_buffer_unformat(buffer, + SILC_STR_UI_SHORT(&new->type), + SILC_STR_UI_SHORT(&new->len), + SILC_STR_END); + + silc_buffer_pull(buffer, 4); + + if (new->len > buffer->len) + goto err; + + silc_buffer_unformat(buffer, + SILC_STR_UI_XNSTRING_ALLOC(&new->id, new->len), + SILC_STR_END); + + silc_buffer_free(buffer); + return new; + + err: + silc_buffer_free(buffer); + silc_free(new); + return NULL; +} + /* Encodes ID Payload */ SilcBuffer silc_id_payload_encode(void *id, unsigned short len, diff --git a/lib/silccore/silcpayload.h b/lib/silccore/silcpayload.h index a880aca1..1517b2d8 100644 --- a/lib/silccore/silcpayload.h +++ b/lib/silccore/silcpayload.h @@ -31,6 +31,8 @@ SilcBuffer silc_id_payload_encode(void *id, unsigned short len, SilcIdType type); SilcArgumentPayload silc_argument_payload_parse(SilcBuffer buffer, unsigned int argc); +SilcIDPayload silc_id_payload_parse_data(unsigned char *data, + unsigned int len); void silc_id_payload_free(SilcIDPayload payload); SilcIdType silc_id_payload_get_type(SilcIDPayload payload); void *silc_id_payload_get_id(SilcIDPayload payload); -- 2.43.0