A fix from Larry for a corner case where insmod could end up
authorEric Andersen <andersen@codepoet.org>
Thu, 26 Apr 2001 19:29:58 +0000 (19:29 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 26 Apr 2001 19:29:58 +0000 (19:29 -0000)
doing an xrealloc(0).

insmod.c
modutils/insmod.c

index 4dd14c6bcf093c800ef25406e7471cdba7d29673..27f4a50e2045123f0aa1ce7da403bea9385a8c42 100644 (file)
--- a/insmod.c
+++ b/insmod.c
 #ifndef MODUTILS_MODULE_H
 static const int MODUTILS_MODULE_H = 1;
 
-#ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $"
+#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $"
 
 /* This file contains the structures used by the 2.0 and 2.1 kernels.
    We do not use the kernel headers directly because we do not wish
@@ -330,7 +330,7 @@ int delete_module(const char *);
 #ifndef MODUTILS_OBJ_H
 static const int MODUTILS_OBJ_H = 1;
 
-#ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $"
+#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $"
 
 /* The relocatable object is manipulated using elfin types.  */
 
@@ -1536,7 +1536,9 @@ struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
 void *obj_extend_section(struct obj_section *sec, unsigned long more)
 {
        unsigned long oldsize = sec->header.sh_size;
-       sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
+       if (more) { 
+               sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
+       }
        return sec->contents + oldsize;
 }
 
@@ -2474,6 +2476,9 @@ new_init_module(const char *m_name, struct obj_file *f,
        tgt_long m_addr;
 
        sec = obj_find_section(f, ".this");
+       if (!sec || !sec->contents) { 
+               perror_msg_and_die("corrupt module %s?",m_name);
+       }
        module = (struct new_module *) sec->contents;
        m_addr = sec->header.sh_addr;
 
index 4dd14c6bcf093c800ef25406e7471cdba7d29673..27f4a50e2045123f0aa1ce7da403bea9385a8c42 100644 (file)
 #ifndef MODUTILS_MODULE_H
 static const int MODUTILS_MODULE_H = 1;
 
-#ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $"
+#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $"
 
 /* This file contains the structures used by the 2.0 and 2.1 kernels.
    We do not use the kernel headers directly because we do not wish
@@ -330,7 +330,7 @@ int delete_module(const char *);
 #ifndef MODUTILS_OBJ_H
 static const int MODUTILS_OBJ_H = 1;
 
-#ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $"
+#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $"
 
 /* The relocatable object is manipulated using elfin types.  */
 
@@ -1536,7 +1536,9 @@ struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
 void *obj_extend_section(struct obj_section *sec, unsigned long more)
 {
        unsigned long oldsize = sec->header.sh_size;
-       sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
+       if (more) { 
+               sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
+       }
        return sec->contents + oldsize;
 }
 
@@ -2474,6 +2476,9 @@ new_init_module(const char *m_name, struct obj_file *f,
        tgt_long m_addr;
 
        sec = obj_find_section(f, ".this");
+       if (!sec || !sec->contents) { 
+               perror_msg_and_die("corrupt module %s?",m_name);
+       }
        module = (struct new_module *) sec->contents;
        m_addr = sec->header.sh_addr;