summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/util_str.c23
-rw-r--r--source3/lib/util_unistr.c14
2 files changed, 19 insertions, 18 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;
diff --git a/source3/lib/util_unistr.c b/source3/lib/util_unistr.c
index 58ecc19723..d9bd4a4c06 100644
--- a/source3/lib/util_unistr.c
+++ b/source3/lib/util_unistr.c
@@ -3,6 +3,7 @@
Version 3.0
Samba utility functions
Copyright (C) Andrew Tridgell 1992-2001
+ Copyright (C) Simo Sorce 2001
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -476,6 +477,7 @@ smb_ucs2_t *strcat_w(smb_ucs2_t *dest, const smb_ucs2_t *src)
return dest;
}
+
/*******************************************************************
replace any occurence of oldc with newc in unicode string
********************************************************************/
@@ -495,7 +497,7 @@ BOOL trim_string_w(smb_ucs2_t *s, const smb_ucs2_t *front,
const smb_ucs2_t *back)
{
BOOL ret = False;
- size_t len, lw, front_len, flw, back_len, blw;
+ size_t len, front_len, back_len;
if (!s || !*s) return False;
@@ -503,24 +505,18 @@ BOOL trim_string_w(smb_ucs2_t *s, const smb_ucs2_t *front,
if (front && *front) {
front_len = strlen_w(front);
- flw = front_len * sizeof(smb_ucs2_t);
- lw = (len + 1) * sizeof(smb_ucs2_t);
while (len && strncmp_w(s, front, front_len) == 0) {
- memcpy(s, s + flw, lw - flw);
+ memmove(s, (s + front_len), (len - front_len + 1) * sizeof(smb_ucs2_t));
len -= front_len;
- lw -= flw;
ret = True;
}
}
if (back && *back) {
back_len = strlen_w(back);
- blw = back_len * sizeof(smb_ucs2_t);
- lw = len * sizeof(smb_ucs2_t);
- while (len && strncmp_w(s + lw - blw, back, back_len) == 0) {
+ while (len && strncmp_w((s + (len - back_len)), back, back_len) == 0) {
s[len - back_len] = 0;
len -= back_len;
- lw -= blw;
ret = True;
}
}