annotate rvinterf/libprint/back_esc.c @ 1011:6d9b10633f10 default tip

etmsync Pirelli IMEI retrieval: fix poor use of printf() Bug reported by Vadim Yanitskiy <fixeria@osmocom.org>: the construct where a static-allocated string was passed to printf() without any format arguments causes newer compilers to report a security problem. Given that formatted output is not needed here, just fixed string output, change printf() to fputs(), and direct the error message to stderr while at it.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 23 May 2024 17:29:57 +0000
parents 6a0aa8d36d06
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
926
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * The function implemented in this module prints a potentially-dirty string
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * into a buffer with C-style backslash escapes, including doubling of any
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * already-present backslashes. The output buffer must be sized for up to
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * 4x expansion, plus the terminating NUL.
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 */
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <sys/types.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <ctype.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdio.h>
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 void
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 safe_print_trace(src, srclen, dest)
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 u_char *src;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 char *dest;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 int i, c;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 char *dp;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 dp = dest;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 for (i = 0; i < srclen; i++) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 c = src[i];
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 switch (c) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 case '\\':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 case '\r':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 *dp++ = 'r';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 case '\n':
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 *dp++ = '\\';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 *dp++ = 'n';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 continue;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 if (c >= ' ' && c <= '~')
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 *dp++ = c;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 else if (c <= 7 && (i+1 == srclen || !isdigit(src[i+1]))) {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 sprintf(dp, "\\%d", c);
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 dp += 2;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 } else {
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 sprintf(dp, "\\x%02X", c);
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 dp += 4;
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 }
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 *dp = '\0';
6a0aa8d36d06 rvinterf backslash escape: introduce libprint
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 }