Package: zd1211-source
Version: 0.0.0.svnr23-3
Tags: patch

I have AP with 32 char long ESSID. The driver fails to connect it. 
"Can't find desired ESSID" 
message is printed ~once per second.
In addition, 
$ iwlist scanning 
displays in one place:
"essid: <ESSID here><additional garbage>"
This is an obvious zero terminator out-of-bounds case. Patch 
that increases array sizes and memcpys by one is included. I 
have already reported this to the zd1211 developer community.

I have compiled the kernel from 2.6.12-7.

-- 
 i.
diff -u -r zd1211/src/zd1205.c zd1211-ij/src/zd1205.c
--- zd1211/src/zd1205.c 2005-09-22 16:21:46.000000000 +0300
+++ zd1211-ij/src/zd1205.c      2005-10-26 09:53:54.000000000 +0300
@@ -7176,8 +7176,8 @@
                                 U8 bssTypeToConnect;
                                 zd1205_lock(macp);
                                 if (macp->BSSInfo[val-1].cap & CAP_IBSS) {
-                                        
memcpy((U8*)&mSsid,(U8*)macp->BSSInfo[val-1].ssid,34);
-                                        memcpy((U8*)&dot11DesiredSsid, &mSsid, 
34);
+                                        
memcpy((U8*)&mSsid,(U8*)macp->BSSInfo[val-1].ssid,34+1);
+                                        memcpy((U8*)&dot11DesiredSsid, &mSsid, 
34+1);
                                         
macp->BSSInfo[val-1].ssid[mSsid.buf[1]+2]=0;
                                         //printk(KERN_ERR "desired IBSS 
ssid=%s\n",&macp->BSSInfo[val-1].ssid[2]);
                                         
mBssType=macp->cardSetting.BssType=INDEPENDENT_BSS;
@@ -7185,8 +7185,8 @@
                                         bssTypeToConnect=mBssType;
                                         zd_CmdProcess(CMD_CONNECT, 
&bssTypeToConnect, val);
                                 } else if (macp->BSSInfo[val-1].cap & CAP_ESS) 
{
-                                        
memcpy((U8*)&mSsid,(U8*)macp->BSSInfo[val-1].ssid,34);
-                                        memcpy((U8*)&dot11DesiredSsid, &mSsid, 
34);
+                                        
memcpy((U8*)&mSsid,(U8*)macp->BSSInfo[val-1].ssid,34+1);
+                                        memcpy((U8*)&dot11DesiredSsid, &mSsid, 
34+1);
                                         
macp->BSSInfo[val-1].ssid[mSsid.buf[1]+2]=0;
                                         //printk(KERN_ERR "desired AP 
ssid=%s\n",&macp->BSSInfo[val-1].ssid[2]);
                                         
mBssType=macp->cardSetting.BssType=INFRASTRUCTURE_BSS;
diff -u -r zd1211/src/zdapi.h zd1211-ij/src/zdapi.h
--- zd1211/src/zdapi.h  2005-09-22 16:21:45.000000000 +0300
+++ zd1211-ij/src/zdapi.h       2005-10-26 09:55:11.000000000 +0300
@@ -473,7 +473,7 @@
         U8      bContinueTx;
         U8      bChScanning;
         U16            IntValue[14];
-        U8      CurrSsid[34];
+        U8      CurrSsid[34+1];
 #ifdef ZD1211B
 
         U8             LengthDiff;
diff -u -r zd1211/src/zdsorts.h zd1211-ij/src/zdsorts.h
--- zd1211/src/zdsorts.h        2005-08-17 21:40:01.000000000 +0300
+++ zd1211-ij/src/zdsorts.h     2005-10-26 09:50:50.000000000 +0300
@@ -111,7 +111,7 @@
 
 typedef struct
 {
-        U8     buf[34];        //Max SSID Length = 32
+        U8     buf[34+1];      //Max SSID Length = 32
 }
 Element;
 
diff -u -r zd1211/src/zdsynch.c zd1211-ij/src/zdsynch.c
--- zd1211/src/zdsynch.c        2005-09-22 16:21:45.000000000 +0300
+++ zd1211-ij/src/zdsynch.c     2005-10-26 09:57:10.000000000 +0300
@@ -312,7 +312,7 @@
                 /* Dump WPA IE */
                 if(pCurrBssInfo->WPAIe[1] != 0) {
                         int ii;
-                        u8 SSID[34];
+                        u8 SSID[34+1];
 
                         memcpy(SSID, (u8 *)(&pCurrBssInfo->ssid.buf[2]), 
pCurrBssInfo->ssid.buf[1]);
                         SSID[pCurrBssInfo->ssid.buf[1]] = '\0';

Reply via email to