From 64b069369e1f84322c54f08fabe393e12a0daf48 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Sat, 11 Jun 2011 15:26:23 +0200 Subject: [PATCH] Unified2: Use local variable for header copy Due to the chaining of function call, the per-thread buffer was overwritten. This was causing invalid data to be output. This patch restores a local variable usage for the writing of the header which are rather small and thus should not be a performance and security issue. --- src/alert-unified2-alert.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/alert-unified2-alert.c b/src/alert-unified2-alert.c index 709d980dce..fed18ab9c0 100644 --- a/src/alert-unified2-alert.c +++ b/src/alert-unified2-alert.c @@ -513,26 +513,21 @@ int Unified2IPv6TypeAlert (ThreadVars *t, Packet *p, void *data, PacketQueue *pq Unified2AlertFileHeader hdr; PacketAlert *pa; int ret, len; + char head_buf[sizeof(Unified2AlertFileHeader) + sizeof(AlertIPv6Unified2)]; if (p->alerts.cnt == 0) return 0; len = (sizeof(Unified2AlertFileHeader) + sizeof(AlertIPv6Unified2)); - if (len > aun->datalen) { - SCLogError(SC_ERR_INVALID_VALUE, "len is too big for thread data: %d vs %d", - len, aun->datalen); - return -1; - } - memset(aun->data,0,aun->datalen); - memset(&hdr, 0, sizeof(Unified2AlertFileHeader)); memset(&phdr, 0, sizeof(AlertIPv6Unified2)); + memset(head_buf, 0, sizeof(head_buf)); hdr.type = htonl(UNIFIED2_IDS_EVENT_IPV6_TYPE); hdr.length = htonl(sizeof(AlertIPv6Unified2)); - memcpy(aun->data,&hdr,sizeof(Unified2AlertFileHeader)); + memcpy(head_buf, &hdr,sizeof(Unified2AlertFileHeader)); /* fill the phdr structure with the data of the packet */ @@ -601,7 +596,7 @@ int Unified2IPv6TypeAlert (ThreadVars *t, Packet *p, void *data, PacketQueue *pq phdr.classification_id = htonl(pa->s->class); phdr.priority_id = htonl(pa->s->prio); - memcpy(aun->data+sizeof(Unified2AlertFileHeader),&phdr,sizeof(AlertIPv6Unified2)); + memcpy(head_buf + sizeof(Unified2AlertFileHeader),&phdr,sizeof(AlertIPv6Unified2)); SCMutexLock(&aun->file_ctx->fp_mutex); @@ -613,7 +608,7 @@ int Unified2IPv6TypeAlert (ThreadVars *t, Packet *p, void *data, PacketQueue *pq } } - ret = fwrite(aun->data,len, 1, aun->file_ctx->fp); + ret = fwrite(head_buf,len, 1, aun->file_ctx->fp); if (ret != 1) { SCLogError(SC_ERR_FWRITE, "Error: fwrite failed: %s", strerror(errno)); SCMutexUnlock(&aun->file_ctx->fp_mutex); @@ -652,26 +647,21 @@ int Unified2IPv4TypeAlert (ThreadVars *tv, Packet *p, void *data, PacketQueue *p Unified2AlertFileHeader hdr; PacketAlert *pa; int ret, len; + char head_buf[sizeof(Unified2AlertFileHeader) + sizeof(AlertIPv4Unified2)]; if (p->alerts.cnt == 0) return 0; len = (sizeof(Unified2AlertFileHeader) + sizeof(AlertIPv4Unified2)); - if (len > aun->datalen) { - SCLogError(SC_ERR_INVALID_VALUE, "len is too big for thread data: %d vs %d", - len, aun->datalen); - return -1; - } - memset(aun->data,0,aun->datalen); - memset(&hdr, 0, sizeof(Unified2AlertFileHeader)); memset(&phdr, 0, sizeof(AlertIPv4Unified2)); + memset(head_buf, 0, sizeof(head_buf)); hdr.type = htonl(UNIFIED2_IDS_EVENT_TYPE); hdr.length = htonl(sizeof(AlertIPv4Unified2)); - memcpy(aun->data,&hdr,sizeof(Unified2AlertFileHeader)); + memcpy(head_buf,&hdr,sizeof(Unified2AlertFileHeader)); /* fill the hdr structure with the packet data */ phdr.sensor_id = 0; @@ -728,7 +718,7 @@ int Unified2IPv4TypeAlert (ThreadVars *tv, Packet *p, void *data, PacketQueue *p phdr.classification_id = htonl(pa->s->class); phdr.priority_id = htonl(pa->s->prio); - memcpy(aun->data+sizeof(Unified2AlertFileHeader),&phdr,sizeof(AlertIPv4Unified2)); + memcpy(head_buf + sizeof(Unified2AlertFileHeader),&phdr,sizeof(AlertIPv4Unified2)); /* check and enforce the filesize limit */ SCMutexLock(&aun->file_ctx->fp_mutex); @@ -741,7 +731,7 @@ int Unified2IPv4TypeAlert (ThreadVars *tv, Packet *p, void *data, PacketQueue *p } } - ret = fwrite(aun->data,len, 1, aun->file_ctx->fp); + ret = fwrite(head_buf,len, 1, aun->file_ctx->fp); if (ret != 1) { SCLogError(SC_ERR_FWRITE, "Error: fwrite failed: %s", strerror(errno)); SCMutexUnlock(&aun->file_ctx->fp_mutex);