Warum ist die maximale Pfadlänge für Unix-Sockets unter Linux 108 erlaubt?

Lesezeit: 3 Minuten

Beim Erstellen eines Unix-Sockets wird der Pfadname (man 7 unix) darf maximal 108 Zeichen lang sein. Bei einem Freund verursachte dies einen Fehler in seinem Programm, weil sein Weg länger war. Nun fragen wir uns, wie genau diese Zahl ermittelt wurde.

Ich habe den Verdacht, dass die Nummer so ermittelt wurde sizeof dieser Struktur sockaddr_un ist eindeutig im Vergleich zur Größe anderer Sockenadressen wie sockaddr_in. Aber wenn sie Konflikte mit anderen sizeof-Werten vermeiden wollten, warum nicht zum Beispiel eine Primzahl verwenden? Kann jemand bitte eine verbindliche Quelle dafür angeben?

  • Warum sollte eine Primzahl die Größe anderer Typen vermeiden?

    – Ed heilen

    16. Januar 2016 um 17:03 Uhr

  • @EdHeal Vielleicht irre ich mich, aber durch das Addieren von Vielfachen von 2 (verursacht durch Ausrichtungen) wird eine Struktur nicht mehr mit ihrer Größe übereinstimmen. Alternativ hätte ich fragen können, warum dann eine gerade Zahl verwenden, wenn das Ziel darin besteht, Konflikte zu vermeiden? Was darauf hinzudeuten scheint, dass mein Verdacht bezüglich der Nummer falsch sein könnte.

    – Johannes Schaub – litb

    16. Januar 2016 um 17:07 Uhr


  • Zugegeben, viele Strukturen sind Vielfache von Zweien (wahrscheinlich die Hälfte von ihnen). Aber etwas von der Größe einer Primzahl zu machen, vermeidet keine Konflikte. Wie auch immer, was bringt es, wenn der Programmierer diesen grundlegenden Teil falsch versteht und die falsche Struktur verwendet.

    – Ed heilen

    16. Januar 2016 um 17:11 Uhr

  • Laut Michael Kerrisk, SusV3 (Single Unix Specification) gibt nicht die Größe des sun_path-Felds an. Frühe BSD-Implementierungen verwendeten 108 und 104 Bytes, und eine zeitgenössische Implementierung (HP-UX 11) verwendet 92 Bytes. Portable Anwendungen sollten diesen niedrigeren Wert verwenden und snprintf() oder strncpy() verwenden, um Pufferüberläufe beim Schreiben in dieses Feld zu vermeiden. Es scheint also keine Magie mit Primzahlen zu geben (und nur gerade Zahlen) … nur eine willkürliche Grenze wie die 255 für Dateinamen in vielen Dateisystemen

    – Gérard Rozsavolgyi

    16. Januar 2016 um 17:22 Uhr

  • @ user3629249 Wir sprechen hier nicht von ipv4/ipv6, sondern von Unix-Sockets, einer Form der lokalen Kommunikation zwischen Prozessen auf Unix-Systemen, die nichts mit der Netzwerkkommunikation zu tun hat – en.wikipedia.org/wiki/Unix_domain_socket

    – Nr

    17. Januar 2016 um 16:52 Uhr


Benutzer-Avatar
John Hascal

Es sollte dem Platz entsprechen, der in einer handlichen Kernel-Datenstruktur verfügbar ist.

BEARBEITEN:

Zitat “Das Design und die Implementierung des Betriebssystems 4.4BSD” von McKusick et. al. (Seite 369):

Die Speicherverwaltungsfunktionen drehen sich um eine Datenstruktur namens an mbuf. Mbufs oder Speicherpuffer sind 128 Byte lang, wobei 100 oder 108 Byte dieses Speicherplatzes für die Datenspeicherung reserviert sind.

  • Können Sie weitere Einzelheiten angeben (z. B. die betreffende Kernel-Datenstruktur)?

    – Michael Burr

    19. Januar 2016 um 21:30 Uhr

Wenn Sie es manchmal nicht finden können, bedeutet das nur, dass es nichts zu finden gibt. Aber es kann auch bedeuten, dass Sie es nicht finden konnten. Ich möchte jedoch teilen, was ich bisher gefunden habe und

Ich gehe davon aus, dass die Zahl willkürlich ist.

Meine Vermutung wird durch diese beiden Aussagen aus dem unterstützt GNU C-Bibliothek:

char sun_path[108]

Dies ist der zu verwendende Dateiname. Unvollständig: Warum ist 108 eine magische Zahl?? RMS schlägt vor, dies zu einem Array der Länge Null zu machen und das folgende Beispiel zu optimieren, um alloca zu verwenden, um eine angemessene Speichermenge basierend auf der Länge des Dateinamens zuzuweisen.

(Wo RMS Richard M. Stallman sein sollte (eine andere Vermutung))

Datumstyp: struct sockaddr

char sa_data[14]

Dies sind die eigentlichen Socket-Adressdaten, die formatabhängig sind. Seine Länge hängt auch vom Format ab und kann durchaus mehr als 14 betragen. Die Länge von sa_data beträgt im Wesentlichen 14 willkürlich.

PS: Ich weiß nicht warum, aber diese Art von Fragen macht mich wirklich neugierig.

1099500cookie-checkWarum ist die maximale Pfadlänge für Unix-Sockets unter Linux 108 erlaubt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy