Hi Zhouyi, [auto build test ERROR on nf-next/master] [also build test ERROR on v4.5-rc1 next-20160127] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Zhouyi-Zhou/netfilter-h323-avoid-potential-attack/20160127-225253 base: https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next master config: x86_64-randconfig-x016-01270835 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): net/netfilter/nf_conntrack_h323_main.c: In function 'get_h245_addr': >> net/netfilter/nf_conntrack_h323_main.c:114:11: error: invalid operands to binary - (have 'const unsigned char *' and 'char *') if (((p - h323_buffer) + n) > 65536) \ ^ >> net/netfilter/nf_conntrack_h323_main.c:254:2: note: in expansion of macro 'CHECK_BOUND' CHECK_BOUND(p, len); ^ net/netfilter/nf_conntrack_h323_main.c: In function 'get_h225_addr': >> net/netfilter/nf_conntrack_h323_main.c:114:11: error: invalid operands to binary - (have 'const unsigned char *' and 'char *') if (((p - h323_buffer) + n) > 65536) \ ^ net/netfilter/nf_conntrack_h323_main.c:678:2: note: in expansion of macro 'CHECK_BOUND' CHECK_BOUND(p, len); ^ vim +114 net/netfilter/nf_conntrack_h323_main.c 108 __be16 port, struct nf_conntrack_expect *exp) 109 __read_mostly; 110 111 static DEFINE_SPINLOCK(nf_h323_lock); 112 static char *h323_buffer; 113 #define CHECK_BOUND(p, n) do { \ > 114 if (((p - h323_buffer) + n) > 65536) \ 115 return 0; \ 116 } while (0) 117 118 static struct nf_conntrack_helper nf_conntrack_helper_h245; 119 static struct nf_conntrack_helper nf_conntrack_helper_q931[]; 120 static struct nf_conntrack_helper nf_conntrack_helper_ras[]; 121 122 /****************************************************************************/ 123 static int get_tpkt_data(struct sk_buff *skb, unsigned int protoff, 124 struct nf_conn *ct, enum ip_conntrack_info ctinfo, 125 unsigned char **data, int *datalen, int *dataoff) 126 { 127 struct nf_ct_h323_master *info = nfct_help_data(ct); 128 int dir = CTINFO2DIR(ctinfo); 129 const struct tcphdr *th; 130 struct tcphdr _tcph; 131 int tcpdatalen; 132 int tcpdataoff; 133 unsigned char *tpkt; 134 int tpktlen; 135 int tpktoff; 136 137 /* Get TCP header */ 138 th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph); 139 if (th == NULL) 140 return 0; 141 142 /* Get TCP data offset */ 143 tcpdataoff = protoff + th->doff * 4; 144 145 /* Get TCP data length */ 146 tcpdatalen = skb->len - tcpdataoff; 147 if (tcpdatalen <= 0) /* No TCP data */ 148 goto clear_out; 149 150 if (*data == NULL) { /* first TPKT */ 151 /* Get first TPKT pointer */ 152 tpkt = skb_header_pointer(skb, tcpdataoff, tcpdatalen, 153 h323_buffer); 154 BUG_ON(tpkt == NULL); 155 156 /* Validate TPKT identifier */ 157 if (tcpdatalen < 4 || tpkt[0] != 0x03 || tpkt[1] != 0) { 158 /* Netmeeting sends TPKT header and data separately */ 159 if (info->tpkt_len[dir] > 0) { 160 pr_debug("nf_ct_h323: previous packet " 161 "indicated separate TPKT data of %hu " 162 "bytes\n", info->tpkt_len[dir]); 163 if (info->tpkt_len[dir] <= tcpdatalen) { 164 /* Yes, there was a TPKT header 165 * received */ 166 *data = tpkt; 167 *datalen = info->tpkt_len[dir]; 168 *dataoff = 0; 169 goto out; 170 } 171 172 /* Fragmented TPKT */ 173 pr_debug("nf_ct_h323: fragmented TPKT\n"); 174 goto clear_out; 175 } 176 177 /* It is not even a TPKT */ 178 return 0; 179 } 180 tpktoff = 0; 181 } else { /* Next TPKT */ 182 tpktoff = *dataoff + *datalen; 183 tcpdatalen -= tpktoff; 184 if (tcpdatalen <= 4) /* No more TPKT */ 185 goto clear_out; 186 tpkt = *data + *datalen; 187 188 /* Validate TPKT identifier */ 189 if (tpkt[0] != 0x03 || tpkt[1] != 0) 190 goto clear_out; 191 } 192 193 /* Validate TPKT length */ 194 tpktlen = tpkt[2] * 256 + tpkt[3]; 195 if (tpktlen < 4) 196 goto clear_out; 197 if (tpktlen > tcpdatalen) { 198 if (tcpdatalen == 4) { /* Separate TPKT header */ 199 /* Netmeeting sends TPKT header and data separately */ 200 pr_debug("nf_ct_h323: separate TPKT header indicates " 201 "there will be TPKT data of %hu bytes\n", 202 tpktlen - 4); 203 info->tpkt_len[dir] = tpktlen - 4; 204 return 0; 205 } 206 207 pr_debug("nf_ct_h323: incomplete TPKT (fragmented?)\n"); 208 goto clear_out; 209 } 210 211 /* This is the encapsulated data */ 212 *data = tpkt + 4; 213 *datalen = tpktlen - 4; 214 *dataoff = tpktoff + 4; 215 216 out: 217 /* Clear TPKT length */ 218 info->tpkt_len[dir] = 0; 219 return 1; 220 221 clear_out: 222 info->tpkt_len[dir] = 0; 223 return 0; 224 } 225 226 /****************************************************************************/ 227 static int get_h245_addr(struct nf_conn *ct, const unsigned char *data, 228 H245_TransportAddress *taddr, 229 union nf_inet_addr *addr, __be16 *port) 230 { 231 const unsigned char *p; 232 int len; 233 234 if (taddr->choice != eH245_TransportAddress_unicastAddress) 235 return 0; 236 237 switch (taddr->unicastAddress.choice) { 238 case eUnicastAddress_iPAddress: 239 if (nf_ct_l3num(ct) != AF_INET) 240 return 0; 241 p = data + taddr->unicastAddress.iPAddress.network; 242 len = 4; 243 break; 244 case eUnicastAddress_iP6Address: 245 if (nf_ct_l3num(ct) != AF_INET6) 246 return 0; 247 p = data + taddr->unicastAddress.iP6Address.network; 248 len = 16; 249 break; 250 default: 251 return 0; 252 } 253 > 254 CHECK_BOUND(p, len); 255 256 memcpy(addr, p, len); 257 memset((void *)addr + len, 0, sizeof(*addr) - len); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: Binary data