Jen doplním pro @hubacji1, že v této úloze se pod "(úplným) doběhnutím programu" myslí, že přestože program na vstupu narazil na neplatný příkaz, tak ty příkazy, které do tohoto bodu byly úspěšně přijaty, se mají nechat dozpracovat běžícími vlákny (konzumenty) a až poté by se měl program ukončit. Tento požadavek není ze zadání úplně patrný (skutečně ona formulace "program skončí s návratovým kódem 1" lze stejně tak dobře vyložit, že má program skončit okamžitě), ačkoli jej BRUTE testuje (mám za to, že jde o "Test 13: Invalid command", ale mohu se mýlit).
Pro úplnost bych ještě zmínil, že toto očekávané chování zadání jemně naznačuje v těchto dvou bodech asi o deset bodů pod oním bodem "Pokud bude zadán neplatný příkaz ...":
- Uzavření standardního vstupu je požadavkem na ukončení programu. Pokud není řečeno jinak, návratový kód bude
0
.- Všechny platné “příkazy” zaslané na standardní vstup budou mít odpovídající řádku na standardním výstupu (nic se neztratí).
... ale myslím, že není na škodu ještě dovysvětlit u daného bodu "Pokud bude zadán neplatný příkaz ...", jak se má program konkrétně v případě výskytu neplatného příkazu v momentě, kdy už bylo několik příkazů správně přečteno, chovat.
Ideálně bych navrhoval i vylepšit testovací případ na konci zadání přidáním několika platných příkazů před onen neplatný, viz https://osy.pages.fel.cvut.cz/docs/cviceni/lab5/#testovac%C3%AD-vstup:
Zkuste i chování při neplatném vstupu:
echo "invalid" | ./prod-cons 4 echo "Exit code: $?"
Výsledkem by mělo být:
Exit code: 1
Ale přednáška, kde tyhle věci zmiňuji, bude až příští týden a cvičení ještě později.
K tomuhle bych ještě dodal, že právě z přednášky a cvičení (před dvěma lety) jsem si odnesl, že typickým cílem exploitu je vytvořit "shellcode", který spustí na cílovém serveru shell (kdyby mi toto nebylo vtloukáno do hlavy, tak bych třeba ten exploit od začátku řešil jinak, bez použití shellu). Proto jsem nepředpokládal, že by se zde vyžadovalo něco jiného, a pokud o tom byla nějaká ústní zmínka na přednášce nebo cvičení, tak mi unikla.
Jinak přidaná poznámka v zadání za mě vypadá dobře
Cc @kafkamat - trochu mě bolí vidět, že těch pár odvážlivců, co se každý rok snaží tuto úlohu vyřešit, naráží dokola na tento problém, a pálí na tom mnoho hodin svého času (jako se to stalo mně), v podstatě zbytečně. Podle mě by na tenhle zádrhel alespoň mělo zadání upozornit.
Hned po úspěšném připojení ale server skončí, předpokládám že právě protože selže spuštění shellu (server pak vyhodí asi rovnou i segfault).
Ano, spuštění shellu se nepovede (ale není to segfault, místo toho pokračuje vykonávání programu po volání exec
). Kdyby tě zajímalo proč, návratová hodnota v registru eax
napoví (mimochodem, do errno
přesouvá chybový kód knihovna libc, původně je právě v registru eax
, viz https://stackoverflow.com/a/29051118).
potom ale nemám tušení jak tam nahrát obrázek.
Doporučuju si vzpomenout na https://osy.pages.fel.cvut.cz/docs/cviceni/lab8/.
Vzhledem k tomu, že je v zadání úlohy napsáno, že se při výskytu -h
skript ukončí ještě před čtením standardního vstupu:
- přepínač
-h
způsobí vypsání stručné nápovědy ke skriptu a ukončení skriptu s návratovou hodnotou 0 ještě před čtením řádek ze standardního vstupu. Přepínače následující za-h
budou ignorovány.
... nemůže dojít k situaci, že při zpracování -h
už máme načtené nějaké řádky, které by bylo třeba zpracovávat.