diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-11-10 16:08:23 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-11-10 16:09:16 -0500 |
commit | febda37fda469317f15b0acadfbdedab3d7dc793 (patch) | |
tree | ca3870684f316bd3674a857667c042faca5cc782 /src | |
parent | 37e66e75d8697de0fef74dad9cd9ae75845549b2 (diff) | |
download | postgresql-febda37fda469317f15b0acadfbdedab3d7dc793.tar.gz |
Avoid platform-dependent infinite loop in pg_dump.
If malloc(0) returns NULL, the binary search in findSecLabels() will
probably go into an infinite loop when there are no security labels,
because NULL-1 is greater than NULL after wraparound.
(We've seen this pathology before ... I wonder whether there's a way to
detect the class of bugs automatically?)
Diagnosis and patch by Steve Singer, cosmetic adjustments by me
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index fce9d3b956..b8809fe1e6 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -643,9 +643,10 @@ main(int argc, char **argv) do_sql_command(g_conn, "SET quote_all_identifiers = true"); /* - * Disables security label support if server version < v9.1.x + * Disable security label support if server version < v9.1.x (prevents + * access to nonexistent pg_seclabel catalog) */ - if (!no_security_labels && g_fout->remoteVersion < 90100) + if (g_fout->remoteVersion < 90100) no_security_labels = 1; /* @@ -11761,6 +11762,12 @@ findSecLabels(Archive *fout, Oid classoid, Oid objoid, SecLabelItem **items) if (nlabels < 0) nlabels = collectSecLabels(fout, &labels); + if (nlabels <= 0) /* no labels, so no match is possible */ + { + *items = NULL; + return 0; + } + /* * Do binary search to find some item matching the object. */ |