Re: unterschiedliche bind(2) Implementierung FreeBSD/Linux?

From: Bernd Walter <ticso(at)cicely12.cicely.de>
Date: Sat, 8 Nov 2003 15:10:11 +0100

On Sat, Nov 08, 2003 at 02:56:17PM +0100, Matthias Teege wrote:
> Bernd Walter <ticso(at)cicely12.cicely.de> writes:
>
> > Vorsicht übrigens bei der Verwendung vom SUN_LEN Macro - das ist bei
> > einigen Linux Distributionen kaput.
> > Am besten berechnest du es mit der FreeBSD Implementation:
> > /* actual length of an initialized sockaddr_un */
> > #define SUN_LEN(su) \
> > (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
>
> Habe ich eingebaut, funktioniert und die Werte sehen auch aus als
> würden sie stimmen.
>
> > Ich vermute, daß du den Fehler auch unter Linux machst, aber Linux
> > ignoriert in dem Umfeld etliche Fehler.
> > Wie sieht denn deine Berechnung aus?
>
> Ziemlich abgefahren:
>
> for (i=0;i<sizeof (xsun.sun_path)-1&&str[i]!=':';i++)
> if ((xsun.sun_path[i] = str[i]) <= ' ') break;
> xsun.sun_path[i] = 0;
> sa = (struct sockaddr *) &xsun;
> socksize = i+sizeof (xsun.sun_family);
> ....
>
> i ist im konkreten Fall 7 und sizeof (xsun.sun_family) ist
> (eigentlich immer) 1, zusammen also 8. Linux lebt damit. Die
> obige Berechnung von socksize verstehe ich nicht wirklich.

Linux muss damit leben, da die oftmals ein kaputtes SUN_LEN markro
mitliefern - schau mal für Spaß in einem Debian nach.
Jedenfalls halte ich das für gefährlich, wenn die mehr Daten beachten,
als die Größe angegeben wurde.

Ich sehe übrigens noch einen anderen Fehler.
xsun scheint eine lokale Variable zu sein - das ist falsch.
Du musst es z.B. per malloc allocieren, da es sonst für einige Systeme
ein falsches alignment hat.

-- 
B.Walter                   BWCT                http://www.bwct.de
ticso(at)bwct.de                                  info(at)bwct.de
To Unsubscribe: send mail to majordomo.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 08 Nov 2003 - 15:10:51 CET

search this site