140266059SGregory Neil Shapiro /* 2605302a5SGregory Neil Shapiro * Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro * 940266059SGregory Neil Shapiro */ 1040266059SGregory Neil Shapiro 1140266059SGregory Neil Shapiro #include <sm/gen.h> 12605302a5SGregory Neil Shapiro SM_RCSID("@(#)$Id: sasl.c,v 8.12 2002/01/21 02:28:05 gshapiro Exp $") 13605302a5SGregory Neil Shapiro 14605302a5SGregory Neil Shapiro #if SASL 1540266059SGregory Neil Shapiro # include <stdlib.h> 1640266059SGregory Neil Shapiro # include <sendmail.h> 1740266059SGregory Neil Shapiro # include <errno.h> 1840266059SGregory Neil Shapiro # include <sasl.h> 1940266059SGregory Neil Shapiro 2040266059SGregory Neil Shapiro /* 2140266059SGregory Neil Shapiro ** In order to ensure that storage leaks are tracked, and to prevent 2240266059SGregory Neil Shapiro ** conflicts between the sm_heap package and sasl, we tell sasl to 2340266059SGregory Neil Shapiro ** use the following heap allocation functions. Unfortunately, 2440266059SGregory Neil Shapiro ** the sasl package incorrectly specifies the size of a block 2540266059SGregory Neil Shapiro ** using unsigned long: for portability, it should be size_t. 2640266059SGregory Neil Shapiro */ 2740266059SGregory Neil Shapiro 2840266059SGregory Neil Shapiro void *sm_sasl_malloc __P((unsigned long)); 2940266059SGregory Neil Shapiro static void *sm_sasl_calloc __P((unsigned long, unsigned long)); 3040266059SGregory Neil Shapiro static void *sm_sasl_realloc __P((void *, unsigned long)); 3140266059SGregory Neil Shapiro void sm_sasl_free __P((void *)); 3240266059SGregory Neil Shapiro 3340266059SGregory Neil Shapiro /* 3440266059SGregory Neil Shapiro ** We can't use an rpool for Cyrus-SASL memory management routines, 3540266059SGregory Neil Shapiro ** since the encryption/decryption routines in Cyrus-SASL 3640266059SGregory Neil Shapiro ** allocate/deallocate a buffer each time. Since rpool 3740266059SGregory Neil Shapiro ** don't release memory until the very end, memory consumption is 3840266059SGregory Neil Shapiro ** proportional to the size of an e-mail, which is unacceptable. 3940266059SGregory Neil Shapiro ** 4040266059SGregory Neil Shapiro */ 4140266059SGregory Neil Shapiro 4240266059SGregory Neil Shapiro /* 4340266059SGregory Neil Shapiro ** SM_SASL_MALLOC -- malloc() for SASL 4440266059SGregory Neil Shapiro ** 4540266059SGregory Neil Shapiro ** Parameters: 4640266059SGregory Neil Shapiro ** size -- size of requested memory. 4740266059SGregory Neil Shapiro ** 4840266059SGregory Neil Shapiro ** Returns: 4940266059SGregory Neil Shapiro ** pointer to memory. 5040266059SGregory Neil Shapiro */ 5140266059SGregory Neil Shapiro 5240266059SGregory Neil Shapiro void * 5340266059SGregory Neil Shapiro sm_sasl_malloc(size) 5440266059SGregory Neil Shapiro unsigned long size; 5540266059SGregory Neil Shapiro { 5640266059SGregory Neil Shapiro return sm_malloc((size_t) size); 5740266059SGregory Neil Shapiro } 5840266059SGregory Neil Shapiro 5940266059SGregory Neil Shapiro /* 6040266059SGregory Neil Shapiro ** SM_SASL_CALLOC -- calloc() for SASL 6140266059SGregory Neil Shapiro ** 6240266059SGregory Neil Shapiro ** Parameters: 6340266059SGregory Neil Shapiro ** nelem -- number of elements. 6440266059SGregory Neil Shapiro ** elemsize -- size of each element. 6540266059SGregory Neil Shapiro ** 6640266059SGregory Neil Shapiro ** Returns: 6740266059SGregory Neil Shapiro ** pointer to memory. 6840266059SGregory Neil Shapiro ** 6940266059SGregory Neil Shapiro ** Notice: 7040266059SGregory Neil Shapiro ** this isn't currently used by SASL. 7140266059SGregory Neil Shapiro */ 7240266059SGregory Neil Shapiro 7340266059SGregory Neil Shapiro static void * 7440266059SGregory Neil Shapiro sm_sasl_calloc(nelem, elemsize) 7540266059SGregory Neil Shapiro unsigned long nelem; 7640266059SGregory Neil Shapiro unsigned long elemsize; 7740266059SGregory Neil Shapiro { 7840266059SGregory Neil Shapiro size_t size; 7940266059SGregory Neil Shapiro void *p; 8040266059SGregory Neil Shapiro 8140266059SGregory Neil Shapiro size = (size_t) nelem * (size_t) elemsize; 8240266059SGregory Neil Shapiro p = sm_malloc(size); 8340266059SGregory Neil Shapiro if (p == NULL) 8440266059SGregory Neil Shapiro return NULL; 8540266059SGregory Neil Shapiro memset(p, '\0', size); 8640266059SGregory Neil Shapiro return p; 8740266059SGregory Neil Shapiro } 8840266059SGregory Neil Shapiro 8940266059SGregory Neil Shapiro /* 9040266059SGregory Neil Shapiro ** SM_SASL_REALLOC -- realloc() for SASL 9140266059SGregory Neil Shapiro ** 9240266059SGregory Neil Shapiro ** Parameters: 9340266059SGregory Neil Shapiro ** p -- pointer to old memory. 9440266059SGregory Neil Shapiro ** size -- size of requested memory. 9540266059SGregory Neil Shapiro ** 9640266059SGregory Neil Shapiro ** Returns: 9740266059SGregory Neil Shapiro ** pointer to new memory. 9840266059SGregory Neil Shapiro */ 9940266059SGregory Neil Shapiro 10040266059SGregory Neil Shapiro static void * 10140266059SGregory Neil Shapiro sm_sasl_realloc(o, size) 10240266059SGregory Neil Shapiro void *o; 10340266059SGregory Neil Shapiro unsigned long size; 10440266059SGregory Neil Shapiro { 10540266059SGregory Neil Shapiro return sm_realloc(o, (size_t) size); 10640266059SGregory Neil Shapiro } 10740266059SGregory Neil Shapiro 10840266059SGregory Neil Shapiro /* 10940266059SGregory Neil Shapiro ** SM_SASL_FREE -- free() for SASL 11040266059SGregory Neil Shapiro ** 11140266059SGregory Neil Shapiro ** Parameters: 11240266059SGregory Neil Shapiro ** p -- pointer to free. 11340266059SGregory Neil Shapiro ** 11440266059SGregory Neil Shapiro ** Returns: 11540266059SGregory Neil Shapiro ** none 11640266059SGregory Neil Shapiro */ 11740266059SGregory Neil Shapiro 11840266059SGregory Neil Shapiro void 11940266059SGregory Neil Shapiro sm_sasl_free(p) 12040266059SGregory Neil Shapiro void *p; 12140266059SGregory Neil Shapiro { 12240266059SGregory Neil Shapiro sm_free(p); 12340266059SGregory Neil Shapiro } 12440266059SGregory Neil Shapiro 12540266059SGregory Neil Shapiro /* 12640266059SGregory Neil Shapiro ** SM_SASL_INIT -- sendmail specific SASL initialization 12740266059SGregory Neil Shapiro ** 12840266059SGregory Neil Shapiro ** Parameters: 12940266059SGregory Neil Shapiro ** none. 13040266059SGregory Neil Shapiro ** 13140266059SGregory Neil Shapiro ** Returns: 13240266059SGregory Neil Shapiro ** none 13340266059SGregory Neil Shapiro ** 13440266059SGregory Neil Shapiro ** Side Effects: 13540266059SGregory Neil Shapiro ** installs memory management routines for SASL. 13640266059SGregory Neil Shapiro */ 13740266059SGregory Neil Shapiro 13840266059SGregory Neil Shapiro void 13940266059SGregory Neil Shapiro sm_sasl_init() 14040266059SGregory Neil Shapiro { 14140266059SGregory Neil Shapiro sasl_set_alloc(sm_sasl_malloc, sm_sasl_calloc, 14240266059SGregory Neil Shapiro sm_sasl_realloc, sm_sasl_free); 14340266059SGregory Neil Shapiro } 14440266059SGregory Neil Shapiro /* 14540266059SGregory Neil Shapiro ** INTERSECT -- create the intersection between two lists 14640266059SGregory Neil Shapiro ** 14740266059SGregory Neil Shapiro ** Parameters: 14840266059SGregory Neil Shapiro ** s1, s2 -- lists of items (separated by single blanks). 14940266059SGregory Neil Shapiro ** rpool -- resource pool from which result is allocated. 15040266059SGregory Neil Shapiro ** 15140266059SGregory Neil Shapiro ** Returns: 15240266059SGregory Neil Shapiro ** the intersection of both lists. 15340266059SGregory Neil Shapiro */ 15440266059SGregory Neil Shapiro 15540266059SGregory Neil Shapiro char * 15640266059SGregory Neil Shapiro intersect(s1, s2, rpool) 15740266059SGregory Neil Shapiro char *s1, *s2; 15840266059SGregory Neil Shapiro SM_RPOOL_T *rpool; 15940266059SGregory Neil Shapiro { 16040266059SGregory Neil Shapiro char *hr, *h1, *h, *res; 16140266059SGregory Neil Shapiro int l1, l2, rl; 16240266059SGregory Neil Shapiro 16340266059SGregory Neil Shapiro if (s1 == NULL || s2 == NULL) /* NULL string(s) -> NULL result */ 16440266059SGregory Neil Shapiro return NULL; 16540266059SGregory Neil Shapiro l1 = strlen(s1); 16640266059SGregory Neil Shapiro l2 = strlen(s2); 16740266059SGregory Neil Shapiro rl = SM_MIN(l1, l2); 16840266059SGregory Neil Shapiro res = (char *) sm_rpool_malloc(rpool, rl + 1); 16940266059SGregory Neil Shapiro if (res == NULL) 17040266059SGregory Neil Shapiro return NULL; 17140266059SGregory Neil Shapiro *res = '\0'; 17240266059SGregory Neil Shapiro if (rl == 0) /* at least one string empty? */ 17340266059SGregory Neil Shapiro return res; 17440266059SGregory Neil Shapiro hr = res; 17540266059SGregory Neil Shapiro h1 = s1; 17640266059SGregory Neil Shapiro h = s1; 17740266059SGregory Neil Shapiro 17840266059SGregory Neil Shapiro /* walk through s1 */ 17940266059SGregory Neil Shapiro while (h != NULL && *h1 != '\0') 18040266059SGregory Neil Shapiro { 18140266059SGregory Neil Shapiro /* is there something after the current word? */ 18240266059SGregory Neil Shapiro if ((h = strchr(h1, ' ')) != NULL) 18340266059SGregory Neil Shapiro *h = '\0'; 18440266059SGregory Neil Shapiro l1 = strlen(h1); 18540266059SGregory Neil Shapiro 18640266059SGregory Neil Shapiro /* does the current word appear in s2 ? */ 18740266059SGregory Neil Shapiro if (iteminlist(h1, s2, " ") != NULL) 18840266059SGregory Neil Shapiro { 18940266059SGregory Neil Shapiro /* add a blank if not first item */ 19040266059SGregory Neil Shapiro if (hr != res) 19140266059SGregory Neil Shapiro *hr++ = ' '; 19240266059SGregory Neil Shapiro 19340266059SGregory Neil Shapiro /* copy the item */ 19440266059SGregory Neil Shapiro memcpy(hr, h1, l1); 19540266059SGregory Neil Shapiro 19640266059SGregory Neil Shapiro /* advance pointer in result list */ 19740266059SGregory Neil Shapiro hr += l1; 19840266059SGregory Neil Shapiro *hr = '\0'; 19940266059SGregory Neil Shapiro } 20040266059SGregory Neil Shapiro if (h != NULL) 20140266059SGregory Neil Shapiro { 20240266059SGregory Neil Shapiro /* there are more items */ 20340266059SGregory Neil Shapiro *h = ' '; 20440266059SGregory Neil Shapiro h1 = h + 1; 20540266059SGregory Neil Shapiro } 20640266059SGregory Neil Shapiro } 20740266059SGregory Neil Shapiro return res; 20840266059SGregory Neil Shapiro } 20940266059SGregory Neil Shapiro #endif /* SASL */ 210