PostgreSQL 7.3.6 に関する技術情報

このリリースは PostgreSQL 7.3.6 (2004/03/02リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

PostgreSQL 7.3.5 から 7.3.6 への変更点

SQL権限管理が正しく働かないなど、重要な問題が修正されています。

注意: ここにあげた変更点は、すべてを網羅していない可能性があります。詳しくはソースに付属の HISTORY というファイルを見てください。

バグ修正

  1. ruleによる書き換えが発生する場合に、一部で権限のない操作(insertなど)が行えてしまうセキュリティ上の問題が修正されました。例えば、更新可能なルールを設定しているviewが、update権限なしにupdate文を実行する事が可能になってしまいます。例えば
    tanida=# CREATE TABLE mypg_shadow (
    tanida(#     usename name NOT NULL,
    tanida(#     usesysid integer NOT NULL,
    tanida(#     usecreatedb boolean NOT NULL,
    tanida(#     usesuper boolean NOT NULL,
    tanida(#     usecatupd boolean NOT NULL,
    tanida(#     passwd text,
    tanida(#     valuntil abstime,
    tanida(#     useconfig text[]
    tanida(# ) WITHOUT OIDS;
    CREATE TABLE
    tanida=#
    tanida=# INSERT INTO mypg_shadow SELECT * FROM  pg_shadow WHERE usename = 'bar';
    INSERT 0 0
    tanida=# CREATE VIEW myview AS SELECT usename, usesuper FROM mypg_shadow;
    CREATE VIEW
    tanida=# CREATE RULE myrule AS ON UPDATE TO myview DO INSTEAD
    tanida-# UPDATE  mypg_shadow SET usename = NEW.usename, usesuper = NEW.usesuper WHERE usename = OLD.usename;
    CREATE RULE
    tanida=# GRANT SELECT ON myview TO PUBLIC;
    GRANT

    のようなケースで、update権限の無いはずのnopermユーザーを新しく追加したとしても

    noperm=>  UPDATE myview SET usename = 'bar', usesuper = 't' WHERE usename = 'bar';
    UPDATE 0

    のように実行出来てしまいます。これは7.3.3以降のすべてのバージョンに影響します。

  2. GetNewTransactionId()関数内の実行順が不適切なために、ディスクを使い切って終了してしまった後、再び再起動してもリカバリ不能になって立ち上がらなくなることがある問題が修正されました。
  3. CFLAGSに、-fno-strict-aliasingを自動的に指定するようになりました。これはGCC3.3を含む一部のプラットフォームで、-fstrict-aliasingを指定すると問題になるためです。
  4. pg_restoreが4GB以上のアーカイブを処理出来ない問題が修正されました。
  5. PL/pgSQLの関数で、行を引数に取るにもかかわらず、その引数に実際には1行も渡されなかった場合にクラッシュする問題が修正されました。
  6. LIKEを使った前方検索が大小比較に変換するときに、エンコーディングによっては不正な文字列シーケンスを生成してしまうために検索結果が狂う問題が修正されました。
  7. text_position()をマルチバイト文字列に対して利用したときに、文字列終端の余分な領域を読んでしまう問題が修正されました。
  8. bytea型に対するlike ‘\001%’という前方一致が、index使用時に誤って展開されるために間違った結果を返す問題が修正されました。indexを利用しない場合には問題ありません。
  9. contrib
    • dblinkは、ローカルとリモートの型OIDが一致して無くても利用出来るようになりました。
    • tablefuncのconnectby()のstart_with引数に引用符で囲む必要のある値を投入した場合にエラーになる問題が修正されました。