bezpecny upgrade systemu

Dan Lukes dan at obluda.cz
Thu Oct 20 11:49:16 CEST 2005


Divacky Roman wrote:
> nepochopil jsem jaka je logika v meneni verzi knihovena ale urcite to neni tak
> jak to rikas (prestoze to zni logicky)

	Ta pasaz o "minor" cislech byla v soucasnosti uz opravdu neplatna, ta 
pasaz tykajici se "major" cisel plati.

> proto to libmapovani vetsinou chodi... 

	Vetsinou chodi znamena "obcas nechodi". V zavislosti na tom co se 
zmenilo a jake volas funkce knihovny s jakymi parametry. A to je presne 
to, co jsem rikal ja.


> nehlede nato - api takovych tech "fakt zakladnich" (libc, libpthread) knihoven je definovano 
> mimo fbsd (posix, ISO C atd.) tj. menit api ani nejde (nemluvim o abi)

	No, jenze tady prave mluvime o ABI. Linkujes uz prelozene veci a ty 
spolu komunikuji na binarni urovni. Jestlize knihovni funkce vracela 
strukturu sTest a program z ni smel pro sve ucely pouzivat polozku 
sTest->name a nova verze knihovny to dela totez, pak API se nezmenilo (a 
posiz, ISO a dalsi certi muzou byt klidni). API se nezmenilo, to 
znamena, ze muzes vzit zdrojove kody a ony pujdou znovu PRELOZIT pri 
zachovani identicke funkcnosti jako puvodne.

	Ona nova verze knihovny se stejnym API ale ma jine ABI - poradi polozek 
v one strukture je jine a polozka 'name' neni "po novu" hned na zacatku 
struktury, ale az na offsetu +4. Pokud program znovu prelozis, pak se 
pouziji aktualizovane header soubory a program bude 'name' hledat na 
spravnem miste. Pokud program neprelozis, ale jen prilinkujes k nove 
verzi knihovny, pak program dostane strukturu - a tak jak je prelozen - 
v ni 'name' pouziva na puvodnim offsetu 0.

	Dopady na funkcnost software jsou nepredikovatelne. Nektere knihovni 
funkce funguji beze zmenu (at uz proto, ze jejich ABI zustalo nezmenene 
nebo proto, ze program pouziva jen takove promenne, ktere, nahodou, jsou 
na stejnych mistech jako byly v minule verzi), jine nefunguji vubec, 
protoze nesoulad v promennych je prilos velky, nektere "jen" delaji neco 
jineho nez maji - napriklad nikdy kladne neoveri dodane jmeno a heslo, 
protoze knihovan nehleda v predanych parametrech jmeno a heslo tam, kde 
ji ho pripravil program, ale jinde, takze ke shode nedojde).

	Uz je jasnejsi, proc "prilinkovani knihovny jine verze" funguje jen 
statisticky ?

> to ze to libmapovani neni ciste a pekne je jasne ale funguje to

	No, to je prave predmet sporu. Ano, muze to dokonce i fungovat. Jenze 
taky nemusi. A nelze bohuzel snadno poznat, ktera varianta nastane. 
Nekdy dokonce neni ani snadne poznat, ktera varianta nastala (v dobe, 
kdy to uz provozujes). Obzvlast neprijemne by to mohlo byt kdyz si 
podobnym zpusobem prilinkujes k zalohovacimu programu jinou 
'libarchive'. Vsechno bude fungovat skvele. Az za tri roky budes tu 
zalohu potrebovat a archiv ti nepujde rozbalit, protoze "lhani pri 
vytvareni archivu" zpusobilo, ze archiv ma vnitrne vadnou strukturu, 
kterou dokaze pouzit jen presne stejna "lziva kombinace" programu a 
knihovny, budes si proste muset vzpomenout jakou presnou kombinaci jsi 
pri zalohovani pouzil. A, po trech letech, takovou kombinaci znovu 
sehnat a stvorit.

	Ne, ze bych ti to pral doopravdy. To je jen priklad toho, jak je 
nebezpecne lhat. I kdyz lzes jen svym programum ...

						Dan




More information about the Users-l mailing list