/*--------------------------------------------------------------------------*/ int ParseUrlEntry(SLPBuffer buffer, SLPUrlEntry* urlentry) /* */ /* Returns - Zero on success, SLP_ERROR_INTERNAL_ERROR (out of memory) or */ /* SLP_ERROR_PARSE_ERROR. */ /*--------------------------------------------------------------------------*/ { int result; int i; /* make sure that min size is met */ if(buffer->end - buffer->curpos < 6) { return SLP_ERROR_PARSE_ERROR; } /* parse out reserved */ urlentry->reserved = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out lifetime */ urlentry->lifetime = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; /* parse out url */ urlentry->urllen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(urlentry->urllen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } urlentry->url = buffer->curpos; buffer->curpos = buffer->curpos + urlentry->urllen; /* parse out auth block count */ urlentry->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(urlentry->authcount) { urlentry->autharray = (SLPAuthBlock*)malloc(sizeof(SLPAuthBlock) * urlentry->authcount); if(urlentry->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(urlentry->autharray,0,sizeof(SLPAuthBlock) * urlentry->authcount); for(i=0;i<urlentry->authcount;i++) { result = ParseAuthBlock(buffer,&(urlentry->autharray[i])); if(result) return result; } } return 0; }
/*--------------------------------------------------------------------------*/ int ParseAttrRply(SLPBuffer buffer, SLPAttrRply* attrrply) /*--------------------------------------------------------------------------*/ { int result; int i; /* make sure that min size is met */ #if(defined(PARANOID) || defined(DEBUG)) if(buffer->end - buffer->curpos < 4) { return SLP_ERROR_PARSE_ERROR; } #endif /* parse out the error code */ attrrply->errorcode = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; /* parse out the attrlist */ attrrply->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; #if(defined(PARANOID) || defined(DEBUG)) if(attrrply->attrlistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } #endif attrrply->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + attrrply->attrlistlen; /* parse out auth block count */ attrrply->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(attrrply->authcount) { attrrply->autharray = (SLPAuthBlock*)malloc(sizeof(SLPAuthBlock) * attrrply->authcount); if(attrrply->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(attrrply->autharray,0,sizeof(SLPAuthBlock) * attrrply->authcount); for(i=0;i<attrrply->authcount;i++) { result = ParseAuthBlock(buffer,&(attrrply->autharray[i])); if(result) return result; } } return 0; }
/*-------------------------------------------------------------------------*/ int ParseDAAdvert(SLPBuffer buffer, SLPDAAdvert* daadvert) /*-------------------------------------------------------------------------*/ { int result; int i; /* make sure that min size is met */ if(buffer->end - buffer->curpos < 4) { return SLP_ERROR_PARSE_ERROR; } /* parse out the error code */ daadvert->errorcode = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; /* parse out the bootstamp */ daadvert->bootstamp = AsUINT32(buffer->curpos); buffer->curpos = buffer->curpos + 4; /* parse out the url */ daadvert->urllen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->urllen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->url = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->urllen; /* parse the scope list */ daadvert->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->scopelistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->scopelistlen; /* parse the attr list */ daadvert->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->attrlistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->attrlistlen; /* parse the SPI list */ daadvert->spilistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(daadvert->spilistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } daadvert->spilist = buffer->curpos; buffer->curpos = buffer->curpos + daadvert->spilistlen; /* parse out auth block count */ daadvert->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(daadvert->authcount) { daadvert->autharray = (SLPAuthBlock*)malloc(sizeof(SLPAuthBlock) * daadvert->authcount); if(daadvert->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(daadvert->autharray,0,sizeof(SLPAuthBlock) * daadvert->authcount); for(i=0;i<daadvert->authcount;i++) { result = ParseAuthBlock(buffer,&(daadvert->autharray[i])); if(result) return result; } } return 0; }
/*--------------------------------------------------------------------------*/ int ParseSrvReg(SLPBuffer buffer, SLPSrvReg* srvreg) /*--------------------------------------------------------------------------*/ { int result; int i; /* Parse out the url entry */ result = ParseUrlEntry(buffer,&(srvreg->urlentry)); if(result) { return result; } /* parse the service type */ srvreg->srvtypelen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->srvtypelen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->srvtype = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->srvtypelen; /* parse the scope list */ srvreg->scopelistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->scopelistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->scopelist = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->scopelistlen; /* parse the attribute list*/ srvreg->attrlistlen = AsUINT16(buffer->curpos); buffer->curpos = buffer->curpos + 2; if(srvreg->attrlistlen > buffer->end - buffer->curpos) { return SLP_ERROR_PARSE_ERROR; } srvreg->attrlist = buffer->curpos; buffer->curpos = buffer->curpos + srvreg->attrlistlen; /* parse out attribute auth block count */ srvreg->authcount = *(buffer->curpos); buffer->curpos = buffer->curpos + 1; /* parse out the auth block (if any) */ if(srvreg->authcount) { srvreg->autharray = (SLPAuthBlock*)malloc(sizeof(SLPAuthBlock) * srvreg->authcount); if(srvreg->autharray == 0) { return SLP_ERROR_INTERNAL_ERROR; } memset(srvreg->autharray,0,sizeof(SLPAuthBlock) * srvreg->authcount); for(i=0;i<srvreg->authcount;i++) { result = ParseAuthBlock(buffer,&(srvreg->autharray[i])); if(result) return result; } } return 0; }