summaryrefslogtreecommitdiff
path: root/trans/proxy-defpager.c
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-09-27 17:23:13 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-09-27 23:39:35 +0200
commitfcf89e5bb006f71ecf5c46b7248216c3dee7e4b8 (patch)
treea69cbaa58141276aaf062a0ce76c7623cb77f9c0 /trans/proxy-defpager.c
parent65e63be1f4884a0223fe51ac6ff53ed11605506a (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.c13
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");