/ Software-Entwicklung / glibc 2.25 enthält lang erwarteten getrandom-Wrapper

glibc 2.25 enthält lang erwarteten getrandom-Wrapper

Gerfried Steube on February 6, 2017 - 10:30 pm in Software-Entwicklung

Der Linux-Kernel kennt die Funktion seit 2014. Obwohl die Umsetzung nun ein einfacher Wrapper ist, war die Implementierung mit einigen Hürden verbunden.

Die GNU C Library (glibc) erscheint alle sechs Monate und bringt meist zahlreiche unspektakuläre Erweiterungen mit sich. Das Release 2.25 ist insofern bemerkenswert, als es den lang erwarteten Support für die Linux-Systemfunktionen getrandom() und getentropy() enthält. Der zugehörige Issue zur Implementierung existiert bereits seit zweieinhalb Jahren. Der Aufhänger war seinerzeit das Erscheinen des Linux-Kernels mit der Versionsnummer 3.17, der die entsprechende Funktionen enthält.

Ein Artikel auf LWN.net erklärte Mitte Januar die Hintergründe der Verzögerung. Ein Grund ist demnach, dass sich einige Entwickler mit der Implementierung eines Wrappers für Linux-spezifische Systemaufrufe schwer taten. In der Diskussion schrieb Joseph Myers vom GCC Steering Committee von einem De-facto-Standard, der alle Syscalls bis zu Linux 3.2 beziehungsweise glibc 2.15 enthält, aber seitdem keine späteren Aufrufe, was wenig sinnvoll sei. Seitdem existiert ein Entwurf zum Umgang mit Wrappern für Systemaufrufe, der nach wie vor als WiP (Work in Progress, in Bearbeitung befindlich) gekennzeichnet ist.

Emulation und Abbruchspunkt

Die anfänglichen Ansätze für getrandom versuchten sich zudem an einer Emulation für ältere Linuxversionen, denen der Systemaufruf fehlt. Letztlich entschieden sich die Entwickler jedoch dagegen, sodass eine Verwendung auf älteren Systemen den Fehlercode ENOSYS zurückliefert, der auf eine nicht implementierte Funktion hinweist.

Eine weitere Hürde bot die Diskussion, ob der Aufruf der Funktion als Abbruchpunkt (cancellation point) für den aktuellen Thread gelten solle oder nicht. Auch wenn getrandom normalerweise den aktuellen Thread nicht blockiert, ist rein theoretisch eine unbegrenzte Blockierung möglich. In glibc 2.25 ist die Funktion nun als Abbruchspunkt umgesetzt.

Die endgültige Implementierung als reiner Wrapper wirkt hinsichtlich der zweieinhalb Jahre währende Entstehungsgeschichte erstaunlich simpel:

ssize_t 
getrandom (void *buffer, size_t length, unsigned int flags)
{
return SYSCALL_CANCEL (getrandom, buffer, length, flags);
}

Zu den weiteren Neuerungen in glibc 2.25 gehören unter anderem die Funktionen strfromd, strfromf und strfroml zum Wandeln von Fließkommazahlen in Strings und neue math.h-Features. Die vollständige Liste findet sich in der offiziellen Ankündigung auf der Mailingliste. (rme)

Read more on: Source

Comments are disabled