Hide Forgot
Description of problem: With Fedora 13 and 14 ( x86_64 ) I cannot read/record from my USB turntable UNIKEY dongle hardlock (SecuTech Solution Inc. - Security Solutions - UniKey). Note: With Fedora 12 x86_64 and previous, this worked perfectly fine, no problem on fedora 13 or 14 i386/i686. This problem is just happening on fedora 13 or 14 86_64x versions Version-Release number of selected component (if applicable): How reproducible: Insert a UNIKEY dongle hardlock on USB_DEVICE, lsusb command show me -> "Bus 004 Device 005: ID 0403:c580 Future Technology Devices International, Ltd" Using gcc or g++ compiler, I'm making a program for read and write for hardlock UNIKEY. Example: Static: gcc -c Sample.c gcc -o ta Sample.o UniKey.c.x64.a Shared: gcc -c Sample.c gcc -o ts UniKey.c.x64.so Sample.o ======================================== File: Sample.c ======================================== #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <dlfcn.h> #define _TEST_NEW_API_ #ifdef _TEST_NEW_API_ /*********************TEST NEW API***********************/ #include "UniKeyFR.h" void UniKeyTimeSample(WORD handle); void UniKeySample() { WORD handle[16], p1, p2, p3, p4; DWORD retcode, lp1, lp2; BYTE buffer[4096]; WORD rc[4]; int i, j; i=0; j=0; char cmd[] = "H=H^H, A=A*23, F=B*17, A=A+F, A=A+G, A=A<C, A=A^D, B=B^B, C=C^C, D=D^D"; char cmd1[] = "A=A+B, A=A+C, A=A+D, A=A+E, A=A+F, A=A+G, A=A+H"; char cmd2[] = "A=E|E, B=F|F, C=G|G, D=H|H"; char str1[] = "abcdefghijklmnop"; p1 = 1234; // passwords p2 = 1234; p3 = 1234; p4 = 1234; //get version retcode = UniKey_Get_Version(&handle[0], &lp1); if (retcode) { printf("UniKey_Get_Version error code: %d \n", retcode); return; } printf("UniKey lib ver: %08X\n", lp1); // find dongle lp1 = 0, lp2 = 1; retcode = UniKey_Find(&handle[0], &lp1, &lp2); if (retcode) { printf("UniKey_Find error code: %d \n", retcode); return; } // return the hardware ID (HID) printf("Find UniKey: %08X\n", lp1); // open dongle retcode = UniKey_User_Logon(&handle[0], &p1, &p2); if (retcode) { printf("UniKey_User_Logon error code: %d \n", retcode); return; } retcode = UniKey_Vender_Logon(&handle[0], &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Vender_Logon error code: %d \n", retcode); return; } // enumerate all the dongles i = 1; while (retcode == 0) { // find next dongle retcode = UniKey_Find_Next(&handle[i], &lp1, &lp2); if (retcode == ERROR_UNIKEY_NOMORE) break; if (retcode) { printf("UniKey_Find_Next error code: %d \n", retcode); break; } // open dongle retcode = UniKey_User_Logon(&handle[i], &p1, &p2); if (retcode) { printf("UniKey_User_Logon error code: %d \n", retcode); return; } retcode = UniKey_Vender_Logon(&handle[i], &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Vender_Logon error code: %d \n", retcode); return; } i++; printf("Find UniKey: %08X\n", lp1); } printf("\n"); for (j=0;j<i;j++) { strcpy((char*)buffer, " "); p1 = 10; p2 = 5; strcpy((char*)buffer, "hello"); // write dongle memory retcode = UniKey_Write_Memory(&handle[j], &p1, &p2, buffer); if (retcode) { printf("UniKey_Write_Memory error code: %d \n", retcode); return; } printf("Write: %s\n",buffer); // p1 = 4; // p2 = 26; memset(buffer, 0, 64); // read dongle memory retcode = UniKey_Read_Memory(&handle[j], &p1, &p2, buffer); if (retcode) { printf("UniKey_Read_Memory error code: %d \n", retcode); return; } printf("Read: %s\n", buffer); // random generation function retcode = UniKey_Random(&handle[j], &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Random error code: %d \n", retcode); return; } printf("Random: %04X\n", p1); // seed function, you can use either hex or dec lp1 = 0x12345678; retcode = UniKey_Seed(&handle[j], &lp1, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Seed error code: %d \n", retcode); return; } printf("Seed: %04X %04X %04X %04X\n", p1, p2, p3, p4); rc[0] = p1; rc[1] = p2; rc[2] = p3; rc[3] = p4; // write SoftID lp1 = 0x88888888; retcode = UniKey_Write_SoftID(&handle[j], &lp1); if (retcode) { printf("UniKey_Write_SoftID error code: %d \n", retcode); return; } printf("Write SoftID: %08X\n", lp1); // read SoftID lp1 = 0; retcode = UniKey_Read_SoftID(&handle[j], &lp1); if (retcode) { printf("UniKey_Read_SoftID error code: %d \n", retcode); return; } printf("Read SoftID: %08X\n", lp1); // set license module p1 = 7; p2 = 0x2121; p3 = 0; retcode = UniKey_Set_Module(&handle[j], &p1, &p2, &p3); if (retcode) { printf("UniKey_Set_Module error code: %d \n", retcode); return; } printf("Set License MODULE 7 = %04X Decrease no allow\n", p2); // check license module p1 = 7; retcode = UniKey_Check_Module(&handle[j], &p1, &p2, &p3); if (retcode) { printf("UniKey_Check_Module error code: %d \n", retcode); return; } printf("Check MODULE 7: "); if (p2) printf("Allow "); else printf("No Allow "); if (p3) printf("Allow Decrease\n"); else printf("Not Allow Decrease\n"); // write user-defined algorithm p1 = 0; strcpy((char*)buffer, cmd); retcode = UniKey_Write_Arithmetic(&handle[j], &p1, buffer); if (retcode) { printf("UniKey_Write_Arithmetic error code: %d \n", retcode); return; } printf("Write Arithmetic 1\n"); // calculation 1 lp1 = 0; lp2 = 7; p1 = 5; p2 = 3; p3 = 1; p4 = 0xffff; retcode = UniKey_Calculate1(&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Calculate1 error code: %d \n", retcode); return; } printf("Calculate 1 Input: p1=5, p2=3, p3=1, p4=0xffff\n"); printf("Result = ((5*23 + 3*17 + 0x2121) < 1) ^ 0xffff = BC71\n"); printf("Calculate 1 Output: p1=%x, p2=%x, p3=%x, p4=%x\n", p1, p2, p3, p4); // calculation 3 p1 = 10; strcpy((char*)buffer, cmd1); retcode = UniKey_Calculate2(&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Calculate2 error code: %d \n", retcode); return; } printf("Write Arithmetic 2\n"); // Write Arithmetic 3 p1 = 0; strcpy((char*)buffer, cmd1); retcode = UniKey_Write_Arithmetic(&handle[j], &p1, buffer); if (retcode) { printf("UniKey_Write_Arithmetic error code: %d \n", retcode); return; } // calculation3 lp1 = 10; lp2 = 0x1234; p1 = 1; p2 = 2; p3 = 3; p4 = 4; retcode = UniKey_Calculate3(&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Calculate3 error code: %d \n", retcode); return; } printf("Calculate 3 Input: p1=1, p2=2, p3=3, p4=4\n"); printf("Result = %04x + %04x + %04x + %04x + 1 + 2 + 3 + 4 = %04x\n", rc[0], rc[1], rc[2], rc[3], (WORD)(rc[0]+rc[1]+rc[2]+rc[3]+10)); printf("Calculate 3 Output: p1=%x, p2=%x, p3=%x, p4=%x\n", p1, p2, p3, p4); // Set License Module Decrease p1 = 9; p2 = 0x5; p3 = 1; retcode = UniKey_Set_Module(&handle[j], &p1, &p2, &p3); if (retcode) { printf("UniKey_Set_Module error code: %d \n", retcode); return; } // write user-defined algorithm p1 = 17; strcpy((char*)buffer, cmd2); retcode = UniKey_Write_Arithmetic(&handle[j], &p1, buffer); if (retcode) { printf("UniKey_Write_Arithmetic error code: %d \n", retcode); return; } printf("Write Arithmetic 3\n"); // Calculation3 lp1 = 17; lp2 = 6; p1 = 1; p2 = 2; p3 = 3; p4 = 4; retcode = UniKey_Calculate3(&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Calculate3 error code: %d \n", retcode); return; } printf("Show License Module from 6: p1=%x, p2=%x, p3=%x, p4=%x\n", p1, p2, p3, p4); // Decrease License Module p1 = 9; retcode = UniKey_Module_Decrase(&handle[j], &p1); if (retcode) { printf("UniKey_Module_Decrase error code: %d \n", retcode); return; } printf("Decrease module 9\n"); // Calculation3 lp1 = 17; lp2 = 6; p1 = 1; p2 = 2; p3 = 3; p4 = 4; retcode = UniKey_Calculate3(&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4); if (retcode) { printf("UniKey_Calculate3 error code: %d \n", retcode); return; } printf("Show Module from 6: p1=%x, p2=%x, p3=%x, p4=%x\n", p1, p2, p3, p4); //------------------------------------ // generate new password // if you really want to change password, please de-comment these codes /* lp1=1234; retcode=UniKey(UNIKEY_SET_NEW_PASSWORD,&handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return; } printf("Generate new passwords, seed: %d, p1: %d, p2: %d,p3: %d, p4: %d\n",lp1,p1,p2,p3,p4); */ //------------------------------ // generate key lp1=1; retcode=UniKey_Generate_Key(&handle[j], &lp1); if (retcode) { printf("error code: %d \n", retcode); return; } printf("generate key %d successed\n",lp1); // encrypt memset(buffer, 0, 64); strcpy((char*)buffer, str1); lp2=1; lp1=16; retcode=UniKey_Encrypt(&handle[j], &lp1, &lp2, buffer); if (retcode) { printf("error code: %d \n", retcode); return; } printf("encrypt successed, result: %s \n",buffer); // decrypt lp2=1; lp1=16; retcode=UniKey_Decrypt(&handle[j], &lp1, &lp2, buffer); if (retcode) { printf("error code: %d \n", retcode); return; } printf("decrypt successed, result: %s\n",buffer); // MD5 memset(buffer, 0, 64); strcpy((char*)buffer, str1); lp1=16; lp2=0; retcode=UniKey_MD5(&handle[j], &lp1, buffer); if (retcode) { printf("error code: %d \n", retcode); return; } printf("MD5 successed, result: %s\n",buffer); // write UpdateTag //lp1=rand(); //retcode=UniKey_Write_UpdateTag(&handle[j], &lp1); //if (retcode) //{ // printf("error code: %d \n", retcode); // return; //} //printf("write UpdateTag: %x ",lp1); //UniKey Time UniKeyTimeSample(handle[j]); // read UpdateTag lp1=0; retcode=UniKey_Read_UpdateTag(&handle[j], &lp1); if (retcode) { printf("UniKey_Read_UpdateTag error code: %d \n", retcode); return; } printf("read UpdateTag: %x \n",lp1); // close dongle retcode = UniKey_Logoff(&handle[j]); if (retcode) { printf("UniKey_Logoff error code: %d \n", retcode); return; } printf("logoff\n"); //getch(); } } void UniKeyTimeSample(WORD handle){ int i; WORD p1, p2, p3, p4; DWORD ret, lp1, lp2; //ret = UniKey_Set_Time_Now(&handle); //if(ret){ // printf("UniKey_Set_Time_Now error code: %d \n", ret); // return; //} ret = UniKey_Get_Time(&handle, &lp1, &lp2, &p1, &p2, &p3, &p4); if(ret){ printf("UniKey_Get_Time_Now error code: %d \n", ret); return; } printf("Get Time: %02d-%02d-%02d %02d:%02d:%02d\n", lp1, lp2, p1, p2, p3, p4); lp1 = 1; ret = UniKey_Erase_Time_Module(&handle, &lp1); if(ret){ printf("UniKey_Get_Time_Now error code: %d \n", ret); return; } else printf("Erease time success!\n"); ret = UniKey_Set_Time_Module_Start_Time_Now(&handle, &lp1); if(ret){ printf("UniKey_Get_Time_Now error code: %d \n", ret); return; } else printf("Set_Time_Module_Start_Time_Now success!\n"); lp1=1; lp2 = 10; // duration is10 Day p1 = 6; // and 6hour ret = UniKey_Set_Time_Module_Duration(&handle, &lp1, &lp2, &p1); if(ret){ printf("UniKey_Get_Time_Now error code: %d \n", ret); return; } lp1=1; ret = UniKey_Check_Time_Module_Now(&handle, &lp1,&lp2,&p1); if(ret){ printf("UniKey_Check_Time_Module_Now MuduleNo=%d Error code: %d.\n", lp1, ret); return; }else{ printf("UniKey_Check_Time_Module_Now MuduleNo=%d Success.\n", lp1); printf("UniKey_Check_Time_Module_Now remain %d days and %d hours\n", lp2,p1); } if(1){ // test fail for overdure ret = UniKey_Get_Time(&handle, &lp1, &lp2, &p1, &p2, &p3, &p4); if(ret){ printf("UniKey_Get_Time_Now error code: %d \n", ret); return; } p4 = p2; p3 = p1; p2 = lp2; p1 = lp1; lp1 = 1; p3 += 1; // emulate 1day later p4 += 1; // and 1 hour later ret = UniKey_Check_Time_Module(&handle, &lp1, &lp2 , &p1, &p2, &p3, &p4); if(ret){ printf("UniKey_Check_Time_Module error code: %d \n", ret); return; } else printf("remain %d days and %d hours\n", lp2,p1); } } int main() { int nRetCode = 0; UniKeySample(); //system("pause"); return nRetCode; } #else #include "UniKey.h" int main() { WORD handle[16], p1, p2, p3, p4, retcode; DWORD lp1, lp2; BYTE buffer[MemorySize]; WORD rc[4]; int i, j; char cmd[] = "A=A^E,B=B^F,C=C^G,D=D^H"; p1 = 1234; // passwords p2 = 1234; p3 = 1234; p4 = 1234; // find dongle retcode = UniKey(UNIKEY_FIND, &handle[0], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } // return the hardware ID (HID) printf("Find UniKey: %08X\n", lp1); // open dongle retcode = UniKey(UNIKEY_LOGON, &handle[0], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } // enumerate all the dongles i = 1; while (retcode == 0) { retcode = UniKey(UNIKEY_FIND_NEXT, &handle[i], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode == ERROR_NOMORE) break; if (retcode) { printf("error code: %d \n", retcode); return 1; } retcode = UniKey(UNIKEY_LOGON, &handle[i], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } i++; printf("Find UniKey: %08X\n", lp1); } printf("\n"); for (j=0;j<i;j++) { p1 = 3; p2 = 6; sprintf((char*)buffer, "Hello%d",j); // write dongle memory retcode = UniKey(UNIKEY_WRITE_MEMORY, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("Write: Hello\n"); p1 = 3; p2 = 6; memset(buffer, 0, 64); // read dongle memory retcode = UniKey(UNIKEY_READ_MEMORY, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("Read: %s\n", buffer); // random generation function retcode = UniKey(UNIKEY_RANDOM, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("Random: %04X\n", p1); // seed function, you can use either hex or dec lp1 = 0x12345678; retcode = UniKey(UNIKEY_SEED, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("Seed: %04X %04X %04X %04X\n", p1, p2, p3, p4); rc[0] = p1; rc[1] = p2; rc[2] = p3; rc[3] = p4; // set license module p1 = 0; p2 = 1234; p3 = 0; retcode = UniKey(UNIKEY_SET_MODULE, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("set module error code: %d \n", retcode); return 0; } printf("Set License MODULE 7 = %d Decrease no allow\n", p2); /* // write user-defined algorithm p1 = 0; strcpy((char*)buffer, cmd); printf("alg: %s \n",buffer); retcode = UniKey(UNIKEY_WRITE_ARITHMETIC, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %8x \n", retcode); return 1; } printf("Write Arithmetic 1\n"); */ // calculation 1 lp1 = 0; lp2 = 0; p1 = 0; p2 = 0; p3 = 0; p4 = 0; retcode = UniKey(UNIKEY_CALCULATE1, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("Calculate Output: p1=%x, p2=%x, p3=%x, p4=%x\n", p1, p2, p3, p4); // close dongle retcode = UniKey(UNIKEY_LOGOFF, &handle[j], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); if (retcode) { printf("error code: %d \n", retcode); return 1; } printf("\n"); // getch(); } } #endif Actual results: Freezes when logging as root or show an error when logging as another user (delay more 30 seconds and freezes) -- This problem is just happening on 86_64x versions. Sometimes (some distributions) just changing rules for "usb_device" in "/etc/udev/rules.d" MODE=0666 is fine and comming the solution.... but it no happening for fedora 13,14 -86_64x Expected results: No freeze and show me the informations from UNIKEY DONKEY HARDLOCK Additional info: UNIKEY dongle hardlock (SecuTech Solution Inc. - Security Solutions - UniKey) VERY similar to Rockey4 Note: With Fedora 12 86_64 and previous, this worked perfectly fine, no problem on fedora 13 or 14 i386/i686. On test, I changed /etc/udev/rules.d for usb_device as MODE=0666 but don't work
Description of problem and how to figure out the problem -------------------------------------------------------- Using "lsusb" it's possible see the device recognized at USB but with my program (wl) for read / write show me freeze for 60 minute and following error. Operation system with problem - Linux Fedora 13 x64 - Linux Fedora 14 x64 - example: 2.6.35.6-45.fc14.x86_84 - Linux Fedora 15 x64 (alpha-beta) Additional info: ---------------- I make the program WL whit C compiler GCC/G++ 4.5.1 20100924 (Red Hat 4.5.1-4) My program C (wl.c) ------------------- int main(...) { . . . // find dongle retcode = UniKey(UNIKEY_FIND, &handle[0], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); // open dongle retcode = UniKey(UNIKEY_LOGON, &handle[0], &lp1, &lp2, &p1, &p2, &p3, &p4, buffer); . . . } The manufacturer the device, give us instruction for some distributions ( debian, fedora (previous) , ubuntu, centos, ... ) to change --> /etc/udev/rules.d or /lib/udev/rules.d/, looking for "usb_device" MODE="0664" and setting for MODE="0666" commands for help ----------------- lsusb -d 0403:c580 Bus 001 Device 003: ID 0403:c580 Future Technology Devices International, Ltd Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x0403 Future Technology Devices International, Ltd idProduct 0xc580 bcdDevice 1.01 iManufacturer 1 OEM iProduct 2 HID UNIKEY iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.00 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 32 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 10 Device Status: 0x0000 (Bus Powered) Program C execution ------------------- ./wl delay for 60 minute and folwing with error.... checking error....... --------------------- dmesg | tail [ 117.098230] usb 1-2: new full speed USB device using ohci_hcd and address 3 [ 117.326801] usb 1-2: New USB device found, idVendor=0403, idProduct=c580 [ 117.326808] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 117.326813] usb 1-2: Product: HID UNIKEY [ 117.326817] usb 1-2: Manufacturer: OEM [ 117.343738] generic-usb 0003:0403:C580.0002: hiddev96,hidraw1: USB HID v1.00 Device [OEM HID UNIKEY] on usb-0000:00:06.0-2/input0 [ 345.369452] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 33 rq 9 len 24 ret -110 [ 345.524083] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 161 rq 1 len 24 ret -110 [ 345.675488] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 33 rq 9 len 24 ret -110 [ 345.828695] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 161 rq 1 len 24 ret -110 [ 345.981138] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 33 rq 9 len 24 ret -110 [ 346.134629] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 161 rq 1 len 24 ret -110 [ 346.286619] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 33 rq 9 len 24 ret -110 [ 346.439673] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 161 rq 1 len 24 ret -110 . . . [ 395.645281] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 33 rq 9 len 24 ret -110 [ 395.798691] usb 1-2: usbfs: USBDEVFS_CONTROL failed cmd wl rqt 161 rq 1 len 24 ret -110 Expected results: No freeze and show me the informations from device on USB driver, no error.
This message is a notice that Fedora 14 is now at end of life. Fedora has stopped maintaining and issuing updates for Fedora 14. It is Fedora's policy to close all bug reports from releases that are no longer maintained. At this time, all open bugs with a Fedora 'version' of '14' have been closed as WONTFIX. (Please note: Our normal process is to give advanced warning of this occurring, but we forgot to do that. A thousand apologies.) Package Maintainer: If you wish for this bug to remain open because you plan to fix it in a currently maintained version, feel free to reopen this bug and simply change the 'version' to a later Fedora version. Bug Reporter: Thank you for reporting this issue and we are sorry that we were unable to fix it before Fedora 14 reached end of life. If you would still like to see this bug fixed and are able to reproduce it against a later version of Fedora, you are encouraged to click on "Clone This Bug" (top right of this page) and open it against that version of Fedora. Although we aim to fix as many bugs as possible during every release's lifetime, sometimes those efforts are overtaken by events. Often a more recent Fedora release includes newer upstream software that fixes bugs or makes them obsolete. The process we are following is described here: http://fedoraproject.org/wiki/BugZappers/HouseKeeping