1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-27 14:04:05 +03:00

changed string_sub() to replace " ; and ` in the inserted string with _

use all_string_sub() if you don't want this.
This commit is contained in:
Andrew Tridgell -
parent bdcee2557b
commit a3357ab493
4 changed files with 59 additions and 25 deletions

View File

@ -415,7 +415,8 @@ BOOL in_list(char *s,char *list,BOOL casesensitive);
BOOL string_init(char **dest,const char *src);
void string_free(char **s);
BOOL string_set(char **dest,const char *src);
BOOL string_sub(char *s,const char *pattern,const char *insert);
void string_sub(char *s,const char *pattern,const char *insert);
void all_string_sub(char *s,const char *pattern,const char *insert);
void split_at_last_component(char *path, char *front, char sep, char *back);
/*The following definitions come from lib/util_unistr.c */

View File

@ -990,6 +990,7 @@ BOOL string_set(char **dest,const char *src)
return(string_init(dest,src));
}
/****************************************************************************
substitute a string for a pattern in another string. Make sure there is
enough room!
@ -997,31 +998,63 @@ enough room!
This routine looks for pattern in s and replaces it with
insert. It may do multiple replacements.
return True if a substitution was done.
any of " ; or ` in the insert string are replaced with _
****************************************************************************/
BOOL string_sub(char *s,const char *pattern,const char *insert)
void string_sub(char *s,const char *pattern,const char *insert)
{
BOOL ret = False;
char *p;
size_t ls,lp,li;
char *p;
size_t ls,lp,li, i;
if (!insert || !pattern || !s) return(False);
if (!insert || !pattern || !s) return;
ls = strlen(s);
lp = strlen(pattern);
li = strlen(insert);
ls = strlen(s);
lp = strlen(pattern);
li = strlen(insert);
if (!*pattern) return(False);
if (!*pattern) return;
while (lp <= ls && (p = strstr(s,pattern))) {
memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
for (i=0;i<li;i++) {
switch (insert[i]) {
case '`':
case '"':
case ';':
p[i] = '_';
break;
default:
p[i] = insert[i];
}
}
s = p + li;
ls += (li-lp);
}
}
while (lp <= ls && (p = strstr(s,pattern)))
{
ret = True;
memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
memcpy(p,insert,li);
s = p + li;
ls = strlen(s);
}
return(ret);
/****************************************************************************
similar to string_sub() but allows for any character to be substituted.
Use with caution!
****************************************************************************/
void all_string_sub(char *s,const char *pattern,const char *insert)
{
char *p;
size_t ls,lp,li, i;
if (!insert || !pattern || !s) return;
ls = strlen(s);
lp = strlen(pattern);
li = strlen(insert);
if (!*pattern) return;
while (lp <= ls && (p = strstr(s,pattern))) {
memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
memcpy(p, insert, li);
s = p + li;
ls += (li-lp);
}
}
/****************************************************************************

View File

@ -434,12 +434,12 @@ BOOL chgpasswd(char *name,char *oldpass,char *newpass, BOOL as_root)
}
string_sub(passwordprogram,"%u",name);
string_sub(passwordprogram,"%o",oldpass);
string_sub(passwordprogram,"%n",newpass);
all_string_sub(passwordprogram,"%o",oldpass);
all_string_sub(passwordprogram,"%n",newpass);
string_sub(chatsequence,"%u",name);
string_sub(chatsequence,"%o",oldpass);
string_sub(chatsequence,"%n",newpass);
all_string_sub(chatsequence,"%o",oldpass);
all_string_sub(chatsequence,"%n",newpass);
return(chat_with_program(passwordprogram,name,chatsequence, as_root));
}

View File

@ -26,7 +26,7 @@ static char *tstring(time_t t)
{
static pstring buf;
pstrcpy(buf, asctime(LocalTime(&t)));
string_sub(buf," ","&nbsp;");
all_string_sub(buf," ","&nbsp;");
return buf;
}