From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <4432300C.2080605@elecom.ru> Date: Tue, 04 Apr 2006 01:36:28 -0700 From: Dmitry Vodennikov User-Agent: Thunderbird 1.5 (Windows/20051201) MIME-Version: 1.0 To: shigorin@gmail.com, ALT Linux Community References: <442CC26D.50908@elecom.ru> <20060331150425.GB16525@wrars-comp.wrarsdomain> <442E1560.9000401@elecom.ru> <20060403094313.GK1617@osdn.org.ua> In-Reply-To: <20060403094313.GK1617@osdn.org.ua> Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Comm] alm2.4 "watch" bug? X-BeenThere: community@lists.altlinux.org X-Mailman-Version: 2.1.7 Precedence: list Reply-To: ALT Linux Community List-Id: ALT Linux Community List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Apr 2006 08:36:42 -0000 Archived-At: List-Archive: List-Post: Michael Shigorin пишет: > On Fri, Mar 31, 2006 at 09:53:36PM -0800, Dmitry Vodennikov wrote: >>> * Срд Авг 11 2004 Stanislav Ievlev 2.0.10-alt4.1 >>> - setlocale in watch to see output with national symbols (e.g. russian) >>> Не оно? >> Не похоже. > > Как по мне -- так похоже, в корне-то не-ASCII нет небось. > Повесьте эти письма в bugzilla на ALM2.4, что ли. > Я щас повешу багу с локализованной проблемой и решением. Проблема с watch.c состоит в следующем. Смотрим watch.c ------------------------------------------------- command = strdup(argv[optind++]); command_length = strlen(command); for (; optind < argc; optind++) { int s = strlen(argv[optind]); char *endp = &command[command_length]; *endp = ' '; command_length += s + 1; command = realloc(command, command_length + 1); strcpy(endp + 1, argv[optind]); } ------------------------------------------------- man realloc говорит нам вот что realloc() returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr собственно, так оно и видно под отладчиком. realloc возвращает совершенно другой указатель, что в сочетании с установкой endp ДО realloc и записью в *endp ПОСЛЕ realloc приводит к неожиданным эффектам. у меня например это приводило к segmentation fault, если параметр у ls длиннее 8 символов. Т.е. export LANG=ru_RU.CP1251 watch ls 12345678 работает, а export LANG=ru_RU.CP1251 watch ls 123456789 уже нет Ну собственно остается только сказать что в сизифном procsp этот кусок уже переделан вот так: ------------------------------------------------- char *endp; int s = strlen(argv[optind]); command = realloc(command, command_length + s + 2); /* space and \0 */ endp = command + command_length; *endp = ' '; memcpy(endp + 1, argv[optind], s); command_length += 1 + s; /* space then string length */ command[command_length] = '\0'; -------------------------------------------------