bpo-36389: Fix _PyBytesWriter in release mode (GH-16624) · python/cpython@60ec6ef (original) (raw)

`@@ -2031,20 +2031,6 @@ _Py_GetAllocatedBlocks(void)

`

2031

2031

` * it wraps a real allocator, adding extra debugging info to the memory blocks.

`

2032

2032

` */

`

2033

2033

``

2034

``

`-

/* Special bytes broadcast into debug memory blocks at appropriate times.

`

2035

``

`-

`

2036

``

`-

`

2037

``

`-

`

2038

``

`-

`

2039

``

`-

`

2040

``

`-

*/

`

2041

``

`-

#undef CLEANBYTE

`

2042

``

`-

#undef DEADBYTE

`

2043

``

`-

#undef FORBIDDENBYTE

`

2044

``

`-

#define CLEANBYTE 0xCD /* clean (newly allocated) memory */

`

2045

``

`-

#define DEADBYTE 0xDD /* dead (newly freed) memory */

`

2046

``

`-

#define FORBIDDENBYTE 0xFD /* untouchable bytes at each end of a block */

`

2047

``

-

2048

2034

`/* Uncomment this define to add the "serialno" field */

`

2049

2035

`/* #define PYMEM_DEBUG_SERIALNO */

`

2050

2036

``

`@@ -2106,14 +2092,14 @@ p[0: S]

`

2106

2092

`p[S]

`

2107

2093

` API ID. See PEP 445. This is a character, but seems undocumented.

`

2108

2094

`p[S+1: 2*S]

`

2109

``

`-

Copies of FORBIDDENBYTE. Used to catch under- writes and reads.

`

``

2095

`+

Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and reads.

`

2110

2096

`p[2S: 2S+n]

`

2111

``

`-

The requested memory, filled with copies of CLEANBYTE.

`

``

2097

`+

The requested memory, filled with copies of PYMEM_CLEANBYTE.

`

2112

2098

` Used to catch reference to uninitialized memory.

`

2113

2099

` &p[2*S] is returned. Note that this is 8-byte aligned if pymalloc

`

2114

2100

` handled the request itself.

`

2115

2101

`p[2S+n: 2S+n+S]

`

2116

``

`-

Copies of FORBIDDENBYTE. Used to catch over- writes and reads.

`

``

2102

`+

Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and reads.

`

2117

2103

`p[2S+n+S: 2S+n+2*S]

`

2118

2104

` A serial number, incremented by 1 on each call to _PyMem_DebugMalloc

`

2119

2105

` and _PyMem_DebugRealloc.

`

`@@ -2170,15 +2156,15 @@ _PyMem_DebugRawAlloc(int use_calloc, void *ctx, size_t nbytes)

`

2170

2156

`/* at p, write size (SST bytes), id (1 byte), pad (SST-1 bytes) */

`

2171

2157

`write_size_t(p, nbytes);

`

2172

2158

`p[SST] = (uint8_t)api->api_id;

`

2173

``

`-

memset(p + SST + 1, FORBIDDENBYTE, SST-1);

`

``

2159

`+

memset(p + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);

`

2174

2160

``

2175

2161

`if (nbytes > 0 && !use_calloc) {

`

2176

``

`-

memset(data, CLEANBYTE, nbytes);

`

``

2162

`+

memset(data, PYMEM_CLEANBYTE, nbytes);

`

2177

2163

` }

`

2178

2164

``

2179

2165

`/* at tail, write pad (SST bytes) and serialno (SST bytes) */

`

2180

2166

`tail = data + nbytes;

`

2181

``

`-

memset(tail, FORBIDDENBYTE, SST);

`

``

2167

`+

memset(tail, PYMEM_FORBIDDENBYTE, SST);

`

2182

2168

`#ifdef PYMEM_DEBUG_SERIALNO

`

2183

2169

`write_size_t(tail + SST, serialno);

`

2184

2170

`#endif

`

`@@ -2204,7 +2190,7 @@ _PyMem_DebugRawCalloc(void *ctx, size_t nelem, size_t elsize)

`

2204

2190

``

2205

2191

`/* The debug free first checks the 2*SST bytes on each end for sanity (in

`

2206

2192

` particular, that the FORBIDDENBYTEs with the api ID are still intact).

`

2207

``

`-

Then fills the original bytes with DEADBYTE.

`

``

2193

`+

Then fills the original bytes with PYMEM_DEADBYTE.

`

2208

2194

` Then calls the underlying free.

`

2209

2195

`*/

`

2210

2196

`static void

`

`@@ -2222,7 +2208,7 @@ _PyMem_DebugRawFree(void *ctx, void *p)

`

2222

2208

`_PyMem_DebugCheckAddress(api->api_id, p);

`

2223

2209

`nbytes = read_size_t(q);

`

2224

2210

`nbytes += PYMEM_DEBUG_EXTRA_BYTES;

`

2225

``

`-

memset(q, DEADBYTE, nbytes);

`

``

2211

`+

memset(q, PYMEM_DEADBYTE, nbytes);

`

2226

2212

`api->alloc.free(api->alloc.ctx, q);

`

2227

2213

`}

`

2228

2214

``

`@@ -2264,14 +2250,14 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)

`

2264

2250

` */

`

2265

2251

`if (original_nbytes <= sizeof(save)) {

`

2266

2252

`memcpy(save, data, original_nbytes);

`

2267

``

`-

memset(data - 2 * SST, DEADBYTE,

`

``

2253

`+

memset(data - 2 * SST, PYMEM_DEADBYTE,

`

2268

2254

`original_nbytes + PYMEM_DEBUG_EXTRA_BYTES);

`

2269

2255

` }

`

2270

2256

`else {

`

2271

2257

`memcpy(save, data, ERASED_SIZE);

`

2272

``

`-

memset(head, DEADBYTE, ERASED_SIZE + 2 * SST);

`

``

2258

`+

memset(head, PYMEM_DEADBYTE, ERASED_SIZE + 2 * SST);

`

2273

2259

`memcpy(&save[ERASED_SIZE], tail - ERASED_SIZE, ERASED_SIZE);

`

2274

``

`-

memset(tail - ERASED_SIZE, DEADBYTE,

`

``

2260

`+

memset(tail - ERASED_SIZE, PYMEM_DEADBYTE,

`

2275

2261

`ERASED_SIZE + PYMEM_DEBUG_EXTRA_BYTES - 2 * SST);

`

2276

2262

` }

`

2277

2263

``

`@@ -2293,10 +2279,10 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)

`

2293

2279

``

2294

2280

`write_size_t(head, nbytes);

`

2295

2281

`head[SST] = (uint8_t)api->api_id;

`

2296

``

`-

memset(head + SST + 1, FORBIDDENBYTE, SST-1);

`

``

2282

`+

memset(head + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);

`

2297

2283

``

2298

2284

`tail = data + nbytes;

`

2299

``

`-

memset(tail, FORBIDDENBYTE, SST);

`

``

2285

`+

memset(tail, PYMEM_FORBIDDENBYTE, SST);

`

2300

2286

`#ifdef PYMEM_DEBUG_SERIALNO

`

2301

2287

`write_size_t(tail + SST, block_serialno);

`

2302

2288

`#endif

`

`@@ -2320,7 +2306,8 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)

`

2320

2306

``

2321

2307

`if (nbytes > original_nbytes) {

`

2322

2308

`/* growing: mark new extra memory clean */

`

2323

``

`-

memset(data + original_nbytes, CLEANBYTE, nbytes - original_nbytes);

`

``

2309

`+

memset(data + original_nbytes, PYMEM_CLEANBYTE,

`

``

2310

`+

nbytes - original_nbytes);

`

2324

2311

` }

`

2325

2312

``

2326

2313

`return data;

`

`@@ -2399,7 +2386,7 @@ _PyMem_DebugCheckAddress(char api, const void *p)

`

2399

2386

` * the tail could lead to a segfault then.

`

2400

2387

` */

`

2401

2388

`for (i = SST-1; i >= 1; --i) {

`

2402

``

`-

if (*(q-i) != FORBIDDENBYTE) {

`

``

2389

`+

if (*(q-i) != PYMEM_FORBIDDENBYTE) {

`

2403

2390

`msg = "bad leading pad byte";

`

2404

2391

` goto error;

`

2405

2392

` }

`

`@@ -2408,7 +2395,7 @@ _PyMem_DebugCheckAddress(char api, const void *p)

`

2408

2395

`nbytes = read_size_t(q - 2*SST);

`

2409

2396

`tail = q + nbytes;

`

2410

2397

`for (i = 0; i < SST; ++i) {

`

2411

``

`-

if (tail[i] != FORBIDDENBYTE) {

`

``

2398

`+

if (tail[i] != PYMEM_FORBIDDENBYTE) {

`

2412

2399

`msg = "bad trailing pad byte";

`

2413

2400

` goto error;

`

2414

2401

` }

`

`@@ -2448,7 +2435,7 @@ _PyObject_DebugDumpAddress(const void *p)

`

2448

2435

`fprintf(stderr, " The %d pad bytes at p-%d are ", SST-1, SST-1);

`

2449

2436

`ok = 1;

`

2450

2437

`for (i = 1; i <= SST-1; ++i) {

`

2451

``

`-

if (*(q-i) != FORBIDDENBYTE) {

`

``

2438

`+

if (*(q-i) != PYMEM_FORBIDDENBYTE) {

`

2452

2439

`ok = 0;

`

2453

2440

`break;

`

2454

2441

` }

`

`@@ -2457,11 +2444,11 @@ _PyObject_DebugDumpAddress(const void *p)

`

2457

2444

`fputs("FORBIDDENBYTE, as expected.\n", stderr);

`

2458

2445

`else {

`

2459

2446

`fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",

`

2460

``

`-

FORBIDDENBYTE);

`

``

2447

`+

PYMEM_FORBIDDENBYTE);

`

2461

2448

`for (i = SST-1; i >= 1; --i) {

`

2462

2449

`const uint8_t byte = *(q-i);

`

2463

2450

`fprintf(stderr, " at p-%d: 0x%02x", i, byte);

`

2464

``

`-

if (byte != FORBIDDENBYTE)

`

``

2451

`+

if (byte != PYMEM_FORBIDDENBYTE)

`

2465

2452

`fputs(" *** OUCH", stderr);

`

2466

2453

`fputc('\n', stderr);

`

2467

2454

` }

`

`@@ -2476,7 +2463,7 @@ _PyObject_DebugDumpAddress(const void *p)

`

2476

2463

`fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, (void *)tail);

`

2477

2464

`ok = 1;

`

2478

2465

`for (i = 0; i < SST; ++i) {

`

2479

``

`-

if (tail[i] != FORBIDDENBYTE) {

`

``

2466

`+

if (tail[i] != PYMEM_FORBIDDENBYTE) {

`

2480

2467

`ok = 0;

`

2481

2468

`break;

`

2482

2469

` }

`

`@@ -2485,12 +2472,12 @@ _PyObject_DebugDumpAddress(const void *p)

`

2485

2472

`fputs("FORBIDDENBYTE, as expected.\n", stderr);

`

2486

2473

`else {

`

2487

2474

`fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",

`

2488

``

`-

FORBIDDENBYTE);

`

``

2475

`+

PYMEM_FORBIDDENBYTE);

`

2489

2476

`for (i = 0; i < SST; ++i) {

`

2490

2477

`const uint8_t byte = tail[i];

`

2491

2478

`fprintf(stderr, " at tail+%d: 0x%02x",

`

2492

2479

`i, byte);

`

2493

``

`-

if (byte != FORBIDDENBYTE)

`

``

2480

`+

if (byte != PYMEM_FORBIDDENBYTE)

`

2494

2481

`fputs(" *** OUCH", stderr);

`

2495

2482

`fputc('\n', stderr);

`

2496

2483

` }

`