summaryrefslogtreecommitdiff
path: root/source3/lib/util_str.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/util_str.c')
-rw-r--r--source3/lib/util_str.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index 4c17d1f08b..d7e6fa0781 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -753,18 +753,18 @@ smb_ucs2_t *all_string_sub_w(smb_ucs2_t *s, const smb_ucs2_t *pattern,
const smb_ucs2_t *insert)
{
smb_ucs2_t *r, *rp, *sp;
- size_t ls, lp, li, lt;
+ size_t lr, lp, li, lt;
if (!insert || !pattern || !*pattern || !s) return NULL;
- ls = lt = (size_t)strlen_w(s) * sizeof(smb_ucs2_t);
- lp = (size_t)strlen_w(pattern) * sizeof(smb_ucs2_t);
- li = (size_t)strlen_w(insert) * sizeof(smb_ucs2_t);
+ lt = (size_t)strlen_w(s);
+ lp = (size_t)strlen_w(pattern);
+ li = (size_t)strlen_w(insert);
if (li > lp) {
smb_ucs2_t *st = s;
int ld = li - lp;
- while (sp = strstr_w(st, pattern)) {
+ while ((sp = strstr_w(st, pattern))) {
st = sp + lp;
lt += ld;
}
@@ -776,13 +776,18 @@ smb_ucs2_t *all_string_sub_w(smb_ucs2_t *s, const smb_ucs2_t *pattern,
return NULL;
}
- while (sp = strstr_w(s, pattern)) {
- memcpy(rp, s, sp - s);
- rp += (sp - s);
- memcpy(rp, insert, li);
+ while ((sp = strstr_w(s, pattern))) {
+ memcpy(rp, s, (sp - s));
+ rp += ((sp - s) / sizeof(smb_ucs2_t));
+ memcpy(rp, insert, (li * sizeof(smb_ucs2_t)));
s = sp + lp;
rp += li;
}
+ lr = ((rp - r) / sizeof(smb_ucs2_t));
+ if (lr < lt) {
+ memcpy(rp, s, ((lt - lr) * sizeof(smb_ucs2_t)));
+ rp += (lt - lr);
+ }
*rp = 0;
return r;