summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-09-26 15:47:17 (GMT)
committerGuido van Rossum <guido@python.org>1994-09-26 15:47:17 (GMT)
commit6c849697fd0085ea4415b7ef5bdef30e734092b2 (patch)
tree9fbb73dd94b46970e99d9c21532a5aa961c2db36 /Python
parent138d72f64b640f25db2b1e7b480c3935e74cdd4a (diff)
downloadcpython-6c849697fd0085ea4415b7ef5bdef30e734092b2.zip
cpython-6c849697fd0085ea4415b7ef5bdef30e734092b2.tar.gz
cpython-6c849697fd0085ea4415b7ef5bdef30e734092b2.tar.bz2
Fix various potential buffer overrun problems.
Diffstat (limited to 'Python')
-rw-r--r--Python/import.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/Python/import.c b/Python/import.c
index f655041..2f782aa 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -167,8 +167,12 @@ extern char *getprogramname();
#endif /* DYNAMIC_LINK */
-/* Magic word to reject .pyc files generated by other Python versions */
+/* Max length of module suffix searched for -- accommodates "module.so" */
+#ifndef MAXSUFFIXSIZE
+#define MAXSUFFIXSIZE 10
+#endif
+/* Magic word to reject .pyc files generated by other Python versions */
#define MAGIC 0x999903L /* Increment by one for each incompatible change */
static object *modules;
@@ -355,7 +359,7 @@ load_dynamic_module(name, namebuf, m, m_ret)
char buf[256];
if (verbose)
perror(namebuf);
- sprintf(buf,"Failed to load %s", namebuf);
+ sprintf(buf, "Failed to load %.200s", namebuf);
err_setstr(ImportError, buf);
return NULL;
}
@@ -396,7 +400,7 @@ get_module(m, name, m_ret)
char *name;
object **m_ret;
{
- int err, npath, i, len;
+ int err, npath, i, len, namelen;
long magic;
long mtime, pyc_mtime;
char namebuf[MAXPATHLEN+1];
@@ -413,16 +417,21 @@ get_module(m, name, m_ret)
return NULL;
}
npath = getlistsize(path);
+ namelen = strlen(name);
for (i = 0; i < npath; i++) {
v = getlistitem(path, i);
if (!is_stringobject(v))
continue;
- strcpy(namebuf, getstringvalue(v));
len = getstringsize(v);
+ if (len + 1 + namelen + MAXSUFFIXSIZE >= MAXPATHLEN)
+ continue; /* Too long */
+ strcpy(namebuf, getstringvalue(v));
+ if (strlen(namebuf) != len)
+ continue; /* v contains '\0' */
if (len > 0 && namebuf[len-1] != SEP)
namebuf[len++] = SEP;
strcpy(namebuf+len, name);
- len += strlen(name);
+ len += namelen;
for (fdp = filetab; fdp->suffix != NULL; fdp++) {
strcpy(namebuf+len, fdp->suffix);
if (verbose > 1)
@@ -435,7 +444,7 @@ get_module(m, name, m_ret)
break;
}
if (fp == NULL) {
- sprintf(namebuf, "No module named %s", name);
+ sprintf(namebuf, "No module named %.200s", name);
err_setstr(ImportError, namebuf);
return NULL;
}
@@ -761,9 +770,9 @@ void aix_loaderror(char *namebuf)
};
#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))
-#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf))
+#define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)
- sprintf(errbuf, " from module %s ", namebuf);
+ sprintf(errbuf, " from module %.200s ", namebuf);
if (!loadquery(1, &message[0], sizeof(message)))
ERRBUF_APPEND(strerror(errno));
@@ -777,7 +786,7 @@ void aix_loaderror(char *namebuf)
ERRBUF_APPEND(message[i]);
ERRBUF_APPEND("\n");
}
- errbuf[strlen(errbuf)-1] = '\0' ; /* trim off last newline */
+ errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
err_setstr(ImportError, errbuf);
return;
}