public inbox for [email protected]help / color / mirror / Atom feed
[PATCH 1/4] bootstrap: convert Typ to a List* 4+ messages / 3 participants [nested] [flat]
* [PATCH 1/4] bootstrap: convert Typ to a List* @ 2020-11-20 02:48 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 4+ messages in thread From: Justin Pryzby @ 2020-11-20 02:48 UTC (permalink / raw) --- src/backend/bootstrap/bootstrap.c | 89 ++++++++++++++----------------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 6f615e6622..1b940d9d27 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -58,7 +58,7 @@ static void BootstrapModeMain(void); static void bootstrap_signals(void); static void ShutdownAuxiliaryProcess(int code, Datum arg); static Form_pg_attribute AllocateAttribute(void); -static void populate_typ_array(void); +static void populate_typ(void); static Oid gettype(char *type); static void cleanup(void); @@ -159,7 +159,7 @@ struct typmap FormData_pg_type am_typ; }; -static struct typmap **Typ = NULL; +static List *Typ = NIL; /* List of struct typmap* */ static struct typmap *Ap = NULL; static Datum values[MAXATTR]; /* current row's attribute values */ @@ -595,10 +595,10 @@ boot_openrel(char *relname) /* * pg_type must be filled before any OPEN command is executed, hence we - * can now populate the Typ array if we haven't yet. + * can now populate Typ if we haven't yet. */ - if (Typ == NULL) - populate_typ_array(); + if (Typ == NIL) + populate_typ(); if (boot_reldesc != NULL) closerel(NULL); @@ -688,7 +688,7 @@ DefineAttr(char *name, char *type, int attnum, int nullness) typeoid = gettype(type); - if (Typ != NULL) + if (Typ != NIL) { attrtypes[attnum]->atttypid = Ap->am_oid; attrtypes[attnum]->attlen = Ap->am_typ.typlen; @@ -866,47 +866,36 @@ cleanup(void) } /* ---------------- - * populate_typ_array + * populate_typ * - * Load the Typ array by reading pg_type. + * Load Typ by reading pg_type. * ---------------- */ static void -populate_typ_array(void) +populate_typ(void) { Relation rel; TableScanDesc scan; HeapTuple tup; - int nalloc; - int i; - - Assert(Typ == NULL); + MemoryContext old; - nalloc = 512; - Typ = (struct typmap **) - MemoryContextAlloc(TopMemoryContext, nalloc * sizeof(struct typmap *)); + Assert(Typ == NIL); rel = table_open(TypeRelationId, NoLock); scan = table_beginscan_catalog(rel, 0, NULL); - i = 0; + old = MemoryContextSwitchTo(TopMemoryContext); while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL) { Form_pg_type typForm = (Form_pg_type) GETSTRUCT(tup); + struct typmap *newtyp; - /* make sure there will be room for a trailing NULL pointer */ - if (i >= nalloc - 1) - { - nalloc *= 2; - Typ = (struct typmap **) - repalloc(Typ, nalloc * sizeof(struct typmap *)); - } - Typ[i] = (struct typmap *) - MemoryContextAlloc(TopMemoryContext, sizeof(struct typmap)); - Typ[i]->am_oid = typForm->oid; - memcpy(&(Typ[i]->am_typ), typForm, sizeof(Typ[i]->am_typ)); - i++; + newtyp = (struct typmap *) palloc(sizeof(struct typmap)); + Typ = lappend(Typ, newtyp); + + newtyp->am_oid = typForm->oid; + memcpy(&newtyp->am_typ, typForm, sizeof(newtyp->am_typ)); } - Typ[i] = NULL; /* Fill trailing NULL pointer */ + MemoryContextSwitchTo(old); table_endscan(scan); table_close(rel, NoLock); } @@ -916,25 +905,26 @@ populate_typ_array(void) * * NB: this is really ugly; it will return an integer index into TypInfo[], * and not an OID at all, until the first reference to a type not known in - * TypInfo[]. At that point it will read and cache pg_type in the Typ array, + * TypInfo[]. At that point it will read and cache pg_type in Typ, * and subsequently return a real OID (and set the global pointer Ap to * point at the found row in Typ). So caller must check whether Typ is - * still NULL to determine what the return value is! + * still NIL to determine what the return value is! * ---------------- */ static Oid gettype(char *type) { - if (Typ != NULL) + if (Typ != NIL) { - struct typmap **app; + ListCell *lc; - for (app = Typ; *app != NULL; app++) + foreach (lc, Typ) { - if (strncmp(NameStr((*app)->am_typ.typname), type, NAMEDATALEN) == 0) + struct typmap *app = lfirst(lc); + if (strncmp(NameStr(app->am_typ.typname), type, NAMEDATALEN) == 0) { - Ap = *app; - return (*app)->am_oid; + Ap = app; + return app->am_oid; } } } @@ -949,7 +939,7 @@ gettype(char *type) } /* Not in TypInfo, so we'd better be able to read pg_type now */ elog(DEBUG4, "external type: %s", type); - populate_typ_array(); + populate_typ(); return gettype(type); } elog(ERROR, "unrecognized type \"%s\"", type); @@ -977,17 +967,20 @@ boot_get_type_io_data(Oid typid, Oid *typinput, Oid *typoutput) { - if (Typ != NULL) + if (Typ != NIL) { /* We have the boot-time contents of pg_type, so use it */ - struct typmap **app; - struct typmap *ap; - - app = Typ; - while (*app && (*app)->am_oid != typid) - ++app; - ap = *app; - if (ap == NULL) + struct typmap *ap = NULL; + ListCell *lc; + + foreach (lc, Typ) + { + ap = lfirst(lc); + if (ap->am_oid == typid) + break; + } + + if (!ap || ap->am_oid != typid) elog(ERROR, "type OID %u not found in Typ list", typid); *typlen = ap->am_typ.typlen; -- 2.26.2 --------------BCA1373AE29B32B57608F4EE Content-Type: text/x-patch; charset=UTF-8; name="0002-Allow-composite-types-in-bootstrap-20210307.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0002-Allow-composite-types-in-bootstrap-20210307.patch" ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: pgsql: Don't trust unvalidated xl_tot_len. @ 2023-11-10 18:10 Christoph Berg <[email protected]> 0 siblings, 1 reply; 4+ messages in thread From: Christoph Berg @ 2023-11-10 18:10 UTC (permalink / raw) To: Thomas Munro <[email protected]>; +Cc: [email protected] Re: Thomas Munro > Don't trust unvalidated xl_tot_len. > src/test/recovery/t/039_end_of_wal.pl | 460 ++++++++++++++++++++++++++++++++ I haven't investigated the details yet, and it's not affecting the builds on apt.postgresql.org, but the Debian amd64 and i386 regression tests just failed this test on PG13 (11 and 15 are ok): t/039_end_of_wal.pl .................. Dubious, test returned 2 (wstat 512, 0x200) No subtests run Test Summary Report ------------------- t/039_end_of_wal.pl (Wstat: 512 Tests: 0 Failed: 0) Non-zero exit status: 2 Parse errors: No plan found in TAP output Files=26, Tests=254, 105 wallclock secs ( 0.10 usr 0.02 sys + 19.58 cusr 11.02 csys = 30.72 CPU) Result: FAIL make[2]: *** [Makefile:23: check] Error 1 https://salsa.debian.org/postgresql/postgresql/-/jobs/4910354 https://salsa.debian.org/postgresql/postgresql/-/jobs/4910355 Christoph ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: pgsql: Don't trust unvalidated xl_tot_len. @ 2023-11-10 21:42 Christoph Berg <[email protected]> parent: Christoph Berg <[email protected]> 0 siblings, 1 reply; 4+ messages in thread From: Christoph Berg @ 2023-11-10 21:42 UTC (permalink / raw) To: Thomas Munro <[email protected]>; +Cc: [email protected] Re: To Thomas Munro > > src/test/recovery/t/039_end_of_wal.pl | 460 ++++++++++++++++++++++++++++++++ > > I haven't investigated the details yet, and it's not affecting the > builds on apt.postgresql.org, but the Debian amd64 and i386 regression > tests just failed this test on PG13 (11 and 15 are ok): 12 and 14 are also failing, now on Debian unstable. (Again, only in the salsa.debian.org tests, not on apt.postgresql.org's buildds.) 12 amd64: https://salsa.debian.org/postgresql/postgresql/-/jobs/4898857 12 i386: https://salsa.debian.org/postgresql/postgresql/-/jobs/4898858 The tests there are running in Docker containers. Christoph ^ permalink raw reply [nested|flat] 4+ messages in thread
* Re: pgsql: Don't trust unvalidated xl_tot_len. @ 2023-11-10 22:05 Thomas Munro <[email protected]> parent: Christoph Berg <[email protected]> 0 siblings, 0 replies; 4+ messages in thread From: Thomas Munro @ 2023-11-10 22:05 UTC (permalink / raw) To: Christoph Berg <[email protected]>; +Cc: Thomas Munro <[email protected]>; [email protected] On Sat, Nov 11, 2023 at 10:42 AM Christoph Berg <[email protected]> wrote: > > I haven't investigated the details yet, and it's not affecting the > > builds on apt.postgresql.org, but the Debian amd64 and i386 regression > > tests just failed this test on PG13 (11 and 15 are ok): > > 12 and 14 are also failing, now on Debian unstable. (Again, only in > the salsa.debian.org tests, not on apt.postgresql.org's buildds.) > > 12 amd64: https://salsa.debian.org/postgresql/postgresql/-/jobs/4898857 > 12 i386: https://salsa.debian.org/postgresql/postgresql/-/jobs/4898858 > > The tests there are running in Docker containers. Hmm. regress_log_039_end_of_wal says: No such file or directory at /builds/postgresql/postgresql/debian/output/source_dir/build/../src/test/perl/TestLib.pm line 655. In the 13 branch we see that's in the new scan_server_header() subroutine where it tries to open the header, after asking pg_config --includedir-server where it lives. Hmm... ^ permalink raw reply [nested|flat] 4+ messages in thread
end of thread, other threads:[~2023-11-10 22:05 UTC | newest] Thread overview: 4+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-11-20 02:48 [PATCH 1/4] bootstrap: convert Typ to a List* Justin Pryzby <[email protected]> 2023-11-10 18:10 Re: pgsql: Don't trust unvalidated xl_tot_len. Christoph Berg <[email protected]> 2023-11-10 21:42 ` Re: pgsql: Don't trust unvalidated xl_tot_len. Christoph Berg <[email protected]> 2023-11-10 22:05 ` Re: pgsql: Don't trust unvalidated xl_tot_len. Thomas Munro <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox