@@ -186,7 +186,7 @@ questions_hash(uint64_t *hash, struct dns_header *header, size_t plen,
186186 (name_len = strlen (name )) > MAXDNAME ) {
187187 return -1 ;
188188 }
189- crypto_shorthash ((unsigned char * ) hash , name , name_len , key );
189+ crypto_shorthash ((unsigned char * ) hash , ( const unsigned char * ) name , name_len , key );
190190
191191 return 0 ;
192192}
@@ -278,7 +278,7 @@ do_rfc1035_name(unsigned char *p, char *sval)
278278}
279279
280280int
281- add_resource_record (struct dns_header * header , unsigned int nameoffset ,
281+ add_resource_record (struct dns_header * header , unsigned int nameoffset , size_t plen ,
282282 unsigned char * * pp , unsigned long ttl , unsigned int * offset ,
283283 unsigned short type , unsigned short class , char * format ,
284284 ...)
@@ -290,6 +290,9 @@ add_resource_record(struct dns_header *header, unsigned int nameoffset,
290290 long lval ;
291291 char * sval ;
292292
293+ if (!CHECK_LEN (header , p , plen , 12 )) {
294+ return 0 ;
295+ }
293296 PUTSHORT (nameoffset | 0xc000 , p );
294297 PUTSHORT (type , p );
295298 PUTSHORT (class , p );
@@ -304,24 +307,36 @@ add_resource_record(struct dns_header *header, unsigned int nameoffset,
304307 switch (* format ) {
305308#ifdef HAVE_IPV6
306309 case '6' :
310+ if (!CHECK_LEN (header , p , plen , IN6ADDRSZ )) {
311+ return 0 ;
312+ }
307313 sval = va_arg (ap , char * );
308314 memcpy (p , sval , IN6ADDRSZ );
309315 p += IN6ADDRSZ ;
310316 break ;
311317#endif
312318
313319 case '4' :
320+ if (!CHECK_LEN (header , p , plen , INADDRSZ )) {
321+ return 0 ;
322+ }
314323 sval = va_arg (ap , char * );
315324 memcpy (p , sval , INADDRSZ );
316325 p += INADDRSZ ;
317326 break ;
318327
319328 case 's' :
329+ if (!CHECK_LEN (header , p , plen , 2 )) {
330+ return 0 ;
331+ }
320332 usval = va_arg (ap , int );
321333 PUTSHORT (usval , p );
322334 break ;
323335
324336 case 'l' :
337+ if (!CHECK_LEN (header , p , plen , 4 )) {
338+ return 0 ;
339+ }
325340 lval = va_arg (ap , long );
326341 PUTLONG (lval , p );
327342 break ;
@@ -338,6 +353,9 @@ add_resource_record(struct dns_header *header, unsigned int nameoffset,
338353 case 't' :
339354 usval = va_arg (ap , int );
340355 sval = va_arg (ap , char * );
356+ if (!CHECK_LEN (header , p , plen , usval )) {
357+ return 0 ;
358+ }
341359 if (usval != 0 ) {
342360 memcpy (p , sval , usval );
343361 }
@@ -350,6 +368,9 @@ add_resource_record(struct dns_header *header, unsigned int nameoffset,
350368 if (usval > 255 ) {
351369 usval = 255 ;
352370 }
371+ if (!CHECK_LEN (header , p , plen , (1 + usval ))) {
372+ return 0 ;
373+ }
353374 * p ++ = (unsigned char ) usval ;
354375 memcpy (p , sval , usval );
355376 p += usval ;
@@ -359,6 +380,9 @@ add_resource_record(struct dns_header *header, unsigned int nameoffset,
359380 va_end (ap ); /* clean up variable argument pointer */
360381
361382 j = p - sav - 2 ;
383+ if (!CHECK_LEN (header , sav , plen , 2 )) {
384+ return 0 ;
385+ }
362386 PUTSHORT (j , sav ); /* Now, store real RDLength */
363387
364388 * pp = p ;
0 commit comments