wpa_supplicant ralink amd64 segfault

Két root partíció. Két gentoo. Azért kettő, mert az első telepítés még 32 biten izzítja a core2-t, a második már 64-en. Az utóbbi időben párhuzamosan hajtom a kettőt (no nem egyszerre, csak felváltva), próbálok áttérni az utóbbira. Az első gond az volt, hogy kellett a vmware, viszont 64 biten jéggé fagyasztotta az egész gépet. Mostmár nem kell, viszont az utolsó probléma az volt, hogy az rt61+wpa_supplicant páros valamiért nem ment. Tegnap megelégeltem ezt az állapotot, és elhatároztam, hogy a végére járok, mi a baj.

Gyakorlatilag ugyanazt a konfigot használom, mint a 32 bites rendszeren. Meg kellett patkolni a wpa_supplicant-0.6.3.ebuild-et, hogy ugyan már engedélyezze a ralink drivert a config fájlban. Ebből is látszik, hogy a wpa_supplicant-ben a ralink cucc nem a legstabilabb driver. Na mindegy, lássuk 64 biten ez miért nem megy.
Hamar kiderült, hogy nem a driver a hibás, hanem a supplicant, mert a syslogban kiszúrtam, hogy segfaultol. Hát akkor gdb. A gdb backtrace kimutatta, hogy a ralink driver (ralink drivernek nevezem a wpa_supplicant rt61 kernel driverhez ioctl-en keresztül kapcsolódó részét, ami -Dralink kapcsolóra jön elő) a hibás, méghozzá a get_scan_results függvény.
Na most itt egy több órás kínszenvedés következett, amíg rájöttem egy pofon egyszerű, ám elsőre elég váratlan dologra: a kernel rt61 driverében (ez egyébként a legfrissebb CVS rt61 driver) az ULONG típus 32 bites, viszont a wpa_supplicant ralink driverjében már 64. Ezek után már el lehet képzelni, hogy ezek ketten szépen elbeszéltek egymás mellett az ULONG típusú elemeket tartalmazó struktúrák átadása közben... A megoldás pedig annyi, hogy természetesen nem a kernel drivert írom át (mint ahogy azt próbálkozásaim során megtettem párszor), hanem a supplicantos ralink driver headerjében az ULONG definícióját. És működik. A patch olyan rövid, hogy közre is adom itt:


diff -ruN wpa_supplicant-0.6.3.orig/src/drivers/driver_ralink.h wpa_supplicant-0.6.3/src/drivers/driver_ralink.h
--- wpa_supplicant-0.6.3.orig/src/drivers/driver_ralink.h	2008-02-23 03:45:24.000000000 +0100
+++ wpa_supplicant-0.6.3/src/drivers/driver_ralink.h	2008-07-07 18:47:16.000000000 +0200
@@ -78,8 +78,8 @@
 #define SHORT           int
 #define UINT            u32
 #undef  ULONG           
-//#define ULONG           u32
-#define ULONG           unsigned long /* 32-bit in 32-bit CPU or 64-bit in 64-bit CPU */
+#define ULONG           u32
+/*#define ULONG           unsigned long / * 32-bit in 32-bit CPU or 64-bit in 64-bit CPU */
 #define USHORT          unsigned short
 #define UCHAR           unsigned char
 
@@ -90,7 +90,7 @@
 #define BOOLEAN         u8
 //#define LARGE_INTEGER s64
 #define VOID            void
-#define LONG            long
+#define LONG            int
 #define LONGLONG        s64
 #define ULONGLONG       u64
 typedef VOID            *PVOID;

Remélem segít majd másnak is. Ja, és a wpa_supplicant bugzillába is bejelentettem.

Hozzászólások