xref: /freebsd/contrib/sendmail/libsm/t-qic.c (revision d39bd2c1388b520fcba9abed1932acacead60fba)
1d0cef73dSGregory Neil Shapiro /*
2*d39bd2c1SGregory Neil Shapiro  * Copyright (c) 2006, 2023 Proofpoint, Inc. and its suppliers.
3d0cef73dSGregory Neil Shapiro  *	All rights reserved.
4d0cef73dSGregory Neil Shapiro  *
5d0cef73dSGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
6d0cef73dSGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
7d0cef73dSGregory Neil Shapiro  * the sendmail distribution.
8d0cef73dSGregory Neil Shapiro  */
9d0cef73dSGregory Neil Shapiro 
10d0cef73dSGregory Neil Shapiro #include <sm/gen.h>
114313cc83SGregory Neil Shapiro SM_IDSTR(id, "@(#)$Id: t-qic.c,v 1.10 2013-11-22 20:51:43 ca Exp $")
12d0cef73dSGregory Neil Shapiro 
13d0cef73dSGregory Neil Shapiro #include <stdio.h>
14d0cef73dSGregory Neil Shapiro #include <sm/sendmail.h>
15d0cef73dSGregory Neil Shapiro #include <sm/assert.h>
16d0cef73dSGregory Neil Shapiro #include <sm/heap.h>
17d0cef73dSGregory Neil Shapiro #include <sm/string.h>
18d0cef73dSGregory Neil Shapiro #include <sm/test.h>
19d0cef73dSGregory Neil Shapiro 
20d0cef73dSGregory Neil Shapiro extern bool SmTestVerbose;
21d0cef73dSGregory Neil Shapiro 
22d0cef73dSGregory Neil Shapiro void
show_diff(s1,s2)23d0cef73dSGregory Neil Shapiro show_diff(s1, s2)
24d0cef73dSGregory Neil Shapiro 	const char *s1;
25d0cef73dSGregory Neil Shapiro 	const char *s2;
26d0cef73dSGregory Neil Shapiro {
27d0cef73dSGregory Neil Shapiro 	int i;
28d0cef73dSGregory Neil Shapiro 
29d0cef73dSGregory Neil Shapiro 	for (i = 0; s1[i] != '\0' && s2[i] != '\0'; i++)
30d0cef73dSGregory Neil Shapiro 	{
31d0cef73dSGregory Neil Shapiro 		if (s1[i] != s2[i])
32d0cef73dSGregory Neil Shapiro 		{
33d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
34d0cef73dSGregory Neil Shapiro 				i, (unsigned char) s1[i],
35d0cef73dSGregory Neil Shapiro 				(unsigned char) s2[i]);
36d0cef73dSGregory Neil Shapiro 			return;
37d0cef73dSGregory Neil Shapiro 		}
38d0cef73dSGregory Neil Shapiro 	}
39d0cef73dSGregory Neil Shapiro 	if (s1[i] != s2[i])
40d0cef73dSGregory Neil Shapiro 	{
41d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
42d0cef73dSGregory Neil Shapiro 			i, (unsigned char) s1[i], (unsigned char) s2[i]);
43d0cef73dSGregory Neil Shapiro 	}
44d0cef73dSGregory Neil Shapiro }
45d0cef73dSGregory Neil Shapiro 
462fb4f839SGregory Neil Shapiro char *quote_unquote __P((char *, char *, int, int, int));
47d0cef73dSGregory Neil Shapiro 
48d0cef73dSGregory Neil Shapiro char *
quote_unquote(in,out,outlen,exp,mode)492fb4f839SGregory Neil Shapiro quote_unquote(in, out, outlen, exp, mode)
50d0cef73dSGregory Neil Shapiro 	char *in;
51d0cef73dSGregory Neil Shapiro 	char *out;
52d0cef73dSGregory Neil Shapiro 	int outlen;
53d0cef73dSGregory Neil Shapiro 	int exp;
542fb4f839SGregory Neil Shapiro 	int mode;
55d0cef73dSGregory Neil Shapiro {
56d0cef73dSGregory Neil Shapiro 	char *obp, *bp;
57d0cef73dSGregory Neil Shapiro 	char line_back[1024];
58d0cef73dSGregory Neil Shapiro 	char line_in[1024];
59d0cef73dSGregory Neil Shapiro 	int cmp;
60d0cef73dSGregory Neil Shapiro 
61d0cef73dSGregory Neil Shapiro 	sm_strlcpy(line_in, in, sizeof(line_in));
622fb4f839SGregory Neil Shapiro 	obp = quote_internal_chars(in, out, &outlen, NULL);
63d0cef73dSGregory Neil Shapiro 	bp = str2prt(line_in);
642fb4f839SGregory Neil Shapiro 	if (0 == mode)
65d0cef73dSGregory Neil Shapiro 		dequote_internal_chars(obp, line_back, sizeof(line_back));
662fb4f839SGregory Neil Shapiro 	else if (1 == mode)
672fb4f839SGregory Neil Shapiro 		dequote_internal_chars(obp, line_back, strlen(obp));
682fb4f839SGregory Neil Shapiro 	else if (2 == mode)
692fb4f839SGregory Neil Shapiro 		dequote_internal_chars(obp, line_back, strlen(obp) + 1);
70d0cef73dSGregory Neil Shapiro 	cmp = strcmp(line_in, line_back);
71d0cef73dSGregory Neil Shapiro 	SM_TEST(exp == cmp);
72d0cef73dSGregory Neil Shapiro 	if (cmp != exp && !SmTestVerbose)
73d0cef73dSGregory Neil Shapiro 	{
74d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "in: %s\n", bp);
75d0cef73dSGregory Neil Shapiro 		bp = str2prt(line_back);
76d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "out:%s\n", bp);
77d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "cmp=%d\n", cmp);
78d0cef73dSGregory Neil Shapiro 		show_diff(in, line_back);
79d0cef73dSGregory Neil Shapiro 	}
80d0cef73dSGregory Neil Shapiro 	if (SmTestVerbose)
81d0cef73dSGregory Neil Shapiro 	{
82d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "%s -> ", bp);
83d0cef73dSGregory Neil Shapiro 		bp = str2prt(obp);
84d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "%s\n", bp);
85d0cef73dSGregory Neil Shapiro 		fprintf(stderr, "cmp=%d\n", cmp);
86d0cef73dSGregory Neil Shapiro 	}
87d0cef73dSGregory Neil Shapiro 	return obp;
88d0cef73dSGregory Neil Shapiro }
89d0cef73dSGregory Neil Shapiro 
90d0cef73dSGregory Neil Shapiro struct sm_qic_S
91d0cef73dSGregory Neil Shapiro {
92d0cef73dSGregory Neil Shapiro 	char		*qic_in;
93d0cef73dSGregory Neil Shapiro 	char		*qic_out;
94d0cef73dSGregory Neil Shapiro 	int		 qic_exp;
95d0cef73dSGregory Neil Shapiro };
96d0cef73dSGregory Neil Shapiro 
97d0cef73dSGregory Neil Shapiro typedef struct sm_qic_S sm_qic_T;
98d0cef73dSGregory Neil Shapiro 
99d0cef73dSGregory Neil Shapiro 
100d0cef73dSGregory Neil Shapiro int
main(argc,argv)101d0cef73dSGregory Neil Shapiro main(argc, argv)
102d0cef73dSGregory Neil Shapiro 	int argc;
103d0cef73dSGregory Neil Shapiro 	char *argv[];
104d0cef73dSGregory Neil Shapiro {
105d0cef73dSGregory Neil Shapiro 	char line_in[1024], line[256], line_out[32], *obp;
1062fb4f839SGregory Neil Shapiro 	int i, los, cmp, mode;
107d0cef73dSGregory Neil Shapiro 	sm_qic_T inout[] = {
108d0cef73dSGregory Neil Shapiro 		  { "", "",	0 }
109*d39bd2c1SGregory Neil Shapiro 		, { "\t", "\t",	0 }
110*d39bd2c1SGregory Neil Shapiro 		, { "\tuser", "\tuser",	0 }
111d0cef73dSGregory Neil Shapiro 		, { "abcdef", "abcdef",	0 }
112d0cef73dSGregory Neil Shapiro 		, { "01234567890123456789", "01234567890123456789",	0 }
1132fb4f839SGregory Neil Shapiro 		, { "\\", "\\",	0 }
1142fb4f839SGregory Neil Shapiro 		, { "\\A", "\\A",	0 }
115d0cef73dSGregory Neil Shapiro 		, { "01234567890123456789\001", "01234567890123456789\001",
116d0cef73dSGregory Neil Shapiro 			0 }
117d0cef73dSGregory Neil Shapiro 		, { "012345\2067890123456789", "012345\377\2067890123456789",
118d0cef73dSGregory Neil Shapiro 			0 }
119d0cef73dSGregory Neil Shapiro 		, { "\377", "\377\377",	0 }
120d0cef73dSGregory Neil Shapiro 		, { "\240", "\240",	0 }
121d0cef73dSGregory Neil Shapiro 		, { "\220", "\377\220",	0 }
122d0cef73dSGregory Neil Shapiro 		, { "\240\220", "\240\377\220",	0 }
123d0cef73dSGregory Neil Shapiro 		, { "\377\377", "\377\377\377\377",	0 }
124d0cef73dSGregory Neil Shapiro 		, { "\377a\377b", "\377\377a\377\377b",	0 }
125d0cef73dSGregory Neil Shapiro 		, { "\376a\377b", "\376a\377\377b",	0 }
126d0cef73dSGregory Neil Shapiro 		, { "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240",
127d0cef73dSGregory Neil Shapiro 		    "\377\200\377\201\377\202\377\203\377\204\377\205\377\206\377\207\377\210\377\211\377\212\377\213\377\214\377\215\377\216\377\217\377\220\377\221\377\222\377\223\377\224\377\225\377\226\377\227\377\230\377\231\377\232\377\233\377\234\377\235\377\236\377\237\240",
128d0cef73dSGregory Neil Shapiro 			0 }
129d0cef73dSGregory Neil Shapiro 		, { NULL, NULL,	0 }
130d0cef73dSGregory Neil Shapiro 	};
131d0cef73dSGregory Neil Shapiro 
132d0cef73dSGregory Neil Shapiro 	sm_test_begin(argc, argv, "test meta quoting");
1332fb4f839SGregory Neil Shapiro 	mode = 0;
1342fb4f839SGregory Neil Shapiro 	if (argc > 1)
1352fb4f839SGregory Neil Shapiro 		mode = atoi(argv[1]);
136d0cef73dSGregory Neil Shapiro 	for (i = 0; i < sizeof(line_out); i++)
137d0cef73dSGregory Neil Shapiro 		line_out[i] = '\0';
138d0cef73dSGregory Neil Shapiro 	for (i = 0; i < sizeof(line_in); i++)
139d0cef73dSGregory Neil Shapiro 		line_in[i] = '\0';
140d0cef73dSGregory Neil Shapiro 	for (i = 0; i < sizeof(line_in) / 2; i++)
141d0cef73dSGregory Neil Shapiro 	{
142d0cef73dSGregory Neil Shapiro 		char ch;
143d0cef73dSGregory Neil Shapiro 
144d0cef73dSGregory Neil Shapiro 		ch = 0200 + i;
145d0cef73dSGregory Neil Shapiro 		if ('\0' == ch)
146d0cef73dSGregory Neil Shapiro 			ch = '0';
147d0cef73dSGregory Neil Shapiro 		line_in[i] = ch;
148d0cef73dSGregory Neil Shapiro 	}
149d0cef73dSGregory Neil Shapiro 	los = sizeof(line_out) / 2;
1502fb4f839SGregory Neil Shapiro 	obp = quote_unquote(line_in, line_out, los, 0, mode);
151d0cef73dSGregory Neil Shapiro 	if (obp != line_out)
152d0cef73dSGregory Neil Shapiro 		SM_FREE(obp);
153d0cef73dSGregory Neil Shapiro 
154d0cef73dSGregory Neil Shapiro 	for (i = 0; i < sizeof(line_in); i++)
155d0cef73dSGregory Neil Shapiro 		line_in[i] = '\0';
156d0cef73dSGregory Neil Shapiro 	for (i = 0; i < sizeof(line_in) / 2; i++)
157d0cef73dSGregory Neil Shapiro 	{
158d0cef73dSGregory Neil Shapiro 		char ch;
159d0cef73dSGregory Neil Shapiro 
160d0cef73dSGregory Neil Shapiro 		ch = 0200 + i;
161d0cef73dSGregory Neil Shapiro 		if ('\0' == ch)
162d0cef73dSGregory Neil Shapiro 			ch = '0';
163d0cef73dSGregory Neil Shapiro 		line_in[i] = ch;
164d0cef73dSGregory Neil Shapiro 	}
165d0cef73dSGregory Neil Shapiro 	los = sizeof(line_in);
1662fb4f839SGregory Neil Shapiro 	obp = quote_unquote(line_in, line_in, los, 0, mode);
167d0cef73dSGregory Neil Shapiro 	if (obp != line_in)
168d0cef73dSGregory Neil Shapiro 		SM_FREE(obp);
169d0cef73dSGregory Neil Shapiro 
170d0cef73dSGregory Neil Shapiro 	for (i = 0; inout[i].qic_in != NULL; i++)
171d0cef73dSGregory Neil Shapiro 	{
172d0cef73dSGregory Neil Shapiro 		los = sizeof(line_out) / 2;
173d0cef73dSGregory Neil Shapiro 		obp = quote_unquote(inout[i].qic_in, line_out, los,
1742fb4f839SGregory Neil Shapiro 				inout[i].qic_exp, mode);
175d0cef73dSGregory Neil Shapiro 		cmp = strcmp(inout[i].qic_out, obp);
176d0cef73dSGregory Neil Shapiro 		SM_TEST(inout[i].qic_exp == cmp);
177d0cef73dSGregory Neil Shapiro 		if (inout[i].qic_exp != cmp && !SmTestVerbose)
178d0cef73dSGregory Neil Shapiro 		{
179d0cef73dSGregory Neil Shapiro 			char *bp;
180d0cef73dSGregory Neil Shapiro 
181d0cef73dSGregory Neil Shapiro 			bp = str2prt(obp);
182d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "got: %s\n", bp);
183d0cef73dSGregory Neil Shapiro 			bp = str2prt(inout[i].qic_out);
184d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "exp:%s\n", bp);
185d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "cmp=%d\n", cmp);
186d0cef73dSGregory Neil Shapiro 			show_diff(inout[i].qic_in, inout[i].qic_out);
187d0cef73dSGregory Neil Shapiro 		}
188d0cef73dSGregory Neil Shapiro 		if (obp != line_out)
189d0cef73dSGregory Neil Shapiro 			SM_FREE(obp);
190d0cef73dSGregory Neil Shapiro 	}
191d0cef73dSGregory Neil Shapiro 
192d0cef73dSGregory Neil Shapiro 	/* use same buffer for in and out */
193d0cef73dSGregory Neil Shapiro 	for (i = 0; inout[i].qic_in != NULL; i++)
194d0cef73dSGregory Neil Shapiro 	{
195d0cef73dSGregory Neil Shapiro 		bool same;
196d0cef73dSGregory Neil Shapiro 
197d0cef73dSGregory Neil Shapiro 		same = strcmp(inout[i].qic_in, inout[i].qic_out) == 0;
198d0cef73dSGregory Neil Shapiro 		los = sm_strlcpy(line, inout[i].qic_in, sizeof(line));
199d0cef73dSGregory Neil Shapiro 		SM_TEST(los + 1 < sizeof(line));
200d0cef73dSGregory Neil Shapiro 		++los;
2012fb4f839SGregory Neil Shapiro 		obp = quote_unquote(line, line, los, inout[i].qic_exp, mode);
202d0cef73dSGregory Neil Shapiro 		cmp = strcmp(inout[i].qic_out, obp);
203d0cef73dSGregory Neil Shapiro 		SM_TEST(inout[i].qic_exp == cmp);
204d0cef73dSGregory Neil Shapiro 		if (inout[i].qic_exp != cmp && !SmTestVerbose)
205d0cef73dSGregory Neil Shapiro 		{
206d0cef73dSGregory Neil Shapiro 			char *bp;
207d0cef73dSGregory Neil Shapiro 
208d0cef73dSGregory Neil Shapiro 			bp = str2prt(obp);
209d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "got: %s\n", bp);
210d0cef73dSGregory Neil Shapiro 			bp = str2prt(inout[i].qic_out);
211d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "exp:%s\n", bp);
212d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "cmp=%d\n", cmp);
213d0cef73dSGregory Neil Shapiro 			show_diff(inout[i].qic_in, inout[i].qic_out);
214d0cef73dSGregory Neil Shapiro 		}
215d0cef73dSGregory Neil Shapiro 		if (obp != line)
216d0cef73dSGregory Neil Shapiro 		{
217d0cef73dSGregory Neil Shapiro 			SM_TEST(!same);
218d0cef73dSGregory Neil Shapiro 			if (same)
219d0cef73dSGregory Neil Shapiro 				show_diff(obp, inout[i].qic_out);
220d0cef73dSGregory Neil Shapiro 			SM_FREE(obp);
221d0cef73dSGregory Neil Shapiro 		}
222d0cef73dSGregory Neil Shapiro 	}
223d0cef73dSGregory Neil Shapiro 
224d0cef73dSGregory Neil Shapiro 	/* use NULL buffer for out */
225d0cef73dSGregory Neil Shapiro 	for (i = 0; inout[i].qic_in != NULL; i++)
226d0cef73dSGregory Neil Shapiro 	{
227d0cef73dSGregory Neil Shapiro 		los = 0;
228d0cef73dSGregory Neil Shapiro 		obp = quote_unquote(inout[i].qic_in, NULL, los,
2292fb4f839SGregory Neil Shapiro 				inout[i].qic_exp, mode);
230d0cef73dSGregory Neil Shapiro 		SM_TEST(obp != NULL);
231d0cef73dSGregory Neil Shapiro 		cmp = strcmp(inout[i].qic_out, obp);
232d0cef73dSGregory Neil Shapiro 		SM_TEST(inout[i].qic_exp == cmp);
233d0cef73dSGregory Neil Shapiro 		if (inout[i].qic_exp != cmp && !SmTestVerbose)
234d0cef73dSGregory Neil Shapiro 		{
235d0cef73dSGregory Neil Shapiro 			char *bp;
236d0cef73dSGregory Neil Shapiro 
237d0cef73dSGregory Neil Shapiro 			bp = str2prt(obp);
238d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "got: %s\n", bp);
239d0cef73dSGregory Neil Shapiro 			bp = str2prt(inout[i].qic_out);
240d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "exp:%s\n", bp);
241d0cef73dSGregory Neil Shapiro 			fprintf(stderr, "cmp=%d\n", cmp);
242d0cef73dSGregory Neil Shapiro 			show_diff(inout[i].qic_in, inout[i].qic_out);
243d0cef73dSGregory Neil Shapiro 		}
244d0cef73dSGregory Neil Shapiro 	}
245d0cef73dSGregory Neil Shapiro 
246*d39bd2c1SGregory Neil Shapiro 	los = -1;
247*d39bd2c1SGregory Neil Shapiro 	obp = quote_internal_chars(NULL, NULL, &los, NULL);
248*d39bd2c1SGregory Neil Shapiro 	SM_TEST(NULL == obp);
249*d39bd2c1SGregory Neil Shapiro 	SM_TEST(-1 == los);
250*d39bd2c1SGregory Neil Shapiro 
251*d39bd2c1SGregory Neil Shapiro 	sm_strlcpy(line_in, "nothing", sizeof(line_in));
252*d39bd2c1SGregory Neil Shapiro 	los = -123;
253*d39bd2c1SGregory Neil Shapiro 	obp = quote_internal_chars(line_in, NULL, &los, NULL);
254*d39bd2c1SGregory Neil Shapiro 	SM_TEST(NULL != obp);
255*d39bd2c1SGregory Neil Shapiro 	SM_TEST(los > 0);
256*d39bd2c1SGregory Neil Shapiro 
257d0cef73dSGregory Neil Shapiro 	return sm_test_end();
258d0cef73dSGregory Neil Shapiro }
259