abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 17:11 | Nová verze Fluttershy, yay! | Komentářů: 0
včera 10:33 | Nová verze

Mozilla.cz informuje o aktualizovaném českém slovníku pro kontrolu pravopisu pro Firefox, Thunderbird i SeaMonkey. K dispozici je na na serverech s doplňky (Firefox, Thunderbird, SeaMonkey).

Ladislav Hagara | Komentářů: 0
včera 10:11 | Nová verze

Byla vydána verze 0.52.1 open source počítačové hry Unvanquished (Wikipedie). Nově lze instalovat také z Flathubu. Unvanquished je fork počítačové hry Tremulous.

Ladislav Hagara | Komentářů: 0
včera 00:11 | Zajímavý projekt

Watchy jsou open source hodinky postaveny na ESP32-PICO-D4 s e-papírovým displejem s rozlišením 200x200 pixelů, s Wi-Fi a Bluetooth LE. Předobjednat je lze na Crowd Supply za 59 dolarů.

Ladislav Hagara | Komentářů: 1
20.6. 22:11 | Nová verze

OASIS oznamuje zveřejnění nejnovějšího standardu OASIS, který byl schválen členy 27. dubna 2021: Open Document Format for Office Applications (OpenDocument) Version 1.3. Formát OpenDocument je volně dostupný otevřený formát souborů dokumentů založený na XML pro kancelářské aplikace, který se používá pro dokumenty obsahující text, tabulky, grafy a grafické prvky. OpenDocument Format v1.3 je aktualizací mezinárodní normy verze 1.2

… více »
Zdeněk Crhonek | Komentářů: 4
19.6. 20:11 | Nová verze

Byl vydán Debian 10.10, tj. desátá opravná verze Debianu 10 s kódovým názvem Buster. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 10 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

Ladislav Hagara | Komentářů: 34
19.6. 16:33 | Nová verze

Tým pro zajištění kvality LibreOffice (QA) oznamuje, že LibreOffice 7.2 Beta1 je k dispozici k testování! LibreOffice 7.2 bude vydán jako finální verze v polovině srpna 2021, přičemž LibreOffice 7.2 Beta1 je druhou předběžnou verzí od zahájení vývoje verze 7.2 na konci listopadu 2020. Od předchozí verze LibreOffice 7.2 Alpha1 bylo do úložiště kódu odesláno 1163 revizí a opraveno 221 problémů. Podívejte se do poznámek k vydání, kde najdete nové funkce obsažené v této verzi LibreOffice.

Zdeněk Crhonek | Komentářů: 0
19.6. 00:33 | Zajímavý projekt

Rodina open source vstupních zařízení Ploopy se rozrostla o Ploopy Mini Trackball. Stavebnici lze předobjednat za 69,99 CAD (1 210 CZK).

Ladislav Hagara | Komentářů: 0
18.6. 15:44 | Nová verze

Byla vydána beta verze Linux Mintu 20.2 s kódovým jménem Uma. Na blogu Linux Mintu jsou hned tři oznámení. První o vydání Linux Mintu s prostředím Cinnamon, druhé o vydání Linux Mintu s prostředím MATE a třetí o vydání Linux Mintu s prostředím Xfce. Stejným způsobem jsou rozděleny také poznámky k vydání (Cinnamon, MATE, Xfce) a přehled novinek s náhledy (Cinnamon, MATE, Xfce). Linux Mint 20.2 bude podporován až do roku 2025.

Ladislav Hagara | Komentářů: 0
18.6. 08:00 | Nová verze

Byla vydána verze 1.53.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

Ladislav Hagara | Komentářů: 2
Používáte kalkulačku?
 (10%)
 (32%)
 (62%)
 (26%)
 (12%)
Celkem 251 hlasů
 Komentářů: 25, poslední 18.6. 07:59
Rozcestník

strcpy(): narušení \W v $PS1

18.12.2011 21:03 | Přečteno: 1676× | Programování | Výběrový blog | poslední úprava: 18.12.2011 21:06

Debian GNU/Linux Squeeze x86_64 obsahuje verzi Bashe, ve kterém se projevuje chyba při expanzi \W, v proměné $PS1, např. při vstupu do adresáře na první úrovni o velikosti čtyři znaky.

$ PS1="\W$ "
$ cd /boot
bott$ cd /home
hmee$ cd /proc
pocc$

Bugfix, vypadá následovně (String corruption using \W in prompt):

t = strrchr (t_string, '/');
if (t)
-    strcpy (t_string, t + 1);
+    memmove (t_string, t + 1, sizeof(t));

Na první pohled by si jeden řekl, v čem je problém, i při pohledu do implementace vypadá fce strcpy() tak jak jsem si jí představoval.

$ apt-get source eglibc
$ cd eglibc-2.11.2/string/
$ cpp strcpy.c

typedef long int ptrdiff_t;

char *
strcpy (dest, src)
     char *dest;
     const char *src;
{
  char c;
  char * s = (char *) (src);
  const ptrdiff_t off = (dest) - s - 1;
  size_t n;

  do
    {
      c = *s++;
      s[off] = c;
    }
  while (c != '\0');

  n = s - src;
  (void) (src + n);
  (void) (dest + n);

  return dest;
}

Ale v manuálové stránce k fci strcpy() píší, že se vstupní řetězce nesmí překrývat. Což mě nasměruje ke spuštění:

$ find -name 'strcpy.*'
./sysdeps/powerpc/powerpc32/strcpy.S
./sysdeps/powerpc/powerpc64/strcpy.S
./sysdeps/ia64/strcpy.S
./sysdeps/i386/i586/strcpy.S
./sysdeps/x86_64/strcpy.S
./sysdeps/x86_64/multiarch/strcpy.S
./sysdeps/s390/s390-64/strcpy.S
./sysdeps/s390/s390-32/strcpy.S
./sysdeps/sparc/sparc32/sparcv9/strcpy.S
./sysdeps/sparc/sparc32/strcpy.S
./sysdeps/sparc/sparc64/strcpy.S
./string/strcpy.c
./ports/sysdeps/vax/strcpy.s
./ports/sysdeps/alpha/strcpy.S

Při letmém pohledu do ./sysdeps/x86_64/strcpy.S už je nasnadě, že zakopaný pes je v optimalizacích pro architekturu x86_64, tj. implementace fce strcpy() přímo v assembleru.

Ponaučení, je lepší se přesvědčit, alespoň v manuálové stránce, že zamýšlené použití fce je přípustné, nežli střílet od boku. ;-)

Problém lze obejít tak, že se místo '\W' použije:

'$(basename $PWD)'
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

Fuky avatar 18.12.2011 21:05 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: strcpy(): narušení \W v $PS1
Příloha:
Příloha ./sysdeps/x86_64/strcpy.S.
18.12.2011 22:09 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: strcpy(): narušení \W v $PS1
Problém lze obejít tak, že se místo '\W' použije:
'$(basename $PWD)'

To bych nedoporučoval, protože by to znamenalo spuštění nového programu při každém zobrazení promptu. Praktičtější by bylo '${PWD##*/}'

18.12.2011 23:43 Kuk!
Rozbalit Rozbalit vše Re: strcpy(): narušení \W v $PS1
Hmm, k cemu je tam na konci

(void) (src + n);

(void) (dest + n);

?
Fuky avatar 19.12.2011 08:37 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: strcpy(): narušení \W v $PS1

Jak je naznačeno, kód je prohnaný preprocesorem, původně je tam makro, které umožňuje zkompilovat ladící verzi s aktivovanou kontrolou hranic ukazatelů.

(void) CHECK_BOUNDS_HIGH (src + n);
(void) CHECK_BOUNDS_HIGH (dest + n);

why the performance of strcpy in glibc is worse?

19.12.2011 06:11 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: strcpy(): narušení \W v $PS1
Ještě dvě poznámky: 1. Ani ten céčkový zdroják, který je tu uveden, by obecně nefungoval při překryvu (jen by vadil opačný případ dest > src). 2. strcpy() je IIRC jedna z funkcí, které dostatečně nové verze gcc nahrazují vlastní optimalizovanou implementací, takže ani ta assemblerová verze ze zdrojáků glibc nemusí být tou, která se nakonec skutečně použije.
20.11.2018 08:17 happy wheels
Rozbalit Rozbalit vše susu
A lot of people are paying attention and so do I. thank you for sharing. happy wheels

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.