Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w632j-003tcK-2A for pgsql-bugs@arkaria.postgresql.org; Fri, 27 Mar 2026 08:59:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w632i-008aXk-07 for pgsql-bugs@arkaria.postgresql.org; Fri, 27 Mar 2026 08:59:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w632h-008aXb-1l for pgsql-bugs@lists.postgresql.org; Fri, 27 Mar 2026 08:59:48 +0000 Received: from lahtoruutu.iki.fi ([2a0b:5c81:1c1::37]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w632f-00000001I3A-0Ymb for pgsql-bugs@lists.postgresql.org; Fri, 27 Mar 2026 08:59:47 +0000 Received: from [10.0.2.15] (unknown [137.83.235.83]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4fhvj51kH4z49PtJ; Fri, 27 Mar 2026 10:59:37 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1774601977; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=dU/PHeoAZq4rNG/neeNDnFKcJlint94Je48Rcc7Pe5A=; b=mnbzI98pITZh0GFCytjliYEf1oXJFhlVdNIXmTxDXhmPLd1d7Qxs1hwlY+fc416goqMVsk i+S683AAOLuMox3CIH7X2qJHHjBKOQ4eFVwUB+C/+mey+Hm4bQ1/22Cr0bjjXtKJ/e/GT7 TpD07WNqPLgoVVoYuM/5NUfiVmPkHXqF+OmVNMsk7x1WfgDFwcU4JgX5z+hOB+OCEfMGL0 U/blNg0qbOZdmP6ePe4COXy06mL0pDSW+k4elum21zLysRycWOewDHf77kxG6z5HLjZAaT gIcrH6jcTLWcD0qGGYdEjM4LZdwkanyzW9gsRIEx4n+xPu0BDGGUNYioPKSBNg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1774601977; b=n6SxEvP//i3zl4WTBdhlgWx+z3R/aM8IYFQBY+GjBn0nM1wcNp9GS2gCEIhPkYF65erPkE H7fz+v3VU/ebw6gjt2jFYGKrB9StEGn93lPFrEowph5zL8ilUjgu2w6Ach9ZR5ZfTql4C7 ZmlKJn/nBvJpSsxbkClZKwOOXYDs8n1bjGSYAOugzxi+COLLGb9TvljAEqwWUM+/59lPUY SEUFptWzki5DN9fnSjJHU1YjLN/OnSflU5Dun49A9jTG+vEdRycSZZzyF7O7FHZyJua2td PHknTmaPoZKoMpgkiXK2N1JTc2o3XYCHjF0w45/APTSc3KU037pBeofWTt79Yw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1774601977; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=dU/PHeoAZq4rNG/neeNDnFKcJlint94Je48Rcc7Pe5A=; b=MHJRCXiU5aZx8gTAUPPXy4A07peLhqHVO4mQdFkSlWp+AZiekuqMjRXrrJDtKibQ3wY428 J8lfpbLF1k5GC2K98soLSa4mGLYNAnmm+8Hp9TrUVe8TxdVyC4JHLldADxME2rpS8EYCgC 9NOYMp8aa3Wf3v9MV+9ImUsqWC+4yjYUuqWhdVUjjs4qJ+fZ5IzCYx1m9ruqWuDMLDsJKx 55hBpJzkUTfriz/cc/Y1yqBf2bbVKsrZVSXZTbvoYSUB+zzGJ65U4u+v7hx3Ire9r+dEnL qMQ1T9a/95NJBxiNaY1BNLysH6L5pk1TJCnP/TjckVXwUHQTipRJWSx8NdhN5w== Content-Type: multipart/mixed; boundary="------------YWDNHRh0sD0Djd0furUg2nUD" Message-ID: <178e0d90-26d9-4c3a-9448-2f64f0d35dc8@iki.fi> Date: Fri, 27 Mar 2026 10:59:32 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Memory leak in pg_stat_statements when qtext file contains invalid encoding To: Lukas Fittl , Gaurav Singh Cc: pgsql-bugs@lists.postgresql.org References: Content-Language: en-US From: Heikki Linnakangas In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------YWDNHRh0sD0Djd0furUg2nUD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 27/03/2026 10:21, Lukas Fittl wrote: > Hi Gaurav, > > On Fri, Mar 27, 2026 at 12:54 AM Gaurav Singh wrote: >> If the qtext file contains an invalid encoding, pg_any_to_server calls ereport(ERROR) which longjmps out of the function. >> The cleanup code at the bottom of the function is never reached. >> >> LWLockRelease(pgss->lock); >> if (qbuffer) >> free(qbuffer); >> On every subsequent call, the malloc'd buffer (the entire file contents) is leaked, and the LWLock release is also skipped. > > I don't think the analysis is correct in regards to the LWLock release > - that should be taken care of by LWLockReleaseAll on abort. > > But I think you're correct about qbuffer - because that buffer is > using malloc (not palloc), its not part of any memory context, and so > it will happily leak on abort. Yep > It appears our use of malloc in pg_stat_statements is so that we can > fail on OOM and return NULL without a jump. I think that makes sense > for when a GC cycle was triggered during regular query execution > (since we don't want to error the original query), but it seems like > just bubbling up the OOM if needed when querying the > pg_stat_statements function seems fine. > > I wonder if its worth separating the two cases, since the issue you're > describing (the call to pg_any_to_server failing) only happens when > returning the query text file contents to the client. I think your > PG_FINALLY suggestion could also work, but it feels a bit tedious to > wrap the whole pg_stat_statements_internal function in it. Hmm, perhaps. But there's a simpler, less invasive fix. When that code was written, we didn't have MCXT_ALLOC_HUGE nor MCXT_ALLOC_NO_OOM. Now that we do, we can just use palloc_extended(MCXT_ALLOC_HUGE | MCXT_ALLOC_NO_OOM) instead of raw malloc(). Per attached. - Heikki --------------YWDNHRh0sD0Djd0furUg2nUD Content-Type: text/x-patch; charset=UTF-8; name="0001-Avoid-memory-leak-on-error-while-parsing-pg_stat_sta.patch" Content-Disposition: attachment; filename*0="0001-Avoid-memory-leak-on-error-while-parsing-pg_stat_sta.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBhODhmZGQ3OWUwMTMxYTI1MTQxZjVlZmQ4NDI0NjAyNmIzYjdmNmZmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjcgTWFyIDIwMjYgMTA6NTI6MDQgKzAyMDAK U3ViamVjdDogW1BBVENIIDEvMV0gQXZvaWQgbWVtb3J5IGxlYWsgb24gZXJyb3Igd2hpbGUg cGFyc2luZwogcGdfc3RhdF9zdGF0ZW1lbnRzIGR1bXAgZmlsZQoKQnkgdXNpbmcgcGFsbG9j KCkgaW5zdGVhZCBvZiByYXcgbWFsbG9jKCkuCgpSZXBvcnRlZC1ieTogR2F1cmF2IFNpbmdo IDxnYXVyYXYuc2luZ2hAeXVnYWJ5dGUuY29tPgpSZXZpZXdlZC1ieTogTHVrYXMgRml0dGwg PGx1a2FzQGZpdHRsLmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5v cmcvbWVzc2FnZS1pZC9DQUVjUTFiWVI5czRlUUxGRGp6ekpIVThmai1NVGJtUnBXLTlKLXIy Z3NDbitIRXN5bndAbWFpbC5nbWFpbC5jb20KLS0tCiAuLi4vcGdfc3RhdF9zdGF0ZW1lbnRz L3BnX3N0YXRfc3RhdGVtZW50cy5jICAgfCAyMiArKysrKysrKysrKy0tLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgMTMgaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMuYyBi L2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCmluZGV4 IDZjYjE0ODI0ZWMzLi43OTc1NDc2Yjg5MCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19zdGF0 X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKKysrIGIvY29udHJpYi9wZ19zdGF0 X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKQEAgLTgwNSw3ICs4MDUsNyBAQCBw Z3NzX3NobWVtX3NodXRkb3duKGludCBjb2RlLCBEYXR1bSBhcmcpCiAJaWYgKGZ3cml0ZSgm cGdzcy0+c3RhdHMsIHNpemVvZihwZ3NzR2xvYmFsU3RhdHMpLCAxLCBmaWxlKSAhPSAxKQog CQlnb3RvIGVycm9yOwogCi0JZnJlZShxYnVmZmVyKTsKKwlwZnJlZShxYnVmZmVyKTsKIAlx YnVmZmVyID0gTlVMTDsKIAogCWlmIChGcmVlRmlsZShmaWxlKSkKQEAgLTgyOSw3ICs4Mjks OCBAQCBlcnJvcjoKIAkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAogCQkJIGVycm1z ZygiY291bGQgbm90IHdyaXRlIGZpbGUgXCIlc1wiOiAlbSIsCiAJCQkJCVBHU1NfRFVNUF9G SUxFICIudG1wIikpKTsKLQlmcmVlKHFidWZmZXIpOworCWlmIChxYnVmZmVyKQorCQlwZnJl ZShxYnVmZmVyKTsKIAlpZiAoZmlsZSkKIAkJRnJlZUZpbGUoZmlsZSk7CiAJdW5saW5rKFBH U1NfRFVNUF9GSUxFICIudG1wIik7CkBAIC0xODI1LDcgKzE4MjYsOCBAQCBwZ19zdGF0X3N0 YXRlbWVudHNfaW50ZXJuYWwoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8sCiAJCQlwZ3NzLT5l eHRlbnQgIT0gZXh0ZW50IHx8CiAJCQlwZ3NzLT5nY19jb3VudCAhPSBnY19jb3VudCkKIAkJ ewotCQkJZnJlZShxYnVmZmVyKTsKKwkJCWlmIChxYnVmZmVyKQorCQkJCXBmcmVlKHFidWZm ZXIpOwogCQkJcWJ1ZmZlciA9IHF0ZXh0X2xvYWRfZmlsZSgmcWJ1ZmZlcl9zaXplKTsKIAkJ fQogCX0KQEAgLTIwNDYsNyArMjA0OCw4IEBAIHBnX3N0YXRfc3RhdGVtZW50c19pbnRlcm5h bChGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbywKIAogCUxXTG9ja1JlbGVhc2UocGdzcy0+bG9j ayk7CiAKLQlmcmVlKHFidWZmZXIpOworCWlmIChxYnVmZmVyKQorCQlwZnJlZShxYnVmZmVy KTsKIH0KIAogLyogTnVtYmVyIG9mIG91dHB1dCBhcmd1bWVudHMgKGNvbHVtbnMpIGZvciBw Z19zdGF0X3N0YXRlbWVudHNfaW5mbyAqLwpAQCAtMjMzMyw3ICsyMzM2LDcgQEAgZXJyb3I6 CiB9CiAKIC8qCi0gKiBSZWFkIHRoZSBleHRlcm5hbCBxdWVyeSB0ZXh0IGZpbGUgaW50byBh IG1hbGxvYydkIGJ1ZmZlci4KKyAqIFJlYWQgdGhlIGV4dGVybmFsIHF1ZXJ5IHRleHQgZmls ZSBpbnRvIGEgcGFsbG9jJ2QgYnVmZmVyLgogICoKICAqIFJldHVybnMgTlVMTCAod2l0aG91 dCB0aHJvd2luZyBhbiBlcnJvcikgaWYgdW5hYmxlIHRvIHJlYWQsIGVnCiAgKiBmaWxlIG5v dCB0aGVyZSBvciBpbnN1ZmZpY2llbnQgbWVtb3J5LgpAQCAtMjM3NSw3ICsyMzc4LDcgQEAg cXRleHRfbG9hZF9maWxlKFNpemUgKmJ1ZmZlcl9zaXplKQogCiAJLyogQWxsb2NhdGUgYnVm ZmVyOyBiZXdhcmUgdGhhdCBvZmZfdCBtaWdodCBiZSB3aWRlciB0aGFuIHNpemVfdCAqLwog CWlmIChzdGF0LnN0X3NpemUgPD0gTWF4QWxsb2NIdWdlU2l6ZSkKLQkJYnVmID0gKGNoYXIg KikgbWFsbG9jKHN0YXQuc3Rfc2l6ZSk7CisJCWJ1ZiA9IChjaGFyICopIHBhbGxvY19leHRl bmRlZChzdGF0LnN0X3NpemUsIE1DWFRfQUxMT0NfSFVHRSB8IE1DWFRfQUxMT0NfTk9fT09N KTsKIAllbHNlCiAJCWJ1ZiA9IE5VTEw7CiAJaWYgKGJ1ZiA9PSBOVUxMKQpAQCAtMjQxNCw3 ICsyNDE3LDcgQEAgcXRleHRfbG9hZF9maWxlKFNpemUgKmJ1ZmZlcl9zaXplKQogCQkJCQkJ KGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCiAJCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qg cmVhZCBmaWxlIFwiJXNcIjogJW0iLAogCQkJCQkJCQlQR1NTX1RFWFRfRklMRSkpKTsKLQkJ CWZyZWUoYnVmKTsKKwkJCXBmcmVlKGJ1Zik7CiAJCQlDbG9zZVRyYW5zaWVudEZpbGUoZmQp OwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTI2MjUsNyArMjYyOCw3IEBAIGdjX3F0ZXh0 cyh2b2lkKQogCWVsc2UKIAkJcGdzcy0+bWVhbl9xdWVyeV9sZW4gPSBBU1NVTUVEX0xFTkdU SF9JTklUOwogCi0JZnJlZShxYnVmZmVyKTsKKwlwZnJlZShxYnVmZmVyKTsKIAogCS8qCiAJ ICogT0ssIGNvdW50IGEgZ2FyYmFnZSBjb2xsZWN0aW9uIGN5Y2xlLiAgKE5vdGU6IGV2ZW4g dGhvdWdoIHdlIGhhdmUKQEAgLTI2NDIsNyArMjY0NSw4IEBAIGdjX2ZhaWw6CiAJLyogY2xl YW4gdXAgcmVzb3VyY2VzICovCiAJaWYgKHFmaWxlKQogCQlGcmVlRmlsZShxZmlsZSk7Ci0J ZnJlZShxYnVmZmVyKTsKKwlpZiAocWJ1ZmZlcikKKwkJcGZyZWUocWJ1ZmZlcik7CiAKIAkv KgogCSAqIFNpbmNlIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZXJuYWwgZmlsZSBhcmUgbm93 IHVuY2VydGFpbiwgbWFyayBhbGwKLS0gCjIuNDcuMwoK --------------YWDNHRh0sD0Djd0furUg2nUD--