NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
bin/46419: Inconsistent information in man.db for man page aliases after updation
>Number: 46419
>Category: bin
>Synopsis: Inconsistent information in man.db for man page aliases after
>updation
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: bin-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun May 06 19:00:00 +0000 2012
>Originator: Abhinav Upadhyay
>Release: NetBSD 6.0_BETA
>Organization:
>Environment:
NetBSD 6.0_BETA NetBSD 6.0_BETA (GENERIC) i386
>Description:
makemandb(8) maintains an index of all the different aliases of the man pages.
This information is maintained in the mandb_links table in the database. But
there is a small bug in there. When old man pages are removed, the
corresponding entry for the aliases of those man pages are not removed from the
mandb_links table.
Similarly, in case a man page is updated to add new aliases or if one or more
of its aliases are removed, the mandb_links table won't get updated to reflect
this change properly, leading to inconsistent information.
Note that, the mandb_links table is not being used right now for any purpose
but it might be of use in future. Attached patch should fix this problem.
>How-To-Repeat:
Edit a man page, for example /usr/share/man/man1/ls.1 to add a new alias:
.Nm ls, ls2
Run makemandb to update the index
Run: sqlite3 /var/db/man.db "SELECT * FROM mandb_links WHERE target='ls';"
See the entry for the new alias in the output.
Now, edit again the man page and remove that alias.
Re-run makemandb to update index.
Re-run the SQL query and see the alias entry still present.
>Fix:
Index: DBSCHEMA
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/DBSCHEMA,v
retrieving revision 1.1
diff -u -p -r1.1 DBSCHEMA
--- DBSCHEMA 7 Feb 2012 19:13:32 -0000 1.1
+++ DBSCHEMA 6 May 2012 18:13:10 -0000
@@ -50,3 +50,4 @@ There are three tables in the database a
3. section The section number
4. machine The machine architecture (if any) for which
the page is relevant
+ 5. md5_hash MD5 Hash of the target man page.
Index: apropos-utils.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.c,v
retrieving revision 1.4
diff -u -p -r1.4 apropos-utils.c
--- apropos-utils.c 15 Apr 2012 15:56:52 -0000 1.4
+++ apropos-utils.c 6 May 2012 18:13:10 -0000
@@ -172,7 +172,7 @@ create_db(sqlite3 *db)
"file UNIQUE, md5_hash UNIQUE, id INTEGER PRIMARY
KEY); "
//mandb_meta
"CREATE TABLE IF NOT EXISTS mandb_links(link, target,
section, "
- "machine); "; //mandb_links
+ "machine, md5_hash); "; //mandb_links
sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg);
if (errmsg != NULL)
@@ -181,7 +181,9 @@ create_db(sqlite3 *db)
sqlstr = "CREATE INDEX IF NOT EXISTS index_mandb_links ON mandb_links "
"(link); "
"CREATE INDEX IF NOT EXISTS index_mandb_meta_dev ON
mandb_meta "
- "(device, inode)";
+ "(device, inode); "
+ "CREATE INDEX IF NOT EXISTS index_mandb_links_md5 ON
mandb_links "
+ "(md5_hash);";
sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg);
if (errmsg != NULL)
goto out;
Index: makemandb.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/makemandb/makemandb.c,v
retrieving revision 1.8
diff -u -p -r1.8 makemandb.c
--- makemandb.c 4 May 2012 23:50:26 -0000 1.8
+++ makemandb.c 6 May 2012 18:13:11 -0000
@@ -780,6 +780,8 @@ update_db(sqlite3 *db, struct mparse *mp
sqlstr = "DELETE FROM mandb_meta WHERE file NOT IN"
" (SELECT file FROM metadb.file_cache);"
+ "DELETE FROM mandb_links WHERE md5_hash NOT IN"
+ " (SELECT md5_hash from mandb_meta);"
"DROP TABLE metadb.file_cache;"
"DELETE FROM mandb WHERE rowid NOT IN"
" (SELECT id FROM mandb_meta);";
@@ -1726,9 +1728,9 @@ insert_into_db(sqlite3 *db, mandb_rec *r
ln[strlen(ln) - 1] = 0;
str = sqlite3_mprintf("INSERT INTO mandb_links"
- " VALUES (%Q, %Q, %Q, %Q)",
+ " VALUES (%Q, %Q, %Q, %Q, %Q)",
ln, rec->name, rec->section,
- rec->machine);
+ rec->machine, rec->md5_hash);
sqlite3_exec(db, str, NULL, NULL, &errmsg);
sqlite3_free(str);
if (errmsg != NULL) {
Home |
Main Index |
Thread Index |
Old Index