xref: /freebsd/contrib/sendmail/src/sasl.c (revision 605302a5c9939b7eeda0a31f38901d9a8348e8cb)
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