LCOV - code coverage report
Current view: top level - source3/lib - substitute_generic.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 35 43 81.4 %
Date: 2024-04-21 15:09:00 Functions: 2 2 100.0 %

          Line data    Source code
       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      561170 : 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             : {
      40        3987 :         char *p, *in;
      41        3987 :         char *s;
      42        3987 :         ssize_t ls,lp,li,ld, i;
      43             : 
      44      561170 :         if (!insert || !pattern || !*pattern || !string || !*string)
      45           0 :                 return NULL;
      46             : 
      47      561170 :         s = string;
      48             : 
      49      561170 :         in = talloc_strdup(talloc_tos(), insert);
      50      561170 :         if (!in) {
      51           0 :                 DEBUG(0, ("realloc_string_sub: out of memory!\n"));
      52           0 :                 return NULL;
      53             :         }
      54      561170 :         ls = (ssize_t)strlen(s);
      55      561170 :         lp = (ssize_t)strlen(pattern);
      56      561170 :         li = (ssize_t)strlen(insert);
      57      561170 :         ld = li - lp;
      58     4611664 :         for (i=0;i<li;i++) {
      59     4050494 :                 switch (in[i]) {
      60        4276 :                         case '$':
      61             :                                 /* allow a trailing $
      62             :                                  * (as in machine accounts) */
      63        4276 :                                 if (allow_trailing_dollar && (i == li - 1 )) {
      64           0 :                                         break;
      65             :                                 }
      66           0 :                                 FALL_THROUGH;
      67             :                         case '`':
      68             :                         case '"':
      69             :                         case '\'':
      70             :                         case ';':
      71             :                         case '%':
      72             :                         case '\r':
      73             :                         case '\n':
      74        4276 :                                 if ( remove_unsafe_characters ) {
      75        4276 :                                         in[i] = '_';
      76        4276 :                                         break;
      77             :                                 }
      78             :                                 FALL_THROUGH;
      79             :                         default:
      80             :                                 /* ok */
      81     4003059 :                                 break;
      82             :                 }
      83             :         }
      84             : 
      85     1122340 :         while ((p = strstr_m(s,pattern))) {
      86      561170 :                 if (ld > 0) {
      87      467925 :                         int offset = PTR_DIFF(s,string);
      88      467925 :                         string = talloc_realloc(NULL, string, char, ls + ld + 1);
      89      467925 :                         if (!string) {
      90           0 :                                 DEBUG(0, ("realloc_string_sub: "
      91             :                                         "out of memory!\n"));
      92           0 :                                 talloc_free(in);
      93           0 :                                 return NULL;
      94             :                         }
      95      467925 :                         p = string + offset + (p - s);
      96             :                 }
      97      561170 :                 if (li != lp) {
      98      561170 :                         memmove(p+li,p+lp,strlen(p+lp)+1);
      99             :                 }
     100      561170 :                 memcpy(p, in, li);
     101      561170 :                 s = p + li;
     102      561170 :                 ls += ld;
     103             :         }
     104      561170 :         talloc_free(in);
     105      561170 :         return string;
     106             : }
     107             : 
     108      561170 : char *realloc_string_sub(char *string,
     109             :                         const char *pattern,
     110             :                         const char *insert)
     111             : {
     112      561170 :         return realloc_string_sub2(string, pattern, insert, true, false);
     113             : }

Generated by: LCOV version 1.14