[2.7] bpo-38730: Fix -Wstringop-truncation warnings. (GH-17075)

This commit is contained in:
Benjamin Peterson 2019-11-07 07:06:28 -08:00 committed by GitHub
parent 089e5f52a3
commit f32bcf8c27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 19 additions and 18 deletions

View File

@ -0,0 +1 @@
Fix problems identified by GCC's ``-Wstringop-truncation`` warning.

View File

@ -486,7 +486,7 @@ calculate_path(void)
if (tmpbuffer[0] == SEP) if (tmpbuffer[0] == SEP)
/* tmpbuffer should never be longer than MAXPATHLEN, /* tmpbuffer should never be longer than MAXPATHLEN,
but extra check does not hurt */ but extra check does not hurt */
strncpy(argv0_path, tmpbuffer, MAXPATHLEN); strncpy(argv0_path, tmpbuffer, MAXPATHLEN + 1);
else { else {
/* Interpret relative to progpath */ /* Interpret relative to progpath */
reduce(argv0_path); reduce(argv0_path);

View File

@ -1055,14 +1055,15 @@ validate_numnodes(node *n, int num, const char *const name)
static int static int
validate_terminal(node *terminal, int type, char *string) validate_terminal(node *terminal, int type, char *string)
{ {
int res = (validate_ntype(terminal, type) if (!validate_ntype(terminal, type)) {
&& ((string == 0) || (strcmp(string, STR(terminal)) == 0))); return 0;
}
if (!res && !PyErr_Occurred()) { if (string != NULL && strcmp(string, STR(terminal)) != 0) {
PyErr_Format(parser_error, PyErr_Format(parser_error,
"Illegal terminal: expected \"%s\"", string); "Illegal terminal: expected \"%s\"", string);
return 0;
} }
return (res); return 1;
} }

View File

@ -1180,7 +1180,7 @@ call_readline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
q = p; q = p;
p = PyMem_Malloc(n+2); p = PyMem_Malloc(n+2);
if (p != NULL) { if (p != NULL) {
strncpy(p, q, n); memcpy(p, q, n);
p[n] = '\n'; p[n] = '\n';
p[n+1] = '\0'; p[n+1] = '\0';
} }

View File

@ -173,8 +173,10 @@ trip_signal(int sig_num)
cleared in PyErr_CheckSignals() before .tripped. */ cleared in PyErr_CheckSignals() before .tripped. */
is_tripped = 1; is_tripped = 1;
Py_AddPendingCall(checksignals_witharg, NULL); Py_AddPendingCall(checksignals_witharg, NULL);
if (wakeup_fd != -1) if (wakeup_fd != -1) {
write(wakeup_fd, "\0", 1); int rc = write(wakeup_fd, "\0", 1);
(void)rc;
}
} }
static void static void

View File

@ -714,8 +714,8 @@ read_directory(const char *archive)
unsigned int count, i; unsigned int count, i;
unsigned char buffer[46]; unsigned char buffer[46];
size_t length; size_t length;
char path[MAXPATHLEN + 5]; char name[MAXPATHLEN + 1];
char name[MAXPATHLEN + 5]; char path[2*MAXPATHLEN + 2]; /* archive + SEP + name + '\0' */
const char *errmsg = NULL; const char *errmsg = NULL;
if (strlen(archive) > MAXPATHLEN) { if (strlen(archive) > MAXPATHLEN) {
@ -838,7 +838,7 @@ read_directory(const char *archive)
} }
} }
strncpy(path + length + 1, name, MAXPATHLEN - length - 1); memcpy(path + length + 1, name, name_size + 1);
t = Py_BuildValue("sHIIkHHI", path, compress, data_size, t = Py_BuildValue("sHIIkHHI", path, compress, data_size,
file_size, file_offset, time, date, crc); file_size, file_offset, time, date, crc);

View File

@ -252,10 +252,7 @@ structseq_repr(PyStructSequence *obj)
} }
/* "typename(", limited to TYPE_MAXSIZE */ /* "typename(", limited to TYPE_MAXSIZE */
len = strlen(typ->tp_name) > TYPE_MAXSIZE ? TYPE_MAXSIZE : pbuf = stpncpy(pbuf, typ->tp_name, TYPE_MAXSIZE);
strlen(typ->tp_name);
strncpy(pbuf, typ->tp_name, len);
pbuf += len;
*pbuf++ = '('; *pbuf++ = '(';
for (i=0; i < VISIBLE_SIZE(obj); i++) { for (i=0; i < VISIBLE_SIZE(obj); i++) {

View File

@ -221,7 +221,7 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
} }
plen = strlen(p); plen = strlen(p);
if (plen + nlen >= PY_SSIZE_T_MAX - 1) { if (nlen >= PY_SSIZE_T_MAX - 1 - plen) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"private identifier too large to be mangled"); "private identifier too large to be mangled");
return NULL; return NULL;
@ -233,7 +233,7 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
/* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
buffer = PyString_AS_STRING(ident); buffer = PyString_AS_STRING(ident);
buffer[0] = '_'; buffer[0] = '_';
strncpy(buffer+1, p, plen); memcpy(buffer+1, p, plen);
strcpy(buffer+1+plen, name); strcpy(buffer+1+plen, name);
return ident; return ident;
} }