PUD: fix snprintf length confusion
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 Jun 2012 09:42:19 +0000 (11:42 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 Jun 2012 10:09:38 +0000 (12:09 +0200)
Noticed because the track/direction output was wrong

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/src/configuration.c
lib/pud/src/gpsConversion.c
lib/pud/wireformat-java/src/main/c/org_olsr_plugin_pud_PositionUpdate.c
lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h
lib/pud/wireformat/src/nodeIdConversion.c

index 99eba0a..968045c 100644 (file)
@@ -61,7 +61,7 @@ int setNodeIdType(const char *value, void *data __attribute__ ((unused)),
  */
 
 /** The nodeId buffer */
-static unsigned char nodeId[PUD_TX_NODEID_BUFFERSIZE + 1];
+static unsigned char nodeId[PUD_TX_NODEID_BUFFERSIZE];
 
 /** The length of the string in the nodeId buffer */
 static size_t nodeIdLength = 0;
@@ -122,9 +122,9 @@ int setNodeId(const char *value, void *data __attribute__ ((unused)), set_plugin
        assert (value != NULL);
 
        valueLength = strlen(value);
-       if (valueLength > PUD_TX_NODEID_BUFFERSIZE) {
+       if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
                pudError(false, "Value of parameter %s is too long, maximum length is"
-                       " %u, current length is %lu", PUD_NODE_ID_NAME, PUD_TX_NODEID_BUFFERSIZE,
+                       " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1),
                                (unsigned long) valueLength);
                return true;
        }
@@ -207,7 +207,7 @@ static bool intSetupNodeIdBinaryString(void) {
                return false;
        }
 
-       if (nodeidlength > PUD_TX_NODEID_BUFFERSIZE) {
+       if (nodeidlength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
                pudError(false, "Length of parameter %s (%s) is too great", PUD_NODE_ID_NAME, &nodeid[0]);
                return false;
        }
@@ -1391,7 +1391,7 @@ unsigned int checkConfig(void) {
 
        if (!nodeIdSet) {
                if (nodeIdType == PUD_NODEIDTYPE_DNS) {
-                       char name[PUD_TX_NODEID_BUFFERSIZE + 1];
+                       char name[PUD_TX_NODEID_BUFFERSIZE];
 
                        errno = 0;
                        if (gethostname(&name[0], sizeof(name)) < 0) {
@@ -1401,6 +1401,7 @@ unsigned int checkConfig(void) {
                                setNodeId(&name[0], NULL,
                                                (set_plugin_parameter_addon) {.pc = NULL});
                        }
+                       name[PUD_TX_NODEID_BUFFERSIZE - 1] = '\0';
                } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType
                                != PUD_NODEIDTYPE_IPV4) && (nodeIdType != PUD_NODEIDTYPE_IPV6)) {
                        pudError(false, "No node ID set while one is required for"
index 9167e91..5960d91 100644 (file)
@@ -37,20 +37,20 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
        unsigned long validityTime;
 
        struct tm timeStruct;
-       char latitudeString[PUD_TX_LATITUDE_DIGITS + 1];
+       char latitudeString[PUD_TX_LATITUDE_DIGITS];
        const char * latitudeHemisphere;
-       char longitudeString[PUD_TX_LONGITUDE_DIGITS + 1];
+       char longitudeString[PUD_TX_LONGITUDE_DIGITS];
        const char * longitudeHemisphere;
-       char altitudeString[PUD_TX_ALTITUDE_DIGITS + 1];
-       char speedString[PUD_TX_SPEED_DIGITS + 1];
-       char trackString[PUD_TX_TRACK_DIGITS + 1];
-       char hdopString[PUD_TX_HDOP_DIGITS + 1];
+       char altitudeString[PUD_TX_ALTITUDE_DIGITS];
+       char speedString[PUD_TX_SPEED_DIGITS];
+       char trackString[PUD_TX_TRACK_DIGITS];
+       char hdopString[PUD_TX_HDOP_DIGITS];
        uint8_t smask;
        uint8_t flags;
        char gateway[2] = { '0', '\0' };
 
-       char nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS + 1];
-       char nodeIdString[PUD_TX_NODEID_BUFFERSIZE + 1];
+       char nodeIdTypeString[PUD_TX_NODEIDTYPE_DIGITS];
+       char nodeIdString[PUD_TX_NODEID_BUFFERSIZE];
        const char * nodeId;
        const void * ipAddr;
        char originatorBuffer[64];
@@ -89,7 +89,6 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
        getPositionUpdateTime(olsrGpsMessage, time(NULL), &timeStruct);
 
        if (likely(nmea_INFO_has_field(smask, LAT))) {
-               int chars;
                double latitude = getPositionUpdateLatitude(olsrGpsMessage);
 
                if (latitude >= 0) {
@@ -100,20 +99,13 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
                }
                latitude = nmea_degree2ndeg(latitude);
 
-               chars = snprintf(&latitudeString[0], PUD_TX_LATITUDE_DIGITS,
-                               "%." PUD_TX_LATITUDE_DECIMALS "f", latitude);
-               if (likely(chars < PUD_TX_LATITUDE_DIGITS)) {
-                       latitudeString[chars] = '\0';
-               } else {
-                       latitudeString[PUD_TX_LATITUDE_DIGITS] = '\0';
-               }
+               snprintf(&latitudeString[0], PUD_TX_LATITUDE_DIGITS, "%." PUD_TX_LATITUDE_DECIMALS "f", latitude);
        } else {
                latitudeHemisphere = "";
                latitudeString[0] = '\0';
        }
 
        if (likely(nmea_INFO_has_field(smask, LON))) {
-               int chars;
                double longitude = getPositionUpdateLongitude(olsrGpsMessage);
 
                if (longitude >= 0) {
@@ -124,63 +116,33 @@ unsigned int gpsFromOlsr(union olsr_message *olsrMessage,
                }
                longitude = nmea_degree2ndeg(longitude);
 
-               chars = snprintf(&longitudeString[0], PUD_TX_LONGITUDE_DIGITS,
-                               "%." PUD_TX_LONGITUDE_DECIMALS "f", longitude);
-               if (likely(chars < PUD_TX_LONGITUDE_DIGITS)) {
-                       longitudeString[chars] = '\0';
-               } else {
-                       longitudeString[PUD_TX_LONGITUDE_DIGITS] = '\0';
-               }
+               snprintf(&longitudeString[0], PUD_TX_LONGITUDE_DIGITS, "%." PUD_TX_LONGITUDE_DECIMALS "f", longitude);
        } else {
                longitudeHemisphere = "";
                longitudeString[0] = '\0';
        }
 
        if (likely(nmea_INFO_has_field(smask, ELV))) {
-               int chars = snprintf(&altitudeString[0], PUD_TX_ALTITUDE_DIGITS, "%ld",
-                               getPositionUpdateAltitude(olsrGpsMessage));
-               if (likely(chars < PUD_TX_ALTITUDE_DIGITS)) {
-                       altitudeString[chars] = '\0';
-               } else {
-                       altitudeString[PUD_TX_ALTITUDE_DIGITS] = '\0';
-               }
+               snprintf(&altitudeString[0], PUD_TX_ALTITUDE_DIGITS, "%ld", getPositionUpdateAltitude(olsrGpsMessage));
        } else {
                altitudeString[0] = '\0';
        }
 
        if (likely(nmea_INFO_has_field(smask, SPEED))) {
-               int chars = snprintf(&speedString[0], PUD_TX_SPEED_DIGITS, "%lu",
-                               getPositionUpdateSpeed(olsrGpsMessage));
-               if (likely(chars < PUD_TX_SPEED_DIGITS)) {
-                       speedString[chars] = '\0';
-               } else {
-                       speedString[PUD_TX_SPEED_DIGITS] = '\0';
-               }
+               snprintf(&speedString[0], PUD_TX_SPEED_DIGITS, "%lu", getPositionUpdateSpeed(olsrGpsMessage));
        } else {
                speedString[0] = '\0';
        }
 
        if (likely(nmea_INFO_has_field(smask, DIRECTION))) {
-               int chars = snprintf(&trackString[0], PUD_TX_TRACK_DIGITS, "%lu",
-                               getPositionUpdateTrack(olsrGpsMessage));
-               if (likely(chars < PUD_TX_TRACK_DIGITS)) {
-                       trackString[chars] = '\0';
-               } else {
-                       trackString[PUD_TX_TRACK_DIGITS] = '\0';
-               }
+               snprintf(&trackString[0], PUD_TX_TRACK_DIGITS, "%lu", getPositionUpdateTrack(olsrGpsMessage));
        } else {
                trackString[0] = '\0';
        }
 
        if (likely(nmea_INFO_has_field(smask, HDOP))) {
-               int chars = snprintf(&hdopString[0], PUD_TX_HDOP_DIGITS,
-                               "%." PUD_TX_HDOP_DECIMALS "f", nmea_meters2dop(getPositionUpdateHdop(
-                                               olsrGpsMessage)));
-               if (likely(chars < PUD_TX_HDOP_DIGITS)) {
-                       hdopString[chars] = '\0';
-               } else {
-                       hdopString[PUD_TX_HDOP_DIGITS] = '\0';
-               }
+               snprintf(&hdopString[0], PUD_TX_HDOP_DIGITS, "%." PUD_TX_HDOP_DECIMALS "f",
+                               nmea_meters2dop(getPositionUpdateHdop(olsrGpsMessage)));
        } else {
                hdopString[0] = '\0';
        }
index c7ef901..a3cc0c0 100644 (file)
@@ -308,7 +308,7 @@ JNIEXPORT jstring JNICALL Java_org_olsr_plugin_pud_PositionUpdate_getPositionUpd
                        &isCopy);
 
     const char * nodeIdStr;
-    char nodeIdStrBuffer[PUD_TX_NODEID_BUFFERSIZE + 1];
+    char nodeIdStrBuffer[PUD_TX_NODEID_BUFFERSIZE];
 
        getNodeIdStringFromOlsr (
                        !getUplinkMessageIPv6(&uplinkMessage->header) ? AF_INET : AF_INET6,
index 12a66ba..04b6f25 100644 (file)
@@ -46,8 +46,8 @@
 #define PUD_LATITUDE_BITS                      28
 
 /** The maximum size of the string representation of the latitude
- * sign [0,90] [0,59] dot [0,59] [0,999] */
-#define PUD_TX_LATITUDE_DIGITS         (1 + 2 + 2 + 1 + 2 + 3)
+ * sign [0,90] [0,59] dot [0,59] [0,999] (including \0) */
+#define PUD_TX_LATITUDE_DIGITS         (1 + 2 + 2 + 1 + 2 + 3 + 1)
 
 /** The number of decimals of the latitude in the transmit sentence */
 #define PUD_TX_LATITUDE_DECIMALS       "5"
@@ -60,8 +60,8 @@
 #define PUD_LONGITUDE_BITS                     27
 
 /** The maximum size of the string representation of the longitude
- * sign [0,180] [0,59] dot [0,59] [0,999] */
-#define PUD_TX_LONGITUDE_DIGITS                (1 + 3 + 2 + 1 + 2 + 3)
+ * sign [0,180] [0,59] dot [0,59] [0,999] (including \0) */
+#define PUD_TX_LONGITUDE_DIGITS                (1 + 3 + 2 + 1 + 2 + 3 + 1)
 
 /** The number of decimals of the longitude in the transmit sentence */
 #define PUD_TX_LONGITUDE_DECIMALS      "5"
@@ -79,8 +79,8 @@
 /** The maximum altitude */
 #define PUD_ALTITUDE_MAX       (((1 << PUD_ALTITUDE_BITS) - 1) + PUD_ALTITUDE_MIN)
 
-/** The maximum size of the string representation of the altitude */
-#define PUD_TX_ALTITUDE_DIGITS         6
+/** The maximum size of the string representation of the altitude (including \0) */
+#define PUD_TX_ALTITUDE_DIGITS         (6 + 1)
 
 /*
  * Speed
@@ -92,8 +92,8 @@
 /** The maximum speed value */
 #define PUD_SPEED_MAX                          ((1 << PUD_SPEED_BITS) - 1)
 
-/** The maximum size of the string representation of the speed */
-#define PUD_TX_SPEED_DIGITS                    4
+/** The maximum size of the string representation of the speed (including \0) */
+#define PUD_TX_SPEED_DIGITS                    (4 + 1)
 
 /*
  * Track
 /** The number of bits for the track angle field */
 #define PUD_TRACK_BITS                         9
 
-/** The maximum size of the string representation of the track angle */
-#define PUD_TX_TRACK_DIGITS                    3
+/** The maximum size of the string representation of the track angle (including \0) */
+#define PUD_TX_TRACK_DIGITS                    (3 + 1)
 
 /*
  * HDOP
 /** The maximum HDOP value (in m) */
 #define PUD_HDOP_MAX           (((1 << PUD_HDOP_BITS) - 1) * PUD_HDOP_RESOLUTION)
 
-/** The maximum size of the string representation of the HDOP */
-#define PUD_TX_HDOP_DIGITS                     5
+/** The maximum size of the string representation of the HDOP (including \0) */
+#define PUD_TX_HDOP_DIGITS                     (5 + 1)
 
 /** The number of decimals of the HDOP in the transmit sentence */
 #define PUD_TX_HDOP_DECIMALS           "3"
@@ -223,15 +223,15 @@ typedef enum _NodeIdType {
 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV6 (sizeof(struct in6_addr)) */
 #define PUD_NODEIDTYPE_IPV6_BYTES              16
 
-/** The maximum size of the string representation of the nodeIdType */
-#define PUD_TX_NODEIDTYPE_DIGITS               3
+/** The maximum size of the string representation of the nodeIdType (including \0) */
+#define PUD_TX_NODEIDTYPE_DIGITS               (3 + 1)
 
 /*
  * Node ID
  */
 
-/** The maximum size of the string representation of the nodeId */
-#define PUD_TX_NODEID_BUFFERSIZE               1023
+/** The maximum size of the string representation of the nodeId (including \0) */
+#define PUD_TX_NODEID_BUFFERSIZE               1024
 
 /**
  The type that is used to store the nodeId as a binary representation along
@@ -244,7 +244,7 @@ typedef struct _nodeIdBinaryType {
                                unsigned char mac[PUD_NODEIDTYPE_MAC_BYTES];
                                union olsr_ip_addr ip;
                                unsigned long long longValue;
-                               unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE + 1];
+                               unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE];
                } buffer;
 } nodeIdBinaryType;
 
index a957eaf..98f3540 100644 (file)
@@ -17,7 +17,7 @@
  A pointer to the position update message.
  @param nodeIdTypeBuffer
  A pointer to the buffer in which the nodeIdType string representation is
- written (the buffer needs to be at least PUD_TX_NODEIDTYPE_DIGITS + 1 bytes).
+ written (the buffer needs to be at least PUD_TX_NODEIDTYPE_DIGITS bytes).
  When NULL then the nodeIdType string is not written.
  @param nodeIdTypeBufferSize
  The size of the nodeIdTypeBuffer. When zero then the nodeIdType string is not
 void getNodeTypeStringFromOlsr(int ipVersion,
                PudOlsrPositionUpdate * olsrGpsMessage, char * nodeIdTypeBuffer,
                int nodeIdTypeBufferSize) {
-       int chars;
-
        if (unlikely(!nodeIdTypeBuffer || (nodeIdTypeBufferSize == 0))) {
                return;
        }
 
-       assert(nodeIdTypeBufferSize >= (PUD_TX_NODEIDTYPE_DIGITS + 1));
+       assert(nodeIdTypeBufferSize >= PUD_TX_NODEIDTYPE_DIGITS);
 
        /* message has NO nodeId information */
-       chars = snprintf(&nodeIdTypeBuffer[0], nodeIdTypeBufferSize, "%u",
+       snprintf(&nodeIdTypeBuffer[0], nodeIdTypeBufferSize, "%u",
                        getPositionUpdateNodeIdType(ipVersion, olsrGpsMessage));
-       if (likely(chars < nodeIdTypeBufferSize)) {
-               nodeIdTypeBuffer[chars] = '\0';
-       } else {
-               nodeIdTypeBuffer[nodeIdTypeBufferSize] = '\0';
-       }
-
        return;
 }
 
@@ -66,7 +58,6 @@ static char *getNodeIdNumberFromOlsr(unsigned char * buffer,
                unsigned int bufferSize, char *nodeIdBuffer, socklen_t nodeIdBufferSize) {
        unsigned long long val = 0;
        unsigned int i = 0;
-       int chars;
 
        while (i < bufferSize) {
                val <<= 8;
@@ -74,12 +65,7 @@ static char *getNodeIdNumberFromOlsr(unsigned char * buffer,
                i++;
        }
 
-       chars = snprintf(nodeIdBuffer, nodeIdBufferSize, "%llu", val);
-       if (likely(chars < (int) nodeIdBufferSize)) {
-               nodeIdBuffer[chars] = '\0';
-       } else {
-               nodeIdBuffer[nodeIdBufferSize] = '\0';
-       }
+       snprintf(nodeIdBuffer, nodeIdBufferSize, "%llu", val);
        return &nodeIdBuffer[0];
 }
 
@@ -94,7 +80,7 @@ static char *getNodeIdNumberFromOlsr(unsigned char * buffer,
  @param nodeIdStr
  A pointer to a variable in which to store the pointer to the buffer in which
  the nodeId string representation is written (the buffer needs to be at least
- PUD_TX_NODEIDTYPE_DIGITS + 1 bytes). Not written to when nodeIdStrBuffer or
+ PUD_TX_NODEID_BUFFERSIZE bytes). Not written to when nodeIdStrBuffer or
  nodeIdStr is NULL or when nodeIdStrBufferSize is zero. Can point to
  nodeIdStrBuffer or straight into the olsrMessage
  @param nodeIdStrBuffer
@@ -116,7 +102,7 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
                return;
        }
 
-       assert(nodeIdStrBufferSize >= (PUD_TX_NODEID_BUFFERSIZE + 1));
+       assert(nodeIdStrBufferSize >= PUD_TX_NODEID_BUFFERSIZE);
 
        olsrGpsMessage = getOlsrMessagePayload(ipVersion, olsrMessage);
 
@@ -125,18 +111,11 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
        switch (getPositionUpdateNodeIdType(ipVersion, olsrGpsMessage)) {
        case PUD_NODEIDTYPE_MAC: /* hardware address */
        {
-               int chars;
-
                assert(nodeIdSize == 6);
 
-               chars = snprintf(nodeIdStrBuffer, nodeIdStrBufferSize,
+               snprintf(nodeIdStrBuffer, nodeIdStrBufferSize,
                                "%02x:%02x:%02x:%02x:%02x:%02x", nodeId[0], nodeId[1],
                                nodeId[2], nodeId[3], nodeId[4], nodeId[5]);
-               if (likely(chars < (int) nodeIdStrBufferSize)) {
-                       nodeIdStrBuffer[chars] = '\0';
-               } else {
-                       nodeIdStrBuffer[nodeIdStrBufferSize - 1] = '\0';
-               }
                *nodeIdStr = &nodeIdStrBuffer[0];
        }
                break;