Mercurial > cpython-lru_cache-weakref
diff Python/import.c @ 1905:61c3c1a2fdb4 legacy-trunk
Fix various potential buffer overrun problems.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 26 Sep 1994 15:47:17 +0000 |
| parents | ac6a9f90f6fd |
| children | 3d822e32c329 |
line wrap: on
line diff
--- a/Python/import.c Fri Sep 23 16:10:35 1994 +0000 +++ b/Python/import.c Mon Sep 26 15:47:17 1994 +0000 @@ -167,8 +167,12 @@ #endif /* DYNAMIC_LINK */ +/* 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 @@ 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 @@ 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 @@ return NULL; } npath = getlistsize(path); + namelen = strlen(name); for (i = 0; i < npath; i++) { v = getlistitem(path, i); if (!is_stringobject(v)) continue; + len = getstringsize(v); + if (len + 1 + namelen + MAXSUFFIXSIZE >= MAXPATHLEN) + continue; /* Too long */ strcpy(namebuf, getstringvalue(v)); - len = getstringsize(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 @@ 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 @@ }; #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 @@ 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; }
