Use sizeof(buffer) instead of duplicating the constants to ensure they won't
be wrong. The real change is to pass (bufsz - 1) to PyOS_ascii_formatd and 1 to strncat. strncat copies n+1 bytes from src (not dest). Reported by Klocwork #58.
This commit is contained in:
parent
c0cde4da2a
commit
4b0a315c31
|
@ -274,16 +274,16 @@ complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
|
|||
{
|
||||
char format[32];
|
||||
if (v->cval.real == 0.) {
|
||||
PyOS_snprintf(format, 32, "%%.%ig", precision);
|
||||
PyOS_ascii_formatd(buf, bufsz, format, v->cval.imag);
|
||||
strncat(buf, "j", bufsz);
|
||||
PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
|
||||
PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
|
||||
strncat(buf, "j", 1);
|
||||
} else {
|
||||
char re[64], im[64];
|
||||
/* Format imaginary part with sign, real part without */
|
||||
PyOS_snprintf(format, 32, "%%.%ig", precision);
|
||||
PyOS_ascii_formatd(re, 64, format, v->cval.real);
|
||||
PyOS_snprintf(format, 32, "%%+.%ig", precision);
|
||||
PyOS_ascii_formatd(im, 64, format, v->cval.imag);
|
||||
PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
|
||||
PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
|
||||
PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
|
||||
PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
|
||||
PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue