headers.c (125823) | headers.c (132946) |
---|---|
1/* | 1/* |
2 * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. | 2 * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. |
3 * All rights reserved. 4 * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5 * Copyright (c) 1988, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * By using this file, you agree to the terms and conditions set 9 * forth in the LICENSE file which can be found at the top level of 10 * the sendmail distribution. 11 * | 3 * All rights reserved. 4 * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5 * Copyright (c) 1988, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * By using this file, you agree to the terms and conditions set 9 * forth in the LICENSE file which can be found at the top level of 10 * the sendmail distribution. 11 * |
12 * $FreeBSD: head/contrib/sendmail/src/headers.c 125823 2004-02-14 21:58:08Z gshapiro $ | 12 * $FreeBSD: head/contrib/sendmail/src/headers.c 132946 2004-08-01 01:16:16Z gshapiro $ |
13 */ 14 15#include <sendmail.h> 16 | 13 */ 14 15#include <sendmail.h> 16 |
17SM_RCSID("@(#)$Id: headers.c,v 8.266.4.9 2003/10/30 00:17:22 gshapiro Exp $") | 17SM_RCSID("@(#)$Id: headers.c,v 8.286 2004/07/08 17:57:32 ca Exp $") |
18 | 18 |
19static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *)); |
|
19static size_t fix_mime_header __P((HDR *, ENVELOPE *)); 20static int priencode __P((char *)); 21static void put_vanilla_header __P((HDR *, char *, MCI *)); 22 23/* 24** SETUPHEADERS -- initialize headers in symbol table 25** 26** Parameters: --- 56 unchanged lines hidden (view full) --- 83 STAB *s; 84 struct hdrinfo *hi; 85 bool nullheader = false; 86 BITMAP256 mopts; 87 88 if (tTd(31, 6)) 89 { 90 sm_dprintf("chompheader: "); | 20static size_t fix_mime_header __P((HDR *, ENVELOPE *)); 21static int priencode __P((char *)); 22static void put_vanilla_header __P((HDR *, char *, MCI *)); 23 24/* 25** SETUPHEADERS -- initialize headers in symbol table 26** 27** Parameters: --- 56 unchanged lines hidden (view full) --- 84 STAB *s; 85 struct hdrinfo *hi; 86 bool nullheader = false; 87 BITMAP256 mopts; 88 89 if (tTd(31, 6)) 90 { 91 sm_dprintf("chompheader: "); |
91 xputs(line); | 92 xputs(sm_debug_file(), line); |
92 sm_dprintf("\n"); 93 } 94 95 headeronly = hdrp != NULL; 96 if (!headeronly) 97 hdrp = &e->e_header; 98 99 /* strip off options */ --- 187 unchanged lines hidden (view full) --- 287 ** If there is a check ruleset, verify it against the header. 288 */ 289 290 if (bitset(pflag, CHHDR_CHECK)) 291 { 292 int rscheckflags; 293 char *rs; 294 | 93 sm_dprintf("\n"); 94 } 95 96 headeronly = hdrp != NULL; 97 if (!headeronly) 98 hdrp = &e->e_header; 99 100 /* strip off options */ --- 187 unchanged lines hidden (view full) --- 288 ** If there is a check ruleset, verify it against the header. 289 */ 290 291 if (bitset(pflag, CHHDR_CHECK)) 292 { 293 int rscheckflags; 294 char *rs; 295 |
295 /* no ruleset? look for default */ 296 rs = hi->hi_ruleset; | |
297 rscheckflags = RSF_COUNT; 298 if (!bitset(hi->hi_flags, H_FROM|H_RCPT)) 299 rscheckflags |= RSF_UNSTRUCTURED; | 296 rscheckflags = RSF_COUNT; 297 if (!bitset(hi->hi_flags, H_FROM|H_RCPT)) 298 rscheckflags |= RSF_UNSTRUCTURED; |
299 300 /* no ruleset? look for default */ 301 rs = hi->hi_ruleset; |
|
300 if (rs == NULL) 301 { 302 s = stab("*", ST_HEADER, ST_FIND); 303 if (s != NULL) 304 { 305 rs = (&s->s_header)->hi_ruleset; 306 if (bitset((&s->s_header)->hi_flags, 307 H_STRIPCOMM)) --- 45 unchanged lines hidden (view full) --- 353 macdefine(&e->e_macro, A_TEMP, 354 macid("{currHeader}"), qval); 355 macdefine(&e->e_macro, A_TEMP, 356 macid("{hdr_name}"), fname); 357 358 (void) sm_snprintf(qval, sizeof qval, "%d", k); 359 macdefine(&e->e_macro, A_TEMP, macid("{hdrlen}"), qval); 360#if _FFR_HDR_TYPE | 302 if (rs == NULL) 303 { 304 s = stab("*", ST_HEADER, ST_FIND); 305 if (s != NULL) 306 { 307 rs = (&s->s_header)->hi_ruleset; 308 if (bitset((&s->s_header)->hi_flags, 309 H_STRIPCOMM)) --- 45 unchanged lines hidden (view full) --- 355 macdefine(&e->e_macro, A_TEMP, 356 macid("{currHeader}"), qval); 357 macdefine(&e->e_macro, A_TEMP, 358 macid("{hdr_name}"), fname); 359 360 (void) sm_snprintf(qval, sizeof qval, "%d", k); 361 macdefine(&e->e_macro, A_TEMP, macid("{hdrlen}"), qval); 362#if _FFR_HDR_TYPE |
361 /* 362 ** XXX: h isn't set yet 363 ** If we really want to be precise then we have 364 ** to lookup the header (see below). 365 ** It's probably not worth the effort. 366 */ 367 368 if (bitset(H_FROM, h->h_flags)) | 363 if (bitset(H_FROM, hi->hi_flags)) |
369 macdefine(&e->e_macro, A_PERM, 370 macid("{addr_type}"), "h s"); | 364 macdefine(&e->e_macro, A_PERM, 365 macid("{addr_type}"), "h s"); |
371 else if (bitset(H_RCPT, h->h_flags)) | 366 else if (bitset(H_RCPT, hi->hi_flags)) |
372 macdefine(&e->e_macro, A_PERM, 373 macid("{addr_type}"), "h r"); 374 else 375#endif /* _FFR_HDR_TYPE */ 376 macdefine(&e->e_macro, A_PERM, 377 macid("{addr_type}"), "h"); 378 (void) rscheck(rs, fvalue, NULL, e, rscheckflags, 3, 379 NULL, e->e_id); --- 82 unchanged lines hidden (view full) --- 462 strchr(fvalue, '<') != NULL || strchr(fvalue, ';') != NULL)) 463 { 464 e->e_flags &= ~EF_OLDSTYLE; 465 } 466 467 return h->h_flags; 468} 469/* | 367 macdefine(&e->e_macro, A_PERM, 368 macid("{addr_type}"), "h r"); 369 else 370#endif /* _FFR_HDR_TYPE */ 371 macdefine(&e->e_macro, A_PERM, 372 macid("{addr_type}"), "h"); 373 (void) rscheck(rs, fvalue, NULL, e, rscheckflags, 3, 374 NULL, e->e_id); --- 82 unchanged lines hidden (view full) --- 457 strchr(fvalue, '<') != NULL || strchr(fvalue, ';') != NULL)) 458 { 459 e->e_flags &= ~EF_OLDSTYLE; 460 } 461 462 return h->h_flags; 463} 464/* |
465** ALLOCHEADER -- allocate a header entry 466** 467** Parameters: 468** field -- the name of the header field. 469** value -- the value of the field. 470** flags -- flags to add to h_flags. 471** rp -- resource pool for allocations 472** 473** Returns: 474** Pointer to a newly allocated and populated HDR. 475*/ 476 477static HDR * 478allocheader(field, value, flags, rp) 479 char *field; 480 char *value; 481 int flags; 482 SM_RPOOL_T *rp; 483{ 484 HDR *h; 485 STAB *s; 486 487 /* find info struct */ 488 s = stab(field, ST_HEADER, ST_FIND); 489 490 /* allocate space for new header */ 491 h = (HDR *) sm_rpool_malloc_x(rp, sizeof *h); 492 h->h_field = field; 493 h->h_value = sm_rpool_strdup_x(rp, value); 494 h->h_flags = flags; 495 if (s != NULL) 496 h->h_flags |= s->s_header.hi_flags; 497 clrbitmap(h->h_mflags); 498 h->h_macro = '\0'; 499 500 return h; 501} 502/* |
|
470** ADDHEADER -- add a header entry to the end of the queue. 471** 472** This bypasses the special checking of chompheader. 473** 474** Parameters: 475** field -- the name of the header field. 476** value -- the value of the field. 477** flags -- flags to add to h_flags. --- 9 unchanged lines hidden (view full) --- 487void 488addheader(field, value, flags, e) 489 char *field; 490 char *value; 491 int flags; 492 ENVELOPE *e; 493{ 494 register HDR *h; | 503** ADDHEADER -- add a header entry to the end of the queue. 504** 505** This bypasses the special checking of chompheader. 506** 507** Parameters: 508** field -- the name of the header field. 509** value -- the value of the field. 510** flags -- flags to add to h_flags. --- 9 unchanged lines hidden (view full) --- 520void 521addheader(field, value, flags, e) 522 char *field; 523 char *value; 524 int flags; 525 ENVELOPE *e; 526{ 527 register HDR *h; |
495 STAB *s; | |
496 HDR **hp; 497 HDR **hdrlist = &e->e_header; 498 | 528 HDR **hp; 529 HDR **hdrlist = &e->e_header; 530 |
499 /* find info struct */ 500 s = stab(field, ST_HEADER, ST_FIND); 501 | |
502 /* find current place in list -- keep back pointer? */ 503 for (hp = hdrlist; (h = *hp) != NULL; hp = &h->h_link) 504 { 505 if (sm_strcasecmp(field, h->h_field) == 0) 506 break; 507 } 508 509 /* allocate space for new header */ | 531 /* find current place in list -- keep back pointer? */ 532 for (hp = hdrlist; (h = *hp) != NULL; hp = &h->h_link) 533 { 534 if (sm_strcasecmp(field, h->h_field) == 0) 535 break; 536 } 537 538 /* allocate space for new header */ |
510 h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof *h); 511 h->h_field = field; 512 h->h_value = sm_rpool_strdup_x(e->e_rpool, value); | 539 h = allocheader(field, value, flags, e->e_rpool); |
513 h->h_link = *hp; | 540 h->h_link = *hp; |
514 h->h_flags = flags; 515 if (s != NULL) 516 h->h_flags |= s->s_header.hi_flags; 517 clrbitmap(h->h_mflags); 518 h->h_macro = '\0'; | |
519 *hp = h; 520} 521/* | 541 *hp = h; 542} 543/* |
544** INSHEADER -- insert a header entry at the specified index 545** 546** This bypasses the special checking of chompheader. 547** 548** Parameters: 549** idx -- index into the header list at which to insert 550** field -- the name of the header field. 551** value -- the value of the field. 552** flags -- flags to add to h_flags. 553** e -- envelope. 554** 555** Returns: 556** none. 557** 558** Side Effects: 559** inserts the field on the list of headers for this envelope. 560*/ 561 562void 563insheader(idx, field, value, flags, e) 564 int idx; 565 char *field; 566 char *value; 567 int flags; 568 ENVELOPE *e; 569{ 570 HDR *h, *srch, *last = NULL; 571 572 /* allocate space for new header */ 573 h = allocheader(field, value, flags, e->e_rpool); 574 575 /* find insertion position */ 576 for (srch = e->e_header; srch != NULL && idx > 0; 577 srch = srch->h_link, idx--) 578 last = srch; 579 580 if (e->e_header == NULL) 581 { 582 e->e_header = h; 583 h->h_link = NULL; 584 } 585 else if (srch == NULL) 586 { 587 SM_ASSERT(last != NULL); 588 last->h_link = h; 589 h->h_link = NULL; 590 } 591 else 592 { 593 h->h_link = srch->h_link; 594 srch->h_link = h; 595 } 596} 597/* |
|
522** HVALUE -- return value of a header. 523** 524** Only "real" fields (i.e., ones that have not been supplied 525** as a default) are used. 526** 527** Parameters: 528** field -- the field name. 529** header -- the header list. --- 139 unchanged lines hidden (view full) --- 669 670 /* do early binding */ 671 if (bitset(H_DEFAULT, h->h_flags) && 672 !bitset(H_BINDLATE, h->h_flags)) 673 { 674 if (tTd(32, 1)) 675 { 676 sm_dprintf("("); | 598** HVALUE -- return value of a header. 599** 600** Only "real" fields (i.e., ones that have not been supplied 601** as a default) are used. 602** 603** Parameters: 604** field -- the field name. 605** header -- the header list. --- 139 unchanged lines hidden (view full) --- 745 746 /* do early binding */ 747 if (bitset(H_DEFAULT, h->h_flags) && 748 !bitset(H_BINDLATE, h->h_flags)) 749 { 750 if (tTd(32, 1)) 751 { 752 sm_dprintf("("); |
677 xputs(h->h_value); | 753 xputs(sm_debug_file(), h->h_value); |
678 sm_dprintf(") "); 679 } 680 expand(h->h_value, buf, sizeof buf, e); 681 if (buf[0] != '\0') 682 { 683 if (bitset(H_FROM, h->h_flags)) 684 expand(crackaddr(buf, e), 685 buf, sizeof buf, e); 686 h->h_value = sm_rpool_strdup_x(e->e_rpool, buf); 687 h->h_flags &= ~H_DEFAULT; 688 } 689 } 690 if (tTd(32, 1)) 691 { | 754 sm_dprintf(") "); 755 } 756 expand(h->h_value, buf, sizeof buf, e); 757 if (buf[0] != '\0') 758 { 759 if (bitset(H_FROM, h->h_flags)) 760 expand(crackaddr(buf, e), 761 buf, sizeof buf, e); 762 h->h_value = sm_rpool_strdup_x(e->e_rpool, buf); 763 h->h_flags &= ~H_DEFAULT; 764 } 765 } 766 if (tTd(32, 1)) 767 { |
692 xputs(h->h_value); | 768 xputs(sm_debug_file(), h->h_value); |
693 sm_dprintf("\n"); 694 } 695 696 /* count the number of times it has been processed */ 697 if (bitset(H_TRACE, h->h_flags)) 698 hopcnt++; 699 700 /* send to this person if we so desire */ --- 25 unchanged lines hidden (view full) --- 726 p = "resent-message-id"; 727 if (!bitset(EF_RESENT, e->e_flags)) 728 p += 7; 729 if (sm_strcasecmp(h->h_field, p) == 0) 730 { 731 e->e_msgid = h->h_value; 732 while (isascii(*e->e_msgid) && isspace(*e->e_msgid)) 733 e->e_msgid++; | 769 sm_dprintf("\n"); 770 } 771 772 /* count the number of times it has been processed */ 773 if (bitset(H_TRACE, h->h_flags)) 774 hopcnt++; 775 776 /* send to this person if we so desire */ --- 25 unchanged lines hidden (view full) --- 802 p = "resent-message-id"; 803 if (!bitset(EF_RESENT, e->e_flags)) 804 p += 7; 805 if (sm_strcasecmp(h->h_field, p) == 0) 806 { 807 e->e_msgid = h->h_value; 808 while (isascii(*e->e_msgid) && isspace(*e->e_msgid)) 809 e->e_msgid++; |
734#if _FFR_MESSAGEID_MACRO | |
735 macdefine(&e->e_macro, A_PERM, macid("{msg_id}"), | 810 macdefine(&e->e_macro, A_PERM, macid("{msg_id}"), |
736 e->e_msgid); 737#endif /* _FFR_MESSAGEID_MACRO */ | 811 e->e_msgid); |
738 } 739 } 740 if (tTd(32, 1)) 741 sm_dprintf("----------------------------\n"); 742 743 /* if we are just verifying (that is, sendmail -t -bv), drop out now */ 744 if (OpMode == MD_VERIFY) 745 return; --- 16 unchanged lines hidden (view full) --- 762 e->e_timeoutclass = TOC_URGENT; 763 if (full) 764 { 765 e->e_msgpriority = e->e_msgsize 766 - e->e_class * WkClassFact 767 + e->e_nrcpts * WkRecipFact; 768 } 769 | 812 } 813 } 814 if (tTd(32, 1)) 815 sm_dprintf("----------------------------\n"); 816 817 /* if we are just verifying (that is, sendmail -t -bv), drop out now */ 818 if (OpMode == MD_VERIFY) 819 return; --- 16 unchanged lines hidden (view full) --- 836 e->e_timeoutclass = TOC_URGENT; 837 if (full) 838 { 839 e->e_msgpriority = e->e_msgsize 840 - e->e_class * WkClassFact 841 + e->e_nrcpts * WkRecipFact; 842 } 843 |
844 /* check for DSN to properly set e_timeoutclass */ 845 p = hvalue("content-type", e->e_header); 846 if (p != NULL) 847 { 848 bool oldsupr; 849 char **pvp; 850 char pvpbuf[MAXLINE]; 851 extern unsigned char MimeTokenTab[256]; 852 853 /* tokenize header */ 854 oldsupr = SuprErrs; 855 SuprErrs = true; 856 pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, 857 MimeTokenTab, false); 858 SuprErrs = oldsupr; 859 860 /* Check if multipart/report */ 861 if (pvp != NULL && pvp[0] != NULL && 862 pvp[1] != NULL && pvp[2] != NULL && 863 sm_strcasecmp(*pvp++, "multipart") == 0 && 864 strcmp(*pvp++, "/") == 0 && 865 sm_strcasecmp(*pvp++, "report") == 0) 866 { 867 /* Look for report-type=delivery-status */ 868 while (*pvp != NULL) 869 { 870 /* skip to semicolon separator */ 871 while (*pvp != NULL && strcmp(*pvp, ";") != 0) 872 pvp++; 873 874 /* skip semicolon */ 875 if (*pvp++ == NULL || *pvp == NULL) 876 break; 877 878 /* look for report-type */ 879 if (sm_strcasecmp(*pvp++, "report-type") != 0) 880 continue; 881 882 /* skip equal */ 883 if (*pvp == NULL || strcmp(*pvp, "=") != 0) 884 continue; 885 886 /* check value */ 887 if (*++pvp != NULL && 888 sm_strcasecmp(*pvp, 889 "delivery-status") == 0) 890 e->e_timeoutclass = TOC_DSN; 891 892 /* found report-type, no need to continue */ 893 break; 894 } 895 } 896 } 897 |
|
770 /* message timeout priority */ 771 p = hvalue("priority", e->e_header); 772 if (p != NULL) 773 { 774 /* (this should be in the configuration file) */ 775 if (sm_strcasecmp(p, "urgent") == 0) 776 e->e_timeoutclass = TOC_URGENT; 777 else if (sm_strcasecmp(p, "normal") == 0) 778 e->e_timeoutclass = TOC_NORMAL; 779 else if (sm_strcasecmp(p, "non-urgent") == 0) 780 e->e_timeoutclass = TOC_NONURGENT; | 898 /* message timeout priority */ 899 p = hvalue("priority", e->e_header); 900 if (p != NULL) 901 { 902 /* (this should be in the configuration file) */ 903 if (sm_strcasecmp(p, "urgent") == 0) 904 e->e_timeoutclass = TOC_URGENT; 905 else if (sm_strcasecmp(p, "normal") == 0) 906 e->e_timeoutclass = TOC_NORMAL; 907 else if (sm_strcasecmp(p, "non-urgent") == 0) 908 e->e_timeoutclass = TOC_NONURGENT; |
781#if _FFR_QUEUERETURN_DSN | |
782 else if (bitset(EF_RESPONSE, e->e_flags)) 783 e->e_timeoutclass = TOC_DSN; | 909 else if (bitset(EF_RESPONSE, e->e_flags)) 910 e->e_timeoutclass = TOC_DSN; |
784#endif /* _FFR_QUEUERETURN_DSN */ | |
785 } | 911 } |
786#if _FFR_QUEUERETURN_DSN | |
787 else if (bitset(EF_RESPONSE, e->e_flags)) 788 e->e_timeoutclass = TOC_DSN; | 912 else if (bitset(EF_RESPONSE, e->e_flags)) 913 e->e_timeoutclass = TOC_DSN; |
789#endif /* _FFR_QUEUERETURN_DSN */ | |
790 791 /* date message originated */ 792 p = hvalue("posted-date", e->e_header); 793 if (p == NULL) 794 p = hvalue("date", e->e_header); 795 if (p != NULL) 796 macdefine(&e->e_macro, A_PERM, 'a', p); 797 --- 437 unchanged lines hidden (view full) --- 1235 isascii(*--p) && isspace(*p)) 1236 continue; 1237 p++; 1238 } 1239 for (q = addrhead; q < p; ) 1240 { 1241 c = *q++; 1242 if (quoteit && c == '"') | 914 915 /* date message originated */ 916 p = hvalue("posted-date", e->e_header); 917 if (p == NULL) 918 p = hvalue("date", e->e_header); 919 if (p != NULL) 920 macdefine(&e->e_macro, A_PERM, 'a', p); 921 --- 437 unchanged lines hidden (view full) --- 1359 isascii(*--p) && isspace(*p)) 1360 continue; 1361 p++; 1362 } 1363 for (q = addrhead; q < p; ) 1364 { 1365 c = *q++; 1366 if (quoteit && c == '"') |
1243 { | |
1244 SM_APPEND_CHAR('\\'); | 1367 SM_APPEND_CHAR('\\'); |
1245 SM_APPEND_CHAR(c); 1246 } 1247 else 1248 SM_APPEND_CHAR(c); | 1368 SM_APPEND_CHAR(c); |
1249 } 1250 if (quoteit) 1251 { 1252 if (bp == &bufhead[1]) 1253 bp--; 1254 else 1255 SM_APPEND_CHAR('"'); 1256 while ((c = *p++) != ':') --- 145 unchanged lines hidden (view full) --- 1402 buf[4]= '\0'; 1403 sm_syslog(LOG_ALERT, e->e_id, 1404 "Dropped invalid comments from header address"); 1405 1406 success: 1407 if (tTd(33, 1)) 1408 { 1409 sm_dprintf("crackaddr=>`"); | 1369 } 1370 if (quoteit) 1371 { 1372 if (bp == &bufhead[1]) 1373 bp--; 1374 else 1375 SM_APPEND_CHAR('"'); 1376 while ((c = *p++) != ':') --- 145 unchanged lines hidden (view full) --- 1522 buf[4]= '\0'; 1523 sm_syslog(LOG_ALERT, e->e_id, 1524 "Dropped invalid comments from header address"); 1525 1526 success: 1527 if (tTd(33, 1)) 1528 { 1529 sm_dprintf("crackaddr=>`"); |
1410 xputs(buf); | 1530 xputs(sm_debug_file(), buf); |
1411 sm_dprintf("'\n"); 1412 } 1413 return buf; 1414} 1415/* 1416** PUTHEADER -- put the header part of a message from the in-core copy 1417** 1418** Parameters: --- 36 unchanged lines hidden (view full) --- 1455 for (h = hdr; h != NULL; h = h->h_link) 1456 { 1457 register char *p = h->h_value; 1458 char *q; 1459 1460 if (tTd(34, 11)) 1461 { 1462 sm_dprintf(" %s: ", h->h_field); | 1531 sm_dprintf("'\n"); 1532 } 1533 return buf; 1534} 1535/* 1536** PUTHEADER -- put the header part of a message from the in-core copy 1537** 1538** Parameters: --- 36 unchanged lines hidden (view full) --- 1575 for (h = hdr; h != NULL; h = h->h_link) 1576 { 1577 register char *p = h->h_value; 1578 char *q; 1579 1580 if (tTd(34, 11)) 1581 { 1582 sm_dprintf(" %s: ", h->h_field); |
1463 xputs(p); | 1583 xputs(sm_debug_file(), p); |
1464 } 1465 1466 /* Skip empty headers */ 1467 if (h->h_value == NULL) 1468 continue; 1469 1470 /* heuristic shortening of MIME fields to avoid MUA overflows */ 1471 if (MaxMimeFieldLength > 0 && --- 337 unchanged lines hidden (view full) --- 1809 name = p; 1810 res = NULL; 1811 for (;;) 1812 { 1813 auto char *oldp; 1814 char pvpbuf[PSBUFSIZE]; 1815 1816 res = prescan(p, oldstyle ? ' ' : ',', pvpbuf, | 1584 } 1585 1586 /* Skip empty headers */ 1587 if (h->h_value == NULL) 1588 continue; 1589 1590 /* heuristic shortening of MIME fields to avoid MUA overflows */ 1591 if (MaxMimeFieldLength > 0 && --- 337 unchanged lines hidden (view full) --- 1929 name = p; 1930 res = NULL; 1931 for (;;) 1932 { 1933 auto char *oldp; 1934 char pvpbuf[PSBUFSIZE]; 1935 1936 res = prescan(p, oldstyle ? ' ' : ',', pvpbuf, |
1817 sizeof pvpbuf, &oldp, NULL); | 1937 sizeof pvpbuf, &oldp, NULL, false); |
1818 p = oldp; 1819#if _FFR_IGNORE_BOGUS_ADDR 1820 /* ignore addresses that can't be parsed */ 1821 if (res == NULL) 1822 { 1823 name = p; 1824 continue; 1825 } --- 220 unchanged lines hidden --- | 1938 p = oldp; 1939#if _FFR_IGNORE_BOGUS_ADDR 1940 /* ignore addresses that can't be parsed */ 1941 if (res == NULL) 1942 { 1943 name = p; 1944 continue; 1945 } --- 220 unchanged lines hidden --- |