1# Date: Mon, 27 Feb 2006 12:35:30 +0900 2# From: KIMURA Koichi <kimura.koichi@canon.co.jp> 3# Subject: gawk: sub_common has multi-byte aware bug 4# To: bug-gawk@gnu.org 5# Message-id: <20060227121045.2198.KIMURA.KOICHI@canon.co.jp> 6# 7# Hi, 8# 9# A certain user faced bug of sub builtin function and report to me. 10# Then I investigated the bug. 11# 12# reproduce script is here. 13 14BEGIN { 15 str = "type=\"directory\" version=\"1.0\"" 16 #print "BEGIN:", str 17 18 while (str) { 19 sub(/^[^=]*/, "", str); 20 s = substr(str, 2) 21 print s 22 sub(/^="[^"]*"/, "", str) 23 sub(/^[ \t]*/, "", str) 24 } 25} 26 27# and sample result is here (on GNU/Linux Fedora core 3) 28# 29# [kbk@skuld gawk-3.1.5]$ LC_ALL=C ./gawk -f subbug.awk 30# "directory" version="1.0" 31# "1.0" 32# [kbk@skuld gawk-3.1.5]$ LC_ALL=en_US.UTF-8 ./gawk -f subbug.awk 33# "directory" version="1.0" 34# "dire 35# [kbk@skuld gawk-3.1.5]$ 36# 37# In my investigation, this bug is cause by don't release wide-string when 38# sub is executed. 39# 40# patch is here. 41# 42# --- builtin.c.orig 2005-07-27 03:07:43.000000000 +0900 43# +++ builtin.c 2006-02-26 02:07:52.000000000 +0900 44# @@ -2463,6 +2468,15 @@ sub_common(NODE *tree, long how_many, in 45# t->stptr = buf; 46# t->stlen = textlen; 47# 48# +#ifdef MBS_SUPPORT 49# + if (t->flags & WSTRCUR) { 50# + if (t->wstptr != NULL) 51# + free(t->wstptr); 52# + t->wstptr = NULL; 53# + t->wstlen = 0; 54# + t->flags &= ~WSTRCUR; 55# + } 56# +#endif 57# free_temp(s); 58# if (matches > 0 && lhs) { 59# if (priv) { 60# 61# 62# -- 63# KIMURA Koichi 64# 65# 66# ##################################################################################### 67# This Mail Was Scanned by 012.net AntiVirus Service1- Powered by TrendMicro Interscan 68# 69