using memcpy lead to Array bounds error, fix it
author宋秀杰 <sxj@rock-chips.com>
Mon, 20 Sep 2010 06:50:53 +0000 (23:50 -0700)
committer宋秀杰 <sxj@rock-chips.com>
Mon, 20 Sep 2010 06:50:53 +0000 (23:50 -0700)
drivers/gpio/expand_gpio_soft_interrupt.c
drivers/gpio/tca6424.c

index 79c4fd06cfe3fd01a88a131c3656aa9fd10f790b..bbf7aa573142ea8c21e7be2f066868182693e158 100755 (executable)
@@ -51,12 +51,8 @@ NOTES                :
 #else\r
 #define DBG(x...)\r
 #endif\r
-\r
-#if 0\r
 #define DBGERR(x...)   printk(KERN_INFO x)\r
-#else\r
-#define DBGERR(x...)\r
-#endif\r
+\r
 \r
 #define EXTPAND_GPIO_GET_BIT(a,num) (((a)>>(num))&0x01)\r
 #define EXTPAND_GPIO_SET_BIT(a,num) ((a)|(0x01<<(num)))\r
@@ -65,7 +61,7 @@ NOTES         :
 \r
 \r
 static int expand_gpio_irq_en = -1;\r
-static int expand_gpio_irq_ctrflag = -1;\r
+static int expand_gpio_irq_ctrflag = 0;\r
 static unsigned int expand_gpio_irq_num = 0;\r
 \r
 static struct workqueue_struct *irqworkqueue;\r
@@ -297,7 +293,7 @@ static irqreturn_t expand_gpio_irq_handler(int irq, void * dev_id)
 \r
        DBG("******************%s*******************\n",__FUNCTION__);\r
        expand_gpio_irq_ctr_dis(pchip->irq_chain,0);\r
-       memcpy(&oldintputreg[0],&pchip->gvar->reg_input[0],pchip->expand_port_pinnum);\r
+       memcpy(&oldintputreg[0],&pchip->gvar->reg_input[0],pchip->expand_port_group);\r
        if(pchip->irq_data.read_allinputreg(pchip->irq_data.data,&tempintputreg[0]))\r
        {\r
                expand_gpio_irq_ctr_dis(pchip->irq_chain,-1);\r
@@ -306,7 +302,7 @@ static irqreturn_t expand_gpio_irq_handler(int irq, void * dev_id)
                return IRQ_HANDLED;\r
        }\r
        \r
-       memcpy(&pchip->gvar->reg_input[0],&tempintputreg[0],pchip->expand_port_pinnum);\r
+       memcpy(&pchip->gvar->reg_input[0],&tempintputreg[0],pchip->expand_port_group);\r
        //DBG("**has run at %s**,input[0] = %x,input[1] = %x,input[2] = %x\n",__FUNCTION__,pchip->gvar.reg_input[0],pchip->gvar.reg_input[1],pchip->gvar.reg_input[2]);\r
 \r
        //Handle for different expand_port_group \r
@@ -421,7 +417,7 @@ void expand_gpio_irq_setup(struct expand_gpio_soft_int *pchip)
 int wait_untill_input_reg_flash(void)\r
 {\r
        unsigned int num = 0;\r
-    unsigned int tempnum = expand_gpio_irq_num;\r
+       unsigned int tempnum = expand_gpio_irq_num;\r
 \r
        while(expand_gpio_irq_ctrflag&&(expand_gpio_irq_num==tempnum))\r
        {\r
index e3edd35f1f3bf1fee3d46323d9eaa240e1747518..06e2ab9843db30d4de36bc8c164bf2aba053a163 100755 (executable)
@@ -46,17 +46,12 @@ NOTES               :
 #include "../drivers/gpio/expand_gpio_soft_interrupt.h"
 
 #if 0
-#define TCA6424DEB
 #define DBG(x...)      printk(KERN_INFO x)
 #else
 #define DBG(x...)
 #endif
-
-#if 0
 #define DBGERR(x...)   printk(KERN_INFO x)
-#else
-#define DBGERR(x...)
-#endif
+
 
 struct tca6424_chip {
        
@@ -296,7 +291,10 @@ static int tca6424_gpio_get_value(struct gpio_chip *gc, unsigned pin_num)
        #ifdef CONFIG_EXPAND_GPIO_SOFT_INTERRUPT
        ret = wait_untill_input_reg_flash( );
        if(ret<0)
+       {
                return -1;
+               DBGERR("**********tca6424 get value error***************\n");
+       }
        #endif
        
        gpioPortNum = pin_num/8;