2 * Copyright (c) 2006, 2023 Proofpoint, Inc. and its suppliers.
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
11 SM_IDSTR(id, "@(#)$Id: t-qic.c,v 1.10 2013-11-22 20:51:43 ca Exp $")
14 #include <sm/sendmail.h>
15 #include <sm/assert.h>
17 #include <sm/string.h>
20 extern bool SmTestVerbose;
29 for (i = 0; s1[i] != '\0' && s2[i] != '\0'; i++)
33 fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
34 i, (unsigned char) s1[i],
35 (unsigned char) s2[i]);
41 fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
42 i, (unsigned char) s1[i], (unsigned char) s2[i]);
46 char *quote_unquote __P((char *, char *, int, int, int));
49 quote_unquote(in, out, outlen, exp, mode)
61 sm_strlcpy(line_in, in, sizeof(line_in));
62 obp = quote_internal_chars(in, out, &outlen, NULL);
63 bp = str2prt(line_in);
65 dequote_internal_chars(obp, line_back, sizeof(line_back));
67 dequote_internal_chars(obp, line_back, strlen(obp));
69 dequote_internal_chars(obp, line_back, strlen(obp) + 1);
70 cmp = strcmp(line_in, line_back);
72 if (cmp != exp && !SmTestVerbose)
74 fprintf(stderr, "in: %s\n", bp);
75 bp = str2prt(line_back);
76 fprintf(stderr, "out:%s\n", bp);
77 fprintf(stderr, "cmp=%d\n", cmp);
78 show_diff(in, line_back);
82 fprintf(stderr, "%s -> ", bp);
84 fprintf(stderr, "%s\n", bp);
85 fprintf(stderr, "cmp=%d\n", cmp);
97 typedef struct sm_qic_S sm_qic_T;
105 char line_in[1024], line[256], line_out[32], *obp;
106 int i, los, cmp, mode;
110 , { "\tuser", "\tuser", 0 }
111 , { "abcdef", "abcdef", 0 }
112 , { "01234567890123456789", "01234567890123456789", 0 }
114 , { "\\A", "\\A", 0 }
115 , { "01234567890123456789\001", "01234567890123456789\001",
117 , { "012345\2067890123456789", "012345\377\2067890123456789",
119 , { "\377", "\377\377", 0 }
120 , { "\240", "\240", 0 }
121 , { "\220", "\377\220", 0 }
122 , { "\240\220", "\240\377\220", 0 }
123 , { "\377\377", "\377\377\377\377", 0 }
124 , { "\377a\377b", "\377\377a\377\377b", 0 }
125 , { "\376a\377b", "\376a\377\377b", 0 }
126 , { "\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",
127 "\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",
132 sm_test_begin(argc, argv, "test meta quoting");
135 mode = atoi(argv[1]);
136 for (i = 0; i < sizeof(line_out); i++)
138 for (i = 0; i < sizeof(line_in); i++)
140 for (i = 0; i < sizeof(line_in) / 2; i++)
149 los = sizeof(line_out) / 2;
150 obp = quote_unquote(line_in, line_out, los, 0, mode);
154 for (i = 0; i < sizeof(line_in); i++)
156 for (i = 0; i < sizeof(line_in) / 2; i++)
165 los = sizeof(line_in);
166 obp = quote_unquote(line_in, line_in, los, 0, mode);
170 for (i = 0; inout[i].qic_in != NULL; i++)
172 los = sizeof(line_out) / 2;
173 obp = quote_unquote(inout[i].qic_in, line_out, los,
174 inout[i].qic_exp, mode);
175 cmp = strcmp(inout[i].qic_out, obp);
176 SM_TEST(inout[i].qic_exp == cmp);
177 if (inout[i].qic_exp != cmp && !SmTestVerbose)
182 fprintf(stderr, "got: %s\n", bp);
183 bp = str2prt(inout[i].qic_out);
184 fprintf(stderr, "exp:%s\n", bp);
185 fprintf(stderr, "cmp=%d\n", cmp);
186 show_diff(inout[i].qic_in, inout[i].qic_out);
192 /* use same buffer for in and out */
193 for (i = 0; inout[i].qic_in != NULL; i++)
197 same = strcmp(inout[i].qic_in, inout[i].qic_out) == 0;
198 los = sm_strlcpy(line, inout[i].qic_in, sizeof(line));
199 SM_TEST(los + 1 < sizeof(line));
201 obp = quote_unquote(line, line, los, inout[i].qic_exp, mode);
202 cmp = strcmp(inout[i].qic_out, obp);
203 SM_TEST(inout[i].qic_exp == cmp);
204 if (inout[i].qic_exp != cmp && !SmTestVerbose)
209 fprintf(stderr, "got: %s\n", bp);
210 bp = str2prt(inout[i].qic_out);
211 fprintf(stderr, "exp:%s\n", bp);
212 fprintf(stderr, "cmp=%d\n", cmp);
213 show_diff(inout[i].qic_in, inout[i].qic_out);
219 show_diff(obp, inout[i].qic_out);
224 /* use NULL buffer for out */
225 for (i = 0; inout[i].qic_in != NULL; i++)
228 obp = quote_unquote(inout[i].qic_in, NULL, los,
229 inout[i].qic_exp, mode);
230 SM_TEST(obp != NULL);
231 cmp = strcmp(inout[i].qic_out, obp);
232 SM_TEST(inout[i].qic_exp == cmp);
233 if (inout[i].qic_exp != cmp && !SmTestVerbose)
238 fprintf(stderr, "got: %s\n", bp);
239 bp = str2prt(inout[i].qic_out);
240 fprintf(stderr, "exp:%s\n", bp);
241 fprintf(stderr, "cmp=%d\n", cmp);
242 show_diff(inout[i].qic_in, inout[i].qic_out);
247 obp = quote_internal_chars(NULL, NULL, &los, NULL);
248 SM_TEST(NULL == obp);
251 sm_strlcpy(line_in, "nothing", sizeof(line_in));
253 obp = quote_internal_chars(line_in, NULL, &los, NULL);
254 SM_TEST(NULL != obp);
257 return sm_test_end();