diff options
-rw-r--r-- | source3/lib/util_str.c | 23 | ||||
-rw-r--r-- | source3/lib/util_unistr.c | 14 |
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; } } |