NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/51038: makemandb(8) does not check for access permissions to the sqlite database



The following reply was made to PR bin/51038; it has been noted by GNATS.

From: Abhinav Upadhyay <er.abhinav.upadhyay%gmail.com@localhost>
To: NetBSD GNATS <gnats-bugs%netbsd.org@localhost>
Cc: gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Subject: Re: bin/51038: makemandb(8) does not check for access permissions to
 the sqlite database
Date: Tue, 12 Apr 2016 19:47:00 +0530

 On Sun, Apr 3, 2016 at 3:00 AM,  <er.abhinav.upadhyay%gmail.com@localhost> wrote:
 >>Number:         51038
 >>Category:       bin
 >>Synopsis:       makemandb(8) does not check for access permissions to the=
  sqlite database
 >>Confidential:   no
 >>Severity:       non-critical
 >>Priority:       low
 >>Responsible:    bin-bug-people
 >>State:          open
 >>Class:          sw-bug
 >>Submitter-Id:   net
 >>Arrival-Date:   Sat Apr 02 21:30:00 +0000 2016
 >>Originator:     Abhinav Upadhyay
 >>Release:        CURRENT
 >>Organization:
 >>Environment:
 >>Description:
 > makemandb(8) when run as a normal user, doesn't have write permissions to=
  the sqlite database. Sqlite API doesn't check for the write permissions wh=
 en opening the connection, as a result makemandb(8) goes ahead with parsing=
  the man pages and each time it tries to store the parsed data in the datab=
 ase, it gets write permission error.
 >
 > It would be better, if makemandb(8) just reported an error and exited in =
 such a case.
 >
 > The attached patch should fix this.
 >
 > Also, the SQLite documentation says that if the call to sqlite3_open_v2()=
  doesn't return SQLITE_OK, we should still call sqlite3_close. The patch ad=
 dress that issue as well.
 >
 >
 >>How-To-Repeat:
 > Try to run makemandb(8) as a normal user who doesn't have write permissio=
 n to /var/db/man.db.
 >>Fix:
 > Index: apropos-utils.c
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.c,v
 > retrieving revision 1.22
 > diff -u -r1.22 apropos-utils.c
 > --- apropos-utils.c     31 Mar 2016 20:16:58 -0000      1.22
 > +++ apropos-utils.c     2 Apr 2016 21:27:06 -0000
 > @@ -300,18 +300,19 @@
 >   *     In normal cases the function should return a handle to the db.
 >   */
 >  sqlite3 *
 > -init_db(int db_flag, const char *manconf)
 > +init_db(mandb_access_mode db_flag, const char *manconf)
 >  {
 >         sqlite3 *db =3D NULL;
 >         sqlite3_stmt *stmt;
 >         struct stat sb;
 >         int rc;
 >         int create_db_flag =3D 0;
 > +       int access_mode;
 >
 >         char *dbpath =3D get_dbpath(manconf);
 >         if (dbpath =3D=3D NULL)
 >                 errx(EXIT_FAILURE, "_mandb entry not found in man.conf");
 > -       /* Check if the database exists or not */
 > +
 >         if (!(stat(dbpath, &sb) =3D=3D 0 && S_ISREG(sb.st_mode))) {
 >                 /* Database does not exist, check if DB_CREATE was specif=
 ied, and set
 >                  * flag to create the database schema
 > @@ -322,16 +323,23 @@
 >                         return NULL;
 >                 }
 >                 create_db_flag =3D 1;
 > +       } else {
 > +               /*
 > +                * Database exists. Check if we have the permissions to r=
 ead/write the files
 > +                */
 > +               access_mode =3D db_flag =3D=3D MANDB_CREATE || db_flag =
 =3D=3D MANDB_WRITE? R_OK | W_OK: R_OK;
 > +               if ((access(dbpath, access_mode)) !=3D 0) {
 > +                       warnx("Unable to access the database, please chec=
 k permissions for %s", dbpath);
 > +                       return NULL;
 > +               }
 >         }
 >
 > -       /* Now initialize the database connection */
 >         sqlite3_initialize();
 >         rc =3D sqlite3_open_v2(dbpath, &db, db_flag, NULL);
 >
 >         if (rc !=3D SQLITE_OK) {
 >                 warnx("%s", sqlite3_errmsg(db));
 > -               sqlite3_shutdown();
 > -               return NULL;
 > +               goto error;
 >         }
 >
 >         if (create_db_flag && create_db(db) < 0) {
 > @@ -379,8 +387,7 @@
 >         return db;
 >
 >  error:
 > -       sqlite3_close(db);
 > -       sqlite3_shutdown();
 > +       close_db(db);
 >         return NULL;
 >  }
 >
 > Index: apropos-utils.h
 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 > RCS file: /cvsroot/src/usr.sbin/makemandb/apropos-utils.h,v
 > retrieving revision 1.9
 > diff -u -r1.9 apropos-utils.h
 > --- apropos-utils.h     2 Apr 2013 17:16:50 -0000       1.9
 > +++ apropos-utils.h     2 Apr 2016 21:27:06 -0000
 > @@ -39,9 +39,12 @@
 >  #define SECMAX 9
 >
 >  /* Flags for opening the database */
 > -#define MANDB_READONLY SQLITE_OPEN_READONLY
 > -#define MANDB_WRITE SQLITE_OPEN_READWRITE
 > -#define MANDB_CREATE SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
 > +typedef enum mandb_access_mode {
 > +       MANDB_READONLY =3D SQLITE_OPEN_READONLY,
 > +       MANDB_WRITE =3D SQLITE_OPEN_READWRITE,
 > +       MANDB_CREATE =3D SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
 > +} mandb_access_mode;
 > +
 >
 >  #define APROPOS_SCHEMA_VERSION 20120507
 >
 > @@ -92,7 +95,7 @@
 >  char *lower(char *);
 >  void concat(char **, const char *);
 >  void concat2(char **, const char *, size_t);
 > -sqlite3 *init_db(int, const char *);
 > +sqlite3 *init_db(mandb_access_mode, const char *);
 >  void close_db(sqlite3 *);
 >  char *get_dbpath(const char *);
 >  int run_query(sqlite3 *, query_format, query_args *);
 >
 
 Hi,
 
 Any comments on this one (and also bin/51040)? I have another patch
 that I want to send in but it will include these changes as well
 unless this gets committed.
 
 --
 Abhinav
 


Home | Main Index | Thread Index | Old Index