Iconv a znaky mimo kodovani - bug?

Slavek Banko slavek.banko na quick.cz
Neděle Leden 19 23:44:51 CET 2003


Hmm, tak nedeterministické chování? No, zajímavá teorie. Jenže já na 
takové tajemno nevěřím ;-) A tak jsem si stáhnul zdrojový kód recode, 
našel soubor, na kterém se chyba projeví, pak zalovil ve zdrojových 
kódech a vyprodukoval následující (miniaturní) záplatu:

--- recode-3.6.orig/src/libiconv.c	Sat Jul  1 19:13:25 2000
+++ recode-3.6/src/libiconv.c	Sat Jan 18 17:05:26 2003
@@ -195,9 +195,9 @@
 	 memcpy() doesn't do here, because the regions might overlap.
 	 memmove() isn't worth it, because we rarely have to move more
 	 than 12 bytes.  */
+      cursor = input_buffer;
       if (input > input_buffer && input_left > 0)
 	{
-	  cursor = input_buffer;
 	  do
 	    *cursor++ = *input++;
 	  while (--input_left > 0);

A je po problému... Zkrátka stroje se chovají jen tak, jak jim jejich pán 
nařídí. A používat jednu proměnnou pro více účelů se buď nevyplácí nebo 
vyžaduje větší obezřetnost (v tomto případě byla proměnná cursor 
používána jak při čtení ze vstupního bufferu, tak při vyprazdňovaní 
výstupního bufferu).

A pak že má "peak" vždycky pravdu :-))

Pozn: Už hledám správnou adresu, abych uvedenou záplatu poslal i 
příslušnému údržbáři recode... a až budu více on-line (zřejmě v úterý), 
tak vystavím aktualizované rpm balíčky na http://www.axis.cz/linux/

Na mailovanou se těší
Slávek.

Dne út 31. prosinec 2002 18:45 Pavel Kankovsky napsal(a):
> On Sun, 29 Dec 2002, Slavek Banko wrote:
> > Nedávno jsem byl zaskočen podobným - recode. Bez chybových hlášení
> > soubor převedlo, ale část "snědlo". Když jsem mu předhazoval
> > jednotlivé řádky (shell - while+read), tak k žádnému problému
> > nedošlo. Jednotlivé řádky nebyly nijak dlouhé ani zvláštní (sql
> > příkazy). Také jsem se zatím nedostal k tomu, abych zjišťoval, kde je
> > problém...
>
> Neco podobneho jsem uz videl. Detaily si nepamatuju, ale pointa byla
> v tom, ze kdyz se do daneho programu cpal vstup maximalni moznou
> rychlosti, tak se to nedeterministicky dostavalo do stavu, kdy se na
> nekde (asi na vystupu) zcela naplnily buffery, kterazto zridka se
> vyskytujici situace byla chybne osetrena a cast dat byla presmerovana
> do nejblizsi cerne diry.
>
> --Pavel Kankovsky aka Peak  [ Boycott
> Microsoft--http://www.vcnet.com/bms ] "Resistance is futile. Open your
> source code and prepare for assimilation."
>


Další informace o konferenci Linux