diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-09-27 17:23:13 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-09-27 23:39:35 +0200 |
commit | fcf89e5bb006f71ecf5c46b7248216c3dee7e4b8 (patch) | |
tree | a69cbaa58141276aaf062a0ce76c7623cb77f9c0 /trans/proxy-defpager.c | |
parent | 65e63be1f4884a0223fe51ac6ff53ed11605506a (diff) |
trans/proxy-defpager: convert to trivfs dynamic classes and buckets
libtrivfs contains two ways of managing more than one port class and
bucket. There is the old way of using a statically allocated array
with explicit length, and the new way with dynamically allocated
vectors.
Converting all users to the new way of handling multiple classes
and/or buckets, we can simplify the code in libtrivfs. In many cases,
the code will be simpler and more expressive for the user.
This also fixes a severe bug. As no classes are given to
`trivfs_startup', they are created and inserted into the dynamic
vector of classes. The helper function `allowed', however, used the
first item of the previously used static array, which is NULL. This
circumvented the typecheck, allowing the default pager protocol to be
spoken over control ports, likely resulting in a crash.
* trans/proxy-defpager.c: Convert to dynamic classes and buckets.
Diffstat (limited to 'trans/proxy-defpager.c')
-rw-r--r-- | trans/proxy-defpager.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/trans/proxy-defpager.c b/trans/proxy-defpager.c index 5fe8ffd1..662f2698 100644 --- a/trans/proxy-defpager.c +++ b/trans/proxy-defpager.c @@ -30,11 +30,14 @@ static mach_port_t real_defpager, dev_master; +/* Our port class. */ +struct port_class *trivfs_protid_class; + static error_t allowed (mach_port_t port, int mode) { - struct trivfs_protid *cred = ports_lookup_port - (0, port, trivfs_protid_portclasses[0]); + struct trivfs_protid *cred + = ports_lookup_port (0, port, trivfs_protid_class); if (!cred) return MIG_BAD_ID; error_t result = (cred->po->openmodes & mode) ? 0 : EACCES; @@ -266,8 +269,12 @@ main (int argc, char **argv) trivfs_fsid = getpid (); + err = trivfs_add_protid_port_class (&trivfs_protid_class); + if (err) + error (1, 0, "error creating protid port class"); + /* Reply to our parent. */ - err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0, &fsys); + err = trivfs_startup (bootstrap, 0, 0, 0, trivfs_protid_class, 0, &fsys); mach_port_deallocate (mach_task_self (), bootstrap); if (err) error (4, err, "Contacting parent"); |