Changeset 481 for trunk/src/sh_static.c


Ignore:
Timestamp:
Jul 18, 2015, 5:06:52 PM (6 years ago)
Author:
katerina
Message:

Enhancements and fixes for tickets #374, #375, #376, #377, #378, and #379.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_static.c

    r473 r481  
    999999                return -1;
    10001000
    1001         while ((l = data[offset++])) {
     1001        while ((l = data[offset])) {
     1002
     1003                if (offset < INT_MAX)
     1004                        offset++;
     1005                else
     1006                        return -1;
    10021007
    10031008                if ((l & 0xc0) == (0xc0)) {
    1004                         offset++;
     1009                        if (offset < INT_MAX)
     1010                          offset++;
     1011                        else
     1012                          return -1;
    10051013                        break;
    10061014                }
    10071015
    1008                 offset += l;
     1016                if (offset <= (INT_MAX - l))
     1017                  offset += l;
     1018                else
     1019                  return -1;
    10091020        }
    10101021
     
    10191030        if (i < 0)
    10201031                return i;
    1021 
    1022         return i + 4;
     1032        if (i < (INT_MAX - 4))
     1033          return i + 4;
     1034        else
     1035          return -1;
    10231036}
    10241037
     
    10361049        if (!data)
    10371050                return -1;
    1038 
    1039         while ((l=data[offset++])) {
    1040                 if (measure)
     1051        while ((l=data[offset])) {
     1052                if (offset < INT_MAX) offset++;
     1053                else return -1;
     1054                if (measure && (total < INT_MAX))
    10411055                    total++;
    10421056                if ((l & 0xc0) == (0xc0)) {
    1043                         if (measure)
     1057                        if (measure && (total < INT_MAX))
    10441058                                total++;
    1045                         /* compressed item, redirect */
     1059                        /* compressed item, redirect */
    10461060                        offset = ((l & 0x3f) << 8) | data[offset];
     1061                        if (offset < 0)
     1062                          return -1;
    10471063                        measure = 0;
    10481064                        continue;
    10491065                }
     1066               
     1067                if (used >= (INT_MAX - l))
     1068                  return -1;
    10501069
    10511070                if ((used + l + 1) >= maxlen)
    1052                         return -1;
     1071                  return -1;
    10531072
    10541073                memcpy(dest + used, data + offset, l);
    1055                 offset += l;
    1056                 used += l;
    1057                 if (measure)
     1074               
     1075                if (offset <= (INT_MAX - l))
     1076                  offset += l;
     1077                else
     1078                  return -1;
     1079
     1080                if (used <= (INT_MAX - l))
     1081                  used += l;
     1082                else
     1083                  return -1;
     1084                if (measure && (total <= (INT_MAX - l)))
    10581085                        total += l;
    10591086
     1087                if (used == INT_MAX)
     1088                  return -1;
    10601089                if (data[offset] != 0)
    10611090                        dest[used++] = '.';
     
    10651094
    10661095        /* The null byte must be counted too */
    1067         if (measure) {
     1096        if (measure && (total < INT_MAX)) {
    10681097            total++;
    10691098        }
     
    10781107{
    10791108        char temp[256];
    1080         int i;
     1109        int i = 0;
    10811110
    10821111        i = __decode_dotted(message, offset, temp, sizeof(temp));
     
    10841113                return i;
    10851114
    1086         message += offset + i;
     1115        if (offset <= (INT_MAX - i))
     1116          message += offset + i;
     1117        else
     1118          return -1;
    10871119
    10881120        a->dotted = strdup(temp);
     
    11011133        DPRINTF("i=%d,rdlength=%d\n", i, a->rdlength);
    11021134
    1103         return i + RRFIXEDSZ + a->rdlength;
     1135        if (RRFIXEDSZ <= (INT_MAX - i))
     1136          i += RRFIXEDSZ;
     1137        else
     1138          return -1;
     1139        if (a->rdlength <= (INT_MAX - i))
     1140          return i + a->rdlength;
     1141        else
     1142          return -1;
    11041143}
    11051144
     
    11481187
    11491188        dest += i;
     1189        if (maxlen < i)
     1190          return -1;
    11501191        maxlen -= i;
    11511192
     
    11581199        dest[3] = (q->qclass & 0x00ff) >> 0;
    11591200
    1160         return i + 4;
     1201        if (i <= (INT_MAX - 4))
     1202          return i + 4;
     1203        else
     1204          return -1;
    11611205}
    11621206
Note: See TracChangeset for help on using the changeset viewer.