pud: remove a strlen in the DNS name handling of the wire format.
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 2 Oct 2013 13:35:19 +0000 (15:35 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 2 Oct 2013 13:44:42 +0000 (15:44 +0200)
This makes the handling of DNS names in the wire format much more robust.

This commit prepares for not having a terminating '\0' for a DNS name in
the wire format. However, since that is a breaking change, we don't
actually make that change until a later point in time at which we're
forced to break compatibility anyway.

The benefit of saving a single byte in this case is too minor to justify
breaking the compatibility.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/wireformat/src/nodeIdConversion.c
lib/pud/wireformat/src/wireFormat.c

index 98f3540..b7e6d33 100644 (file)
@@ -121,7 +121,12 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
                break;
 
        case PUD_NODEIDTYPE_DNS: /* DNS name */
-               *nodeIdStr = (char *) nodeId;
+               if (nodeIdSize >= nodeIdStrBufferSize) {
+                 nodeIdSize = nodeIdStrBufferSize - 1;
+               }
+               memcpy(nodeIdStrBuffer, nodeId, nodeIdSize);
+               nodeIdStrBuffer[nodeIdSize] = '\0';
+               *nodeIdStr = &nodeIdStrBuffer[0];
                break;
 
        case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */
index 6ae4098..0145df6 100644 (file)
@@ -715,10 +715,16 @@ void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage,
                break;
 
        case PUD_NODEIDTYPE_DNS: /* DNS name */
-               *nodeIdSize = strlen((char *) *nodeId);
-               /* FIXME for no '\0' at the end, need to scan from the end until
-                * encountering a non-zero byte: end of string address and
-                * subtract the string start address */
+         {
+           unsigned int len = 0;
+           unsigned char * idx = *nodeId;
+           unsigned char * lastPayloadByte = &((unsigned char *)olsrMessage)[getOlsrMessageSize(ipVersion, olsrMessage) - 1];
+           while ((*idx != '\0') && (idx <= lastPayloadByte)) {
+             idx++;
+             len++;
+           }
+           *nodeIdSize = len;
+         }
                break;
 
        case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */
@@ -830,6 +836,7 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
                        length = charsAvailable;
                }
 
+               // FIXME do not pad with a null byte (compatibility breaking change!)
                setPositionUpdateNodeId(olsrGpsMessage, nodeId, length, true);
        }
                break;