Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Avoid platform-dependent infinite loop in pg_dump.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 10 Nov 2011 21:08:23 +0000 (16:08 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 10 Nov 2011 21:09:16 +0000 (16:09 -0500)
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

src/bin/pg_dump/pg_dump.c

index fce9d3b9560df7636471505f01f10ed1e56213f0..b8809fe1e6f9779488739596df00d210f44a0386 100644 (file)
@@ -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.
     */