Fix buffer overflows noted by Gerardo Puga

-Erik
This commit is contained in:
Eric Andersen 2002-06-06 14:24:57 +00:00
parent 0d2d1eb599
commit 6fb4e4877a

View File

@ -233,7 +233,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; static const int MODUTILS_MODULE_H = 1;
#ident "$Id: insmod.c,v 1.83 2002/05/24 06:50:15 andersen Exp $" #ident "$Id: insmod.c,v 1.84 2002/06/06 14:24:57 andersen Exp $"
/* This file contains the structures used by the 2.0 and 2.1 kernels. /* 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 We do not use the kernel headers directly because we do not wish
@ -454,7 +454,7 @@ int delete_module(const char *);
#ifndef MODUTILS_OBJ_H #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; static const int MODUTILS_OBJ_H = 1;
#ident "$Id: insmod.c,v 1.83 2002/05/24 06:50:15 andersen Exp $" #ident "$Id: insmod.c,v 1.84 2002/06/06 14:24:57 andersen Exp $"
/* The relocatable object is manipulated using elfin types. */ /* The relocatable object is manipulated using elfin types. */
@ -3426,7 +3426,7 @@ extern int insmod_main( int argc, char **argv)
int k_crcs; int k_crcs;
int k_new_syscalls; int k_new_syscalls;
int len; int len;
char *tmp; char *tmp, *tmp1;
unsigned long m_size; unsigned long m_size;
ElfW(Addr) m_addr; ElfW(Addr) m_addr;
FILE *fp; FILE *fp;
@ -3464,7 +3464,7 @@ extern int insmod_main( int argc, char **argv)
flag_export = 0; flag_export = 0;
break; break;
case 'o': /* name the output module */ case 'o': /* name the output module */
strncpy(m_name, optarg, FILENAME_MAX); safe_strncpy(m_name, optarg, sizeof(m_name));
break; break;
case 'L': /* Stub warning */ case 'L': /* Stub warning */
/* This is needed for compatibility with modprobe. /* This is needed for compatibility with modprobe.
@ -3482,20 +3482,26 @@ extern int insmod_main( int argc, char **argv)
} }
/* Grab the module name */ /* Grab the module name */
if ((tmp = strrchr(argv[optind], '/')) != NULL) { tmp1 = xstrdup(argv[optind]);
tmp++; tmp = basename(tmp1);
} else {
tmp = argv[optind];
}
len = strlen(tmp); len = strlen(tmp);
if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
len -= 2; len-=2;
memcpy(m_fullName, tmp, len); tmp[len] = '\0';
m_fullName[len]='\0';
if (*m_name == '\0') {
strcpy(m_name, m_fullName);
} }
if (len >= sizeof(m_fullName)) {
len = sizeof(m_fullName);
}
safe_strncpy(m_fullName, tmp, len);
if (tmp1)
free(tmp1);
if (*m_name == '\0') {
safe_strncpy(m_name, m_fullName, sizeof(m_name));
}
len = strlen(m_fullName);
if (len > (sizeof(m_fullName)-3))
error_msg_and_die("%s: no module by that name found", m_fullName);
strcat(m_fullName, ".o"); strcat(m_fullName, ".o");
/* Get a filedesc for the module. Check we we have a complete path */ /* Get a filedesc for the module. Check we we have a complete path */