/src/samba/source3/lib/substitute_generic.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | Unix SMB/CIFS implementation. |
3 | | Samba utility functions |
4 | | |
5 | | Copyright (C) Andrew Tridgell 1992-2001 |
6 | | Copyright (C) Simo Sorce 2001-2002 |
7 | | Copyright (C) Martin Pool 2003 |
8 | | Copyright (C) James Peach 2006 |
9 | | Copyright (C) Jeremy Allison 1992-2007 |
10 | | |
11 | | This program is free software; you can redistribute it and/or modify |
12 | | it under the terms of the GNU General Public License as published by |
13 | | the Free Software Foundation; either version 3 of the License, or |
14 | | (at your option) any later version. |
15 | | |
16 | | This program is distributed in the hope that it will be useful, |
17 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | | GNU General Public License for more details. |
20 | | |
21 | | You should have received a copy of the GNU General Public License |
22 | | along with this program. If not, see <http://www.gnu.org/licenses/>. |
23 | | */ |
24 | | |
25 | | #include "includes.h" |
26 | | |
27 | | /** |
28 | | Similar to string_sub2, but it will accept only allocated strings |
29 | | and may realloc them so pay attention at what you pass on no |
30 | | pointers inside strings, no const may be passed |
31 | | as string. |
32 | | **/ |
33 | | |
34 | | char *realloc_string_sub2(char *string, |
35 | | const char *pattern, |
36 | | const char *insert, |
37 | | bool remove_unsafe_characters, |
38 | | bool allow_trailing_dollar) |
39 | 0 | { |
40 | 0 | char *p, *in; |
41 | 0 | char *s; |
42 | 0 | ssize_t ls,lp,li,ld, i; |
43 | |
|
44 | 0 | if (!insert || !pattern || !*pattern || !string || !*string) |
45 | 0 | return NULL; |
46 | | |
47 | 0 | s = string; |
48 | |
|
49 | 0 | in = talloc_strdup(talloc_tos(), insert); |
50 | 0 | if (!in) { |
51 | 0 | DEBUG(0, ("realloc_string_sub: out of memory!\n")); |
52 | 0 | return NULL; |
53 | 0 | } |
54 | 0 | ls = (ssize_t)strlen(s); |
55 | 0 | lp = (ssize_t)strlen(pattern); |
56 | 0 | li = (ssize_t)strlen(insert); |
57 | 0 | ld = li - lp; |
58 | 0 | for (i=0;i<li;i++) { |
59 | 0 | switch (in[i]) { |
60 | 0 | case '$': |
61 | | /* allow a trailing $ |
62 | | * (as in machine accounts) */ |
63 | 0 | if (allow_trailing_dollar && (i == li - 1 )) { |
64 | 0 | break; |
65 | 0 | } |
66 | 0 | FALL_THROUGH; |
67 | 0 | case '`': |
68 | 0 | case '"': |
69 | 0 | case '\'': |
70 | 0 | case ';': |
71 | 0 | case '%': |
72 | 0 | case '\r': |
73 | 0 | case '\n': |
74 | 0 | if ( remove_unsafe_characters ) { |
75 | 0 | in[i] = '_'; |
76 | 0 | break; |
77 | 0 | } |
78 | 0 | FALL_THROUGH; |
79 | 0 | default: |
80 | | /* ok */ |
81 | 0 | break; |
82 | 0 | } |
83 | 0 | } |
84 | | |
85 | 0 | while ((p = strstr_m(s,pattern))) { |
86 | 0 | if (ld > 0) { |
87 | 0 | int offset = PTR_DIFF(s,string); |
88 | 0 | string = talloc_realloc(NULL, string, char, ls + ld + 1); |
89 | 0 | if (!string) { |
90 | 0 | DEBUG(0, ("realloc_string_sub: " |
91 | 0 | "out of memory!\n")); |
92 | 0 | talloc_free(in); |
93 | 0 | return NULL; |
94 | 0 | } |
95 | 0 | p = string + offset + (p - s); |
96 | 0 | } |
97 | 0 | if (li != lp) { |
98 | 0 | memmove(p+li,p+lp,strlen(p+lp)+1); |
99 | 0 | } |
100 | 0 | memcpy(p, in, li); |
101 | 0 | s = p + li; |
102 | 0 | ls += ld; |
103 | 0 | } |
104 | 0 | talloc_free(in); |
105 | 0 | return string; |
106 | 0 | } |
107 | | |
108 | | char *realloc_string_sub(char *string, |
109 | | const char *pattern, |
110 | | const char *insert) |
111 | 0 | { |
112 | 0 | return realloc_string_sub2(string, pattern, insert, true, false); |
113 | 0 | } |