66eb8df6a4
snprintf() in contrib/. I didn't touch the places where pointer arithmatic was being used, or other areas where the fix wasn't trivial. I would think that few, if any, of the usages of sprintf() were actually exploitable, but it's probably better to be paranoid... Neil Conway
This utility allows administrators to view the file structure used by PostgreSQL. Databases are placed in directories based on their OIDs in pg_database, and the tables in that directory are named by their OIDs, stored in pg_class.relfilenode. Oid2name connects to the database and extracts the OID and table name information. --------------------------------------------------------------------------- It can be used in four ways: oid2name This will connect to the template1 database and display all databases in the system: $ oid2name All databases: --------------------------------- 18720 = test1 1 = template1 18719 = template0 18721 = test 18735 = postgres 18736 = cssi oid2name -d test [-x] This connects to the database test and shows all tables and their OIDs: $ oid2name -d test All tables from database "test": --------------------------------- 18766 = dns 18737 = ips 18722 = testdate oid2name -d test -o 18737 oid2name -d test -t testdate This will connect to the database test and display the table name for oid 18737 and the oid for table name testdate respectively: $ oid2name -d test -o 18737 Tablename of oid 18737 from database "test": --------------------------------- 18737 = ips $ oid2name -d test -t testdate Oid of table testdate from database "test": --------------------------------- 18722 = testdate Keep in mind tables over one gigabyte will be split into separate files with numeric file extensions. --------------------------------------------------------------------------- Sample session: $ cd /u/pg/data/base $ oid2name All databases: --------------------------------- 16817 = test2 16578 = x 16756 = test 1 = template1 16569 = template0 16818 = test3 16811 = floattest $ cd 16756 $ ls 1873* 18730 18731 18732 18735 18736 18737 18738 18739 $ oid2name -d test -o 18737 Tablename of oid 18737 from database "test": --------------------------------- 18737 = ips $ oid2name -d test -t ips Oid of table ips from database "test": --------------------------------- 18737 = ips $ # show disk space for every db object $ du * | while read SIZE OID > do > echo "$SIZE `oid2name -q -d test -o $OID`" > done 24 18737 = ips 36 18722 = cities ... $ # same as above, but sort by largest first $ du * | while read SIZE OID > do > echo "$SIZE `oid2name -q -d test -o $OID`" > done | > sort -rn 2048 19324 = bigtable 1950 23903 = customers ... $ # show disk usage per database $ cd /u/pg/data/base $ du -s * | > while read SIZE OID > do > echo "$SIZE `aspg oid2name -q | grep ^$OID' '`" > done | > sort -rn 2256 18721 = test 2135 18735 = postgres .. This can be done in psql with: test=> SELECT relpages, relfilenode, relname FROM pg_class ORDER BY relpages DESC; Each page is typically 8k. Relpages is updated by VACUUM. --------------------------------------------------------------------------- Mail me with any problems or additions you would like to see. Clearing house for the code will be at: http://www.crimelabs.net b. palmer, bpalmer@crimelabs.net