diff options
Diffstat (limited to 'source3/wrepld/parser.c')
-rw-r--r-- | source3/wrepld/parser.c | 243 |
1 files changed, 89 insertions, 154 deletions
diff --git a/source3/wrepld/parser.c b/source3/wrepld/parser.c index f5b9be6727..61d8a604ce 100644 --- a/source3/wrepld/parser.c +++ b/source3/wrepld/parser.c @@ -26,23 +26,19 @@ extern TALLOC_CTX *mem_ctx; /**************************************************************************** grow the send buffer if necessary ****************************************************************************/ -BOOL grow_buffer(struct BUFFER *buffer, int more) +static BOOL grow_buffer(struct BUFFER *buffer, int more) { char *temp; DEBUG(10,("grow_buffer: size is: %d offet is:%d growing by %d\n", buffer->length, buffer->offset, more)); - /* grow by at least 256 bytes */ - if (more<256) - more=256; - if (buffer->offset+more >= buffer->length) { - temp=(char *)talloc_realloc(mem_ctx, buffer->buffer, sizeof(char)* (buffer->length+more) ); + temp=(char *)talloc_realloc(mem_ctx, buffer->buffer, sizeof(char)* (buffer->length+256) ); if (temp==NULL) { DEBUG(0,("grow_buffer: can't grow buffer\n")); return False; } - buffer->length+=more; + buffer->length+=256; buffer->buffer=temp; } @@ -50,59 +46,44 @@ BOOL grow_buffer(struct BUFFER *buffer, int more) } /**************************************************************************** -check if the buffer has that much data -****************************************************************************/ -static BOOL check_buffer(struct BUFFER *buffer, int more) -{ - DEBUG(10,("check_buffer: size is: %d offet is:%d growing by %d\n", buffer->length, buffer->offset, more)); - - if (buffer->offset+more > buffer->length) { - DEBUG(10,("check_buffer: buffer smaller than requested, size is: %d needed: %d\n", buffer->length, buffer->offset+more)); - return False; - } - - return True; -} - -/**************************************************************************** decode a WINS_OWNER struct ****************************************************************************/ -static void decode_wins_owner(struct BUFFER *inbuf, WINS_OWNER *wins_owner) +static int decode_wins_owner(char *inbuf, int offset, WINS_OWNER *wins_owner) { - if(!check_buffer(inbuf, 24)) - return; - - wins_owner->address.s_addr=IVAL(inbuf->buffer, inbuf->offset); - wins_owner->max_version=((SMB_BIG_UINT)RIVAL(inbuf->buffer, inbuf->offset+4))<<32; - wins_owner->max_version|=RIVAL(inbuf->buffer, inbuf->offset+8); - wins_owner->min_version=((SMB_BIG_UINT)RIVAL(inbuf->buffer, inbuf->offset+12))<<32; - wins_owner->min_version|=RIVAL(inbuf->buffer, inbuf->offset+16); - wins_owner->type=RIVAL(inbuf->buffer, inbuf->offset+20); - inbuf->offset+=24; - + wins_owner->address.s_addr=IVAL(inbuf, offset); + offset+=4; + wins_owner->max_version=((SMB_BIG_UINT)RIVAL(inbuf, offset))<<32; + offset+=4; + wins_owner->max_version|=RIVAL(inbuf, offset); + offset+=4; + wins_owner->min_version=((SMB_BIG_UINT)RIVAL(inbuf, offset))<<32; + offset+=4; + wins_owner->min_version|=RIVAL(inbuf, offset); + offset+=4; + wins_owner->type=RIVAL(inbuf, offset); + offset+=4; + + return offset; } /**************************************************************************** decode a WINS_NAME struct ****************************************************************************/ -static void decode_wins_name(struct BUFFER *outbuf, WINS_NAME *wins_name) +static int decode_wins_name(char *outbuf, int offset, WINS_NAME *wins_name) { char *p; int i; - if(!check_buffer(outbuf, 40)) - return; - - wins_name->name_len=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; - memcpy(wins_name->name,outbuf->buffer+outbuf->offset, 15); + wins_name->name_len=RIVAL(outbuf, offset); + offset+=4; + memcpy(wins_name->name,outbuf+offset, 15); wins_name->name[16]='\0'; if((p = strchr(wins_name->name,' ')) != NULL) *p = 0; - outbuf->offset+=15; + offset+=15; - wins_name->type=(int)outbuf->buffer[outbuf->offset++]; + wins_name->type=(int)outbuf[offset++]; /* * fix to bug in WINS replication, @@ -113,162 +94,136 @@ static void decode_wins_name(struct BUFFER *outbuf, WINS_NAME *wins_name) wins_name->type=0x1B; } - wins_name->empty=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->empty=RIVAL(outbuf, offset); + offset+=4; - wins_name->name_flag=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; - wins_name->group_flag=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; - wins_name->id=((SMB_BIG_UINT)RIVAL(outbuf->buffer, outbuf->offset))<<32; - outbuf->offset+=4; - wins_name->id|=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->name_flag=RIVAL(outbuf, offset); + offset+=4; + wins_name->group_flag=RIVAL(outbuf, offset); + offset+=4; + wins_name->id=((SMB_BIG_UINT)RIVAL(outbuf, offset))<<32; + offset+=4; + wins_name->id|=RIVAL(outbuf, offset); + offset+=4; /* special groups have multiple address */ if (wins_name->name_flag & 2) { - if(!check_buffer(outbuf, 4)) - return; - wins_name->num_ip=IVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->num_ip=IVAL(outbuf, offset); + offset+=4; } else wins_name->num_ip=1; - if(!check_buffer(outbuf, 4)) - return; - wins_name->owner.s_addr=IVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->owner.s_addr=IVAL(outbuf, offset); + offset+=4; if (wins_name->name_flag & 2) { wins_name->others=(struct in_addr *)talloc(mem_ctx, sizeof(struct in_addr)*wins_name->num_ip); if (wins_name->others==NULL) - return; + return offset; - if(!check_buffer(outbuf, 4*wins_name->num_ip)) - return; for (i=0; i<wins_name->num_ip; i++) { - wins_name->others[i].s_addr=IVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->others[i].s_addr=IVAL(outbuf, offset); + offset+=4; } } - if(!check_buffer(outbuf, 4)) - return; - wins_name->foo=RIVAL(outbuf->buffer, outbuf->offset); - outbuf->offset+=4; + wins_name->foo=RIVAL(outbuf, offset); + offset+=4; + return offset; } /**************************************************************************** decode a update notification request ****************************************************************************/ -static void decode_update_notify_request(struct BUFFER *inbuf, UPDATE_NOTIFY_REQUEST *un_rq) +static void decode_update_notify_request(char *inbuf, UPDATE_NOTIFY_REQUEST *un_rq) { int i; + int offset=4; - if(!check_buffer(inbuf, 4)) - return; - un_rq->partner_count=RIVAL(inbuf->buffer, inbuf->offset); - inbuf->offset+=4; + un_rq->partner_count=RIVAL(inbuf, 0); un_rq->wins_owner=(WINS_OWNER *)talloc(mem_ctx, un_rq->partner_count*sizeof(WINS_OWNER)); if (un_rq->wins_owner==NULL) return; for (i=0; i<un_rq->partner_count; i++) - decode_wins_owner(inbuf, &un_rq->wins_owner[i]); + offset=decode_wins_owner(inbuf, offset, &un_rq->wins_owner[i]); - if(!check_buffer(inbuf, 4)) - return; - un_rq->initiating_wins_server.s_addr=IVAL(inbuf->buffer, inbuf->offset); - inbuf->offset+=4; + un_rq->initiating_wins_server.s_addr=IVAL(inbuf, offset); } /**************************************************************************** decode a send entries request ****************************************************************************/ -static void decode_send_entries_request(struct BUFFER *inbuf, SEND_ENTRIES_REQUEST *se_rq) +static void decode_send_entries_request(char *inbuf, SEND_ENTRIES_REQUEST *se_rq) { - decode_wins_owner(inbuf, &se_rq->wins_owner); + int offset; + offset=decode_wins_owner(inbuf, 0, &se_rq->wins_owner); } /**************************************************************************** decode a send entries reply ****************************************************************************/ -static void decode_send_entries_reply(struct BUFFER *inbuf, SEND_ENTRIES_REPLY *se_rp) +static void decode_send_entries_reply(char *inbuf, SEND_ENTRIES_REPLY *se_rp) { - int i; - - if(!check_buffer(inbuf, 4)) - return; - se_rp->max_names = RIVAL(inbuf->buffer, inbuf->offset); - inbuf->offset+=4; + int i, offset=4; + se_rp->max_names = RIVAL(inbuf, 0); se_rp->wins_name=(WINS_NAME *)talloc(mem_ctx, se_rp->max_names*sizeof(WINS_NAME)); if (se_rp->wins_name==NULL) return; for (i=0; i<se_rp->max_names; i++) - decode_wins_name(inbuf, &se_rp->wins_name[i]); + offset = decode_wins_name(inbuf, offset, &se_rp->wins_name[i]); } /**************************************************************************** decode a add version number map table reply ****************************************************************************/ -static void decode_add_version_number_map_table_reply(struct BUFFER *inbuf, AVMT_REP *avmt_rep) +static void decode_add_version_number_map_table_reply(char *inbuf, AVMT_REP *avmt_rep) { int i; + int offset=4; - if(!check_buffer(inbuf, 4)) - return; - - avmt_rep->partner_count=RIVAL(inbuf->buffer, inbuf->offset); - inbuf->offset+=4; + avmt_rep->partner_count=RIVAL(inbuf, 0); avmt_rep->wins_owner=(WINS_OWNER *)talloc(mem_ctx, avmt_rep->partner_count*sizeof(WINS_OWNER)); if (avmt_rep->wins_owner==NULL) return; for (i=0; i<avmt_rep->partner_count; i++) - decode_wins_owner(inbuf, &avmt_rep->wins_owner[i]); + offset=decode_wins_owner(inbuf, offset, &avmt_rep->wins_owner[i]); - if(!check_buffer(inbuf, 4)) - return; - avmt_rep->initiating_wins_server.s_addr=IVAL(inbuf->buffer, inbuf->offset); - inbuf->offset+=4; + avmt_rep->initiating_wins_server.s_addr=IVAL(inbuf, offset); } /**************************************************************************** decode a replicate packet and fill a structure ****************************************************************************/ -static void decode_replicate(struct BUFFER *inbuf, REPLICATE *rep) +static void decode_replicate(char *inbuf, REPLICATE *rep) { - if(!check_buffer(inbuf, 4)) - return; - - rep->msg_type = RIVAL(inbuf->buffer, inbuf->offset); - - inbuf->offset+=4; + rep->msg_type = RIVAL(inbuf, 0); switch (rep->msg_type) { case 0: break; case 1: /* add version number map table reply */ - decode_add_version_number_map_table_reply(inbuf, &rep->avmt_rep); + decode_add_version_number_map_table_reply(inbuf+4, &rep->avmt_rep); break; case 2: /* send entry request */ - decode_send_entries_request(inbuf, &rep->se_rq); + decode_send_entries_request(inbuf+4, &rep->se_rq); break; case 3: /* send entry request */ - decode_send_entries_reply(inbuf, &rep->se_rp); + decode_send_entries_reply(inbuf+4, &rep->se_rp); break; case 4: /* update notification request */ - decode_update_notify_request(inbuf, &rep->un_rq); + decode_update_notify_request(inbuf+4, &rep->un_rq); break; default: DEBUG(0,("decode_replicate: unknown message type:%d\n", rep->msg_type)); @@ -279,75 +234,61 @@ static void decode_replicate(struct BUFFER *inbuf, REPLICATE *rep) /**************************************************************************** read the generic header and fill the struct. ****************************************************************************/ -static void read_generic_header(struct BUFFER *inbuf, generic_header *q) +static void read_generic_header(char *inbuf, generic_header *q) { - if(!check_buffer(inbuf, 16)) - return; - - q->data_size = RIVAL(inbuf->buffer, inbuf->offset+0); - q->opcode = RIVAL(inbuf->buffer, inbuf->offset+4); - q->assoc_ctx = RIVAL(inbuf->buffer, inbuf->offset+8); - q->mess_type = RIVAL(inbuf->buffer, inbuf->offset+12); + q->data_size = RIVAL(inbuf,0); + q->opcode = RIVAL(inbuf,4); + q->assoc_ctx = RIVAL(inbuf,8); + q->mess_type = RIVAL(inbuf,12); } /******************************************************************* decode a start association request ********************************************************************/ -static void decode_start_assoc_request(struct BUFFER *inbuf, START_ASSOC_REQUEST *q) +static void decode_start_assoc_request(char *inbuf, START_ASSOC_REQUEST *q) { - if(!check_buffer(inbuf, 8)) - return; - - q->assoc_ctx = RIVAL(inbuf->buffer, inbuf->offset+0); - q->min_ver = RSVAL(inbuf->buffer, inbuf->offset+4); - q->maj_ver = RSVAL(inbuf->buffer, inbuf->offset+6); + q->assoc_ctx = RIVAL(inbuf, 0); + q->min_ver = RSVAL(inbuf, 4); + q->maj_ver = RSVAL(inbuf, 6); } /******************************************************************* decode a start association reply ********************************************************************/ -static void decode_start_assoc_reply(struct BUFFER *inbuf, START_ASSOC_REPLY *r) +static void decode_start_assoc_reply(char *inbuf, START_ASSOC_REPLY *r) { - if(!check_buffer(inbuf, 8)) - return; - - r->assoc_ctx=RIVAL(inbuf->buffer, inbuf->offset+0); - r->min_ver = RSVAL(inbuf->buffer, inbuf->offset+4); - r->maj_ver = RSVAL(inbuf->buffer, inbuf->offset+6); + r->assoc_ctx=RIVAL(inbuf, 0); + r->min_ver = RSVAL(inbuf, 4); + r->maj_ver = RSVAL(inbuf, 6); } /******************************************************************* decode a start association reply ********************************************************************/ -static void decode_stop_assoc(struct BUFFER *inbuf, STOP_ASSOC *r) +static void decode_stop_assoc(char *inbuf, STOP_ASSOC *r) { - if(!check_buffer(inbuf, 4)) - return; - - r->reason=RIVAL(inbuf->buffer, inbuf->offset); + r->reason=RIVAL(inbuf, 0); } /**************************************************************************** decode a packet and fill a generic structure ****************************************************************************/ -void decode_generic_packet(struct BUFFER *inbuf, GENERIC_PACKET *q) +void decode_generic_packet(char *inbuf, GENERIC_PACKET *q) { read_generic_header(inbuf, &q->header); - inbuf->offset+=16; - switch (q->header.mess_type) { case 0: - decode_start_assoc_request(inbuf, &q->sa_rq); + decode_start_assoc_request(inbuf+16, &q->sa_rq); break; case 1: - decode_start_assoc_reply(inbuf, &q->sa_rp); + decode_start_assoc_reply(inbuf+16, &q->sa_rp); break; case 2: - decode_stop_assoc(inbuf, &q->so); + decode_stop_assoc(inbuf+16, &q->so); break; case 3: - decode_replicate(inbuf, &q->rep); + decode_replicate(inbuf+16, &q->rep); break; default: DEBUG(0,("decode_generic_packet: unknown message type:%d\n", q->header.mess_type)); @@ -355,9 +296,6 @@ void decode_generic_packet(struct BUFFER *inbuf, GENERIC_PACKET *q) } } -/**************************************************************************** -encode a WINS_OWNER struct -****************************************************************************/ static void encode_wins_owner(struct BUFFER *outbuf, WINS_OWNER *wins_owner) { if (!grow_buffer(outbuf, 24)) @@ -378,9 +316,6 @@ static void encode_wins_owner(struct BUFFER *outbuf, WINS_OWNER *wins_owner) } -/**************************************************************************** -encode a WINS_NAME struct -****************************************************************************/ static void encode_wins_name(struct BUFFER *outbuf, WINS_NAME *wins_name) { int i; @@ -431,7 +366,7 @@ static void encode_wins_name(struct BUFFER *outbuf, WINS_NAME *wins_name) } /**************************************************************************** -encode a update notification request +decode a update notification request ****************************************************************************/ static void encode_update_notify_request(struct BUFFER *outbuf, UPDATE_NOTIFY_REQUEST *un_rq) { @@ -529,7 +464,7 @@ static void encode_replicate(struct BUFFER *outbuf, REPLICATE *rep) encode_update_notify_request(outbuf, &rep->un_rq); break; default: - DEBUG(0,("encode_replicate: unknown message type:%d\n", rep->msg_type)); + DEBUG(0,("decode_replicate: unknown message type:%d\n", rep->msg_type)); break; } } |