~ubuntu-branches/ubuntu/saucy/postgresql-8.4/saucy

« back to all changes in this revision

Viewing changes to contrib/pgstattuple/pgstattuple.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2010-05-15 13:31:46 UTC
  • mfrom: (1.2.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20100515133146-kd8qmfietgxqvam0
Tags: 8.4.4-1
* Urgency medium due to security fixes.
* New upstream security/bug fix release:
  - Enforce restrictions in plperl using an opmask applied to the whole
    interpreter, instead of using "Safe.pm".
    Recent developments have convinced us that "Safe.pm" is too
    insecure to rely on for making plperl trustable. This change
    removes use of "Safe.pm" altogether, in favor of using a separate
    interpreter with an opcode mask that is always applied. Pleasant
    side effects of the change include that it is now possible to use
    Perl's strict pragma in a natural way in plperl, and that Perl's $a
    and $b variables work as expected in sort routines, and that
    function compilation is significantly faster. (CVE-2010-1169)
  - Prevent PL/Tcl from executing untrustworthy code from pltcl_modules.
    PL/Tcl's feature for autoloading Tcl code from a database table
    could be exploited for trojan-horse attacks, because there was no
    restriction on who could create or insert into that table. This
    change disables the feature unless pltcl_modules is owned by a
    superuser. (However, the permissions on the table are not checked,
    so installations that really need a less-than-secure modules table
    can still grant suitable privileges to trusted non-superusers.)
    Also, prevent loading code into the unrestricted "normal" Tcl
    interpreter unless we are really going to execute a pltclu
    function. (CVE-2010-1170)
  - Fix data corruption during WAL replay of ALTER ... SET TABLESPACE.
    When archive_mode is on, ALTER ... SET TABLESPACE generates a WAL
    record whose replay logic was incorrect. It could write the data to
    the wrong place, leading to possibly-unrecoverable data corruption.
    Data corruption would be observed on standby slaves, and could
    occur on the master as well if a database crash and recovery
    occurred after committing the ALTER and before the next checkpoint.
  - Fix possible crash if a cache reset message is received during
    rebuild of a relcache entry.
    This error was introduced in 8.4.3 while fixing a related failure.
  - Apply per-function GUC settings while running the language
    validator for the function. This avoids failures if the function's code
    is invalid without the setting; an example is that SQL functions may not
    parse if the search_path is not correct.
  - Do constraint exclusion for inherited "UPDATE" and "DELETE" target
    tables when constraint_exclusion = partition.
    Due to an oversight, this setting previously only caused constraint
    exclusion to be checked in "SELECT" commands.
  - Do not allow an unprivileged user to reset superuser-only parameter
    settings.
    Previously, if an unprivileged user ran ALTER USER ... RESET ALL
    for himself, or ALTER DATABASE ... RESET ALL for a database he
    owns, this would remove all special parameter settings for the user
    or database, even ones that are only supposed to be changeable by a
    superuser. Now, the "ALTER" will only remove the parameters that
    the user has permission to change.
  - Avoid possible crash during backend shutdown if shutdown occurs
    when a CONTEXT addition would be made to log entries.
    In some cases the context-printing function would fail because the
    current transaction had already been rolled back when it came time
    to print a log message.
  - Fix erroneous handling of %r parameter in recovery_end_command.
    The value always came out zero.
  - Ensure the archiver process responds to changes in archive_command
    as soon as possible.
  - Fix pl/pgsql's CASE statement to not fail when the case expression
    is a query that returns no rows.
  - Update pl/perl's "ppport.h" for modern Perl versions.
  - Fix assorted memory leaks in pl/python.
  - Handle empty-string connect parameters properly in ecpg.
  - Prevent infinite recursion in psql when expanding a variable that
    refers to itself.
  - Fix psql's \copy to not add spaces around a dot within \copy
    (select ...).
    Addition of spaces around the decimal point in a numeric literal
    would result in a syntax error.
  - Avoid formatting failure in psql when running in a locale context
    that doesn't match the client_encoding.
  - Fix unnecessary "GIN indexes do not support whole-index scans"
    errors for unsatisfiable queries using "contrib/intarray" operators.
  - Ensure that "contrib/pgstattuple" functions respond to cancel
    interrupts promptly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.38 2009/06/11 14:48:52 momjian Exp $
 
2
 * $PostgreSQL: pgsql/contrib/pgstattuple/pgstattuple.c,v 1.38.2.1 2010/04/02 16:16:57 tgl Exp $
3
3
 *
4
4
 * Copyright (c) 2001,2002      Tatsuo Ishii
5
5
 *
276
276
        /* scan the relation */
277
277
        while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
278
278
        {
 
279
                CHECK_FOR_INTERRUPTS();
 
280
 
279
281
                /* must hold a buffer lock to call HeapTupleSatisfiesVisibility */
280
282
                LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE);
281
283
 
302
304
 
303
305
                while (block <= tupblock)
304
306
                {
 
307
                        CHECK_FOR_INTERRUPTS();
 
308
 
305
309
                        buffer = ReadBuffer(rel, block);
306
310
                        LockBuffer(buffer, BUFFER_LOCK_SHARE);
307
311
                        stat.free_space += PageGetHeapFreeSpace((Page) BufferGetPage(buffer));
313
317
 
314
318
        while (block < nblocks)
315
319
        {
 
320
                CHECK_FOR_INTERRUPTS();
 
321
 
316
322
                buffer = ReadBuffer(rel, block);
317
323
                LockBuffer(buffer, BUFFER_LOCK_SHARE);
318
324
                stat.free_space += PageGetHeapFreeSpace((Page) BufferGetPage(buffer));
468
474
                }
469
475
 
470
476
                for (; blkno < nblocks; blkno++)
 
477
                {
 
478
                        CHECK_FOR_INTERRUPTS();
 
479
 
471
480
                        pagefn(&stat, rel, blkno);
 
481
                }
472
482
        }
473
483
 
474
484
        relation_close(rel, AccessShareLock);