File openslp.truncate.diff of Package openslp.14485
--- ./slpd/slpd_incoming.c.orig 2014-02-14 14:41:40.468720908 +0000
+++ ./slpd/slpd_incoming.c 2014-02-14 14:49:02.307720126 +0000
@@ -75,6 +75,7 @@ static void IncomingDatagramRead(SLPList
socklen_t peeraddrlen = sizeof(struct sockaddr_storage);
char addr_str[INET6_ADDRSTRLEN];
sockfd_t sendsock = SLP_INVALID_SOCKET;
+ int truncate;
(void)socklist;
@@ -85,6 +86,10 @@ static void IncomingDatagramRead(SLPList
{
sock->recvbuf->end = sock->recvbuf->start + bytesread;
+ truncate = G_SlpdProperty.MTU;
+ if (G_SlpdProperty.oversizedUDP)
+ truncate = 0;
+
if (!sock->sendbuf)
/* Some of the error handling code expects a sendbuf to be available
* to be emptied, so make sure there is at least a minimal buffer
@@ -92,7 +97,7 @@ static void IncomingDatagramRead(SLPList
sock->sendbuf = SLPBufferAlloc(1);
switch (SLPDProcessMessage(&sock->peeraddr, &sock->localaddr,
- sock->recvbuf, &sock->sendbuf, 0))
+ sock->recvbuf, &sock->sendbuf, 0, truncate))
{
case SLP_ERROR_PARSE_ERROR:
case SLP_ERROR_VER_NOT_SUPPORTED:
@@ -281,7 +286,7 @@ static void IncomingStreamRead(SLPList *
*/
sock->sendbuf = SLPBufferAlloc(1);
switch (SLPDProcessMessage(&sock->peeraddr,
- &sock->localaddr, sock->recvbuf, &sock->sendbuf, 0))
+ &sock->localaddr, sock->recvbuf, &sock->sendbuf, 0, 0))
{
case SLP_ERROR_PARSE_ERROR:
case SLP_ERROR_VER_NOT_SUPPORTED:
--- ./slpd/slpd_outgoing.c.orig 2014-02-14 14:41:33.205720921 +0000
+++ ./slpd/slpd_outgoing.c 2014-02-14 14:49:31.691720074 +0000
@@ -77,7 +77,7 @@ void OutgoingDatagramRead(SLPList * sock
*/
sock->sendbuf = SLPBufferAlloc(1);
SLPDProcessMessage(&sock->peeraddr, &sock->localaddr,
- sock->recvbuf, &sock->sendbuf, &sock->sendlist);
+ sock->recvbuf, &sock->sendbuf, &sock->sendlist, 0);
/* Completely ignore the message */
@@ -267,7 +267,7 @@ void OutgoingStreamRead(SLPList * sockli
/* check to see if everything was read */
if (sock->recvbuf->curpos == sock->recvbuf->end)
switch (SLPDProcessMessage(&(sock->peeraddr), &(sock->localaddr),
- sock->recvbuf, &(sock->sendbuf), 0))
+ sock->recvbuf, &(sock->sendbuf), 0, 0))
{
case SLP_ERROR_DA_BUSY_NOW:
sock->state = STREAM_WRITE_WAIT;
--- ./slpd/slpd_process.c.orig 2014-02-14 14:31:18.532722009 +0000
+++ ./slpd/slpd_process.c 2014-02-14 14:39:14.059721168 +0000
@@ -400,7 +400,7 @@ static int ProcessDASrvRqst(SLPMessage *
* @internal
*/
static int ProcessSrvRqst(SLPMessage * message, SLPBuffer * sendbuf,
- int errorcode)
+ int errorcode, int truncate)
{
int i;
SLPUrlEntry * urlentry;
@@ -408,11 +408,6 @@ static int ProcessSrvRqst(SLPMessage * m
size_t size = 0;
SLPBuffer result = *sendbuf;
-#ifdef ENABLE_SLPv2_SECURITY
- SLPAuthBlock * authblock = 0;
- int j;
-#endif
-
/* If errorcode is set, we can not be sure that message is good
Go directly to send response code
*/
@@ -514,32 +509,26 @@ RESPOND:
{
for (i = 0; i < db->urlcount; i++)
{
+ /* check size limitation */
+ if (truncate && size > truncate)
+ break;
+
/* urlentry is the url from the db result */
urlentry = db->urlarray[i];
- size += urlentry->urllen + 6; /* 1 byte for reserved */
- /* 2 bytes for lifetime */
- /* 2 bytes for urllen */
- /* 1 byte for authcount */
-#ifdef ENABLE_SLPv2_SECURITY
- /* make room to include the authblock that was asked for */
- if (G_SlpdProperty.securityEnabled
- && message->body.srvrqst.spistrlen)
+#ifdef ENABLE_SLPv1
+ if (urlentry->opaque == 0)
{
- for (j = 0; j < urlentry->authcount; j++)
- {
- if (SLPCompareString(urlentry->autharray[j].spistrlen,
- urlentry->autharray[j].spistr,
- message->body.srvrqst.spistrlen,
- message->body.srvrqst.spistr) == 0)
- {
- authblock = &(urlentry->autharray[j]);
- size += authblock->length;
- break;
- }
- }
+ size += urlentry->urllen + 6; /* 1 byte for reserved */
+ /* 2 bytes for lifetime */
+ /* 2 bytes for urllen */
+ /* 1 byte for authcount */
}
+ else
#endif
+ {
+ size += urlentry->opaquelen;
+ }
}
}
@@ -590,6 +579,10 @@ RESPOND:
PutUINT16(&result->curpos, db->urlcount);
for (i = 0; i < db->urlcount; i++)
{
+ /* check size limitation */
+ if (truncate && result->curpos - result->start > truncate)
+ break;
+
/* urlentry is the url from the db result */
urlentry = db->urlarray[i];
@@ -1337,7 +1330,7 @@ static int ProcessSAAdvert(SLPMessage *
*/
int SLPDProcessMessage(struct sockaddr_storage * peerinfo,
struct sockaddr_storage * localaddr, SLPBuffer recvbuf,
- SLPBuffer * sendbuf, SLPList * psendlist)
+ SLPBuffer * sendbuf, SLPList * psendlist, int truncate)
{
SLPHeader header;
SLPMessage * message = 0;
@@ -1398,7 +1391,7 @@ int SLPDProcessMessage(struct sockaddr_s
switch (message->header.functionid)
{
case SLP_FUNCT_SRVRQST:
- errorcode = ProcessSrvRqst(message, sendbuf, errorcode);
+ errorcode = ProcessSrvRqst(message, sendbuf, errorcode, truncate);
break;
case SLP_FUNCT_SRVREG:
--- ./slpd/slpd_process.h.orig 2014-02-14 14:39:26.340721146 +0000
+++ ./slpd/slpd_process.h 2014-02-14 14:39:38.538721124 +0000
@@ -55,7 +55,7 @@
int CheckAndResizeBuffer(SLPBuffer * sendbuf, SLPBuffer tmp, size_t grow_size);
int SLPDProcessMessage(struct sockaddr_storage * peerinfo,
struct sockaddr_storage * localaddr, SLPBuffer recvbuf,
- SLPBuffer * sendbuf, SLPList * psendlist);
+ SLPBuffer * sendbuf, SLPList * psendlist, int truncate);
#if defined(ENABLE_SLPv1)
int SLPDv1ProcessMessage(struct sockaddr_storage * peeraddr,
--- ./slpd/slpd_property.c.orig 2014-02-14 14:39:50.229721103 +0000
+++ ./slpd/slpd_property.c 2014-02-14 14:40:54.266720990 +0000
@@ -142,6 +142,7 @@ void SLPDPropertyReinit(void)
G_SlpdProperty.securityEnabled = SLPPropertyAsBoolean("net.slp.securityEnabled");
G_SlpdProperty.checkSourceAddr = SLPPropertyAsBoolean("net.slp.checkSourceAddr");
G_SlpdProperty.DAHeartBeat = SLPPropertyAsInteger("net.slp.DAHeartBeat");
+ G_SlpdProperty.oversizedUDP = SLPPropertyAsBoolean("net.slp.oversizedUDP");
if (G_SlpdProperty.staleDACheckPeriod > 0)
{
/* Adjust the heartbeat interval if we need to send it faster for
--- ./slpd/slpd_property.h.orig 2014-02-14 14:39:55.205721095 +0000
+++ ./slpd/slpd_property.h 2014-02-14 14:41:11.378720960 +0000
@@ -116,6 +116,7 @@ typedef struct _SLPDProperty
int appendLog;
int MTU;
int useDHCP;
+ int oversizedUDP;
} SLPDProperty;
extern SLPDProperty G_SlpdProperty;