Nepoužívejte uvozovky v PATH

Při tvorbě jednoduchého .exe wrapperu ke Guidovi jsme narazili na nepříjemnou vlastnost implementace funkce execvp() na operačních systémech Windows.

Guido je aplikace napsaná v Jave, proto jsme pro pohodlí uživatele chtěli připravit velice jednoduchý prográmek v C, který by připravil parametry pro JVM, přidal k tomu to, co v příkazové řádce nechal uživatel a spustil javu. Co čert nechtěl, na některých počítačích (což zahrnovalo zejména ten, na kterém jsem wrapper napsal) fungoval krásně, na jiných (což bohužel zahrnovalo zejména počítače ve školní laboratoři) zahlásil, že nemůže nalézt javu – a to jasně znamená problémy. A o to větší, že ekvivalentní příkaz zadaný na příkazové řádce pracoval přesně tak, jak by měl.

Narozdíl od obvyklého stavu program nefungoval na počítačích, kde je nainstalované Visual Studio, takže jsme se mohli pustit do hledání. execvp vracela záhadnou chybu EINVAL, což bylo divnější o to, že naše parametry jsou víceméně neměnné a zcela jistě správné. Chyba se naštěstí ukázala poměrně rychle po prošťourání standardní knihovny kolem funkce execvp.

Při spouštění programu execvp postupně prochází všechny zadané cesty a pokouší se program spustit v nich, předtím ale kontroluje, jestli uživatel má k potenciálnímu souboru přístup pomocí WinAPI funkce GetFileAttributes. Bohužel při tom cestu k souboru lepí tak, že k řetězci z PATH prostě přilepí jméno souboru. Pokud je ale cesta v PATH ohraničená uvozovkami, neodstraní je, a vznikne tak neplatná cesta, protože uvozovky se ve Windows v názvu souboru vyskytovat nesmějí. GetFileAttributes díky tomu skončí s chybou a vezme s sebou execvp.

Ošetření konkrétně tohoto problému je snadné… je ale nepříjemné, že zatímco některým programům (např. příkazová rádka ve windows) uvozovky nevadí, tak funkce ze standardní knihovny kvůli němu nefungují.

A na závěr pointa – víte, kdo uvozovky do PATH přidává? Microsoft a jeho Visual Studio…

Bookmark and Share

Comments are closed.