Changeset 16831


Ignore:
Timestamp:
2009-07-13T17:09:46+02:00 (7 years ago)
Author:
nbd
Message:

kernel: fix a relative addressing bug in the mips module relocation code change

Location:
trunk/target/linux/generic-2.6
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/patches-2.6.28/026-mips_module_reloc.patch

    r16772 r16831  
    210210 } 
    211211  
    212 @@ -97,45 +248,73 @@ static int apply_r_mips_32_rela(struct m 
     212@@ -97,27 +248,44 @@ static int apply_r_mips_32_rela(struct m 
    213213        return 0; 
    214214 } 
     
    232232+       if (*plt_offset == size) 
    233233+               return 0; 
    234 + 
     234  
     235-       *location = (*location & ~0x03ffffff) | 
     236-                   ((*location + (v >> 2)) & 0x03ffffff); 
    235237+       *plt_offset += 4 * sizeof(int); 
    236238+ 
     
    238240+       if (v & 0x00008000) 
    239241+               v += 0x10000; 
    240   
    241 -       *location = (*location & ~0x03ffffff) | 
    242 -                   ((*location + (v >> 2)) & 0x03ffffff); 
     242+ 
    243243+       tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */ 
    244244+       tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */ 
     
    269269        if (v % 4) { 
    270270                printk(KERN_ERR "module %s: dangerous relocation\n", me->name); 
    271                 return -ENOEXEC; 
     271@@ -125,17 +293,31 @@ static int apply_r_mips_26_rela(struct m 
    272272        } 
    273273  
    274 -       if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { 
    275 +       if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000) && 
    276 +           ((v = add_plt_entry(me, location, v + (ofs << 2))) == 0)) { 
    277                 printk(KERN_ERR 
     274        if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { 
     275-               printk(KERN_ERR 
     276+           v = add_plt_entry(me, location, v + (ofs << 2)); 
     277+               if (!v) { 
     278+                       printk(KERN_ERR 
    278279                       "module %s: relocation overflow\n", 
    279280                       me->name); 
    280                 return -ENOEXEC; 
     281-               return -ENOEXEC; 
     282+                       return -ENOEXEC; 
     283+               } 
     284+               ofs = 0; 
    281285        } 
    282286  
     
    300304 { 
    301305        struct mips_hi16 *n; 
    302 @@ -400,11 +579,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
     306@@ -400,11 +582,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
    303307                list_add(&me->arch.dbe_list, &dbe_list); 
    304308                spin_unlock_irq(&dbe_lock); 
  • trunk/target/linux/generic-2.6/patches-2.6.30/027-mips_module_reloc.patch

    r16772 r16831  
    210210 } 
    211211  
    212 @@ -97,45 +248,73 @@ static int apply_r_mips_32_rela(struct m 
     212@@ -97,27 +248,44 @@ static int apply_r_mips_32_rela(struct m 
    213213        return 0; 
    214214 } 
     
    232232+       if (*plt_offset == size) 
    233233+               return 0; 
    234 + 
     234  
     235-       *location = (*location & ~0x03ffffff) | 
     236-                   ((*location + (v >> 2)) & 0x03ffffff); 
    235237+       *plt_offset += 4 * sizeof(int); 
    236238+ 
     
    238240+       if (v & 0x00008000) 
    239241+               v += 0x10000; 
    240   
    241 -       *location = (*location & ~0x03ffffff) | 
    242 -                   ((*location + (v >> 2)) & 0x03ffffff); 
     242+ 
    243243+       tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */ 
    244244+       tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */ 
     
    269269        if (v % 4) { 
    270270                printk(KERN_ERR "module %s: dangerous relocation\n", me->name); 
    271                 return -ENOEXEC; 
     271@@ -125,17 +293,31 @@ static int apply_r_mips_26_rela(struct m 
    272272        } 
    273273  
    274 -       if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { 
    275 +       if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000) && 
    276 +           ((v = add_plt_entry(me, location, v + (ofs << 2))) == 0)) { 
    277                 printk(KERN_ERR 
     274        if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { 
     275-               printk(KERN_ERR 
     276+           v = add_plt_entry(me, location, v + (ofs << 2)); 
     277+               if (!v) { 
     278+                       printk(KERN_ERR 
    278279                       "module %s: relocation overflow\n", 
    279280                       me->name); 
    280                 return -ENOEXEC; 
     281-               return -ENOEXEC; 
     282+                       return -ENOEXEC; 
     283+               } 
     284+               ofs = 0; 
    281285        } 
    282286  
     
    300304 { 
    301305        struct mips_hi16 *n; 
    302 @@ -400,11 +579,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
     306@@ -400,11 +582,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
    303307                list_add(&me->arch.dbe_list, &dbe_list); 
    304308                spin_unlock_irq(&dbe_lock); 
Note: See TracChangeset for help on using the changeset viewer.