Ignore:
Timestamp:
2018-07-05T09:34:09Z (6 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
63d46341
Parents:
76f566d
Message:

do not expose the call capability handler from the async framework

Keep the call capability handler encapsulated within the async framework
and do not expose it explicitly via its API. Use the pointer to
ipc_call_t as the sole object identifying an IPC call in the code that
uses the async framework.

This plugs a major leak in the abstraction and also simplifies both the
async framework (slightly) and all IPC servers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/chardev_srv.c

    r76f566d r984a9ba  
    4343static chardev_srv_t *chardev_srv_create(chardev_srvs_t *);
    4444
    45 static void chardev_read_srv(chardev_srv_t *srv, cap_call_handle_t chandle,
    46     ipc_call_t *call)
     45static void chardev_read_srv(chardev_srv_t *srv, ipc_call_t *icall)
    4746{
    4847        void *buf;
     
    5049        size_t nread;
    5150        errno_t rc;
    52         cap_call_handle_t rcall_handle;
    5351
    54         if (!async_data_read_receive(&rcall_handle, &size)) {
    55                 async_answer_0(chandle, EINVAL);
     52        ipc_call_t call;
     53        if (!async_data_read_receive(&call, &size)) {
     54                async_answer_0(icall, EINVAL);
    5655                return;
    5756        }
     
    5958        buf = malloc(size);
    6059        if (buf == NULL) {
    61                 async_answer_0(rcall_handle, ENOMEM);
    62                 async_answer_0(chandle, ENOMEM);
     60                async_answer_0(&call, ENOMEM);
     61                async_answer_0(icall, ENOMEM);
    6362                return;
    6463        }
    6564
    6665        if (srv->srvs->ops->read == NULL) {
    67                 async_answer_0(rcall_handle, ENOTSUP);
    68                 async_answer_0(chandle, ENOTSUP);
     66                async_answer_0(&call, ENOTSUP);
     67                async_answer_0(icall, ENOTSUP);
    6968                free(buf);
    7069                return;
     
    7372        rc = srv->srvs->ops->read(srv, buf, size, &nread);
    7473        if (rc != EOK && nread == 0) {
    75                 async_answer_0(rcall_handle, rc);
    76                 async_answer_0(chandle, rc);
     74                async_answer_0(&call, rc);
     75                async_answer_0(icall, rc);
    7776                free(buf);
    7877                return;
    7978        }
    8079
    81         async_data_read_finalize(rcall_handle, buf, nread);
     80        async_data_read_finalize(&call, buf, nread);
    8281
    8382        free(buf);
    84         async_answer_2(chandle, EOK, (sysarg_t) rc, nread);
     83        async_answer_2(icall, EOK, (sysarg_t) rc, nread);
    8584}
    8685
    87 static void chardev_write_srv(chardev_srv_t *srv, cap_call_handle_t chandle,
    88     ipc_call_t *call)
     86static void chardev_write_srv(chardev_srv_t *srv, ipc_call_t *icall)
    8987{
    9088        void *data;
     
    9593        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
    9694        if (rc != EOK) {
    97                 async_answer_0(chandle, rc);
     95                async_answer_0(icall, rc);
    9896                return;
    9997        }
    10098
    10199        if (srv->srvs->ops->write == NULL) {
    102                 async_answer_0(chandle, ENOTSUP);
     100                async_answer_0(icall, ENOTSUP);
    103101                return;
    104102        }
     
    107105        free(data);
    108106        if (rc != EOK && nwr == 0) {
    109                 async_answer_0(chandle, rc);
     107                async_answer_0(icall, rc);
    110108                return;
    111109        }
    112110
    113         async_answer_2(chandle, EOK, (sysarg_t) rc, nwr);
     111        async_answer_2(icall, EOK, (sysarg_t) rc, nwr);
    114112}
    115113
     
    132130}
    133131
    134 errno_t chardev_conn(cap_call_handle_t icall_handle, ipc_call_t *icall, chardev_srvs_t *srvs)
     132errno_t chardev_conn(ipc_call_t *icall, chardev_srvs_t *srvs)
    135133{
    136134        chardev_srv_t *srv;
     
    138136
    139137        /* Accept the connection */
    140         async_answer_0(icall_handle, EOK);
     138        async_answer_0(icall, EOK);
    141139
    142140        srv = chardev_srv_create(srvs);
     
    152150        while (true) {
    153151                ipc_call_t call;
    154                 cap_call_handle_t chandle = async_get_call(&call);
     152                async_get_call(&call);
    155153                sysarg_t method = IPC_GET_IMETHOD(call);
    156154
    157155                if (!method) {
    158156                        /* The other side has hung up */
    159                         async_answer_0(chandle, EOK);
     157                        async_answer_0(&call, EOK);
    160158                        break;
    161159                }
     
    163161                switch (method) {
    164162                case CHARDEV_READ:
    165                         chardev_read_srv(srv, chandle, &call);
     163                        chardev_read_srv(srv, &call);
    166164                        break;
    167165                case CHARDEV_WRITE:
    168                         chardev_write_srv(srv, chandle, &call);
     166                        chardev_write_srv(srv, &call);
    169167                        break;
    170168                default:
    171169                        if (srv->srvs->ops->def_handler != NULL)
    172                                 srv->srvs->ops->def_handler(srv, chandle, &call);
     170                                srv->srvs->ops->def_handler(srv, &call);
    173171                        else
    174                                 async_answer_0(chandle, ENOTSUP);
     172                                async_answer_0(&call, ENOTSUP);
    175173                }
    176174        }
Note: See TracChangeset for help on using the changeset viewer.