Changeset 984a9ba in mainline for uspace/lib/c/generic/inet.c


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/inet.c

    r76f566d r984a9ba  
    3636#include <stdlib.h>
    3737
    38 static void inet_cb_conn(cap_call_handle_t icall_handle, ipc_call_t *icall, void *arg);
     38static void inet_cb_conn(ipc_call_t *icall, void *arg);
    3939
    4040static async_sess_t *inet_sess = NULL;
     
    176176}
    177177
    178 static void inet_ev_recv(cap_call_handle_t icall_handle, ipc_call_t *icall)
     178static void inet_ev_recv(ipc_call_t *icall)
    179179{
    180180        inet_dgram_t dgram;
     
    183183        dgram.iplink = IPC_GET_ARG2(*icall);
    184184
    185         cap_call_handle_t chandle;
     185        ipc_call_t call;
    186186        size_t size;
    187         if (!async_data_write_receive(&chandle, &size)) {
    188                 async_answer_0(chandle, EINVAL);
    189                 async_answer_0(icall_handle, EINVAL);
     187        if (!async_data_write_receive(&call, &size)) {
     188                async_answer_0(&call, EINVAL);
     189                async_answer_0(icall, EINVAL);
    190190                return;
    191191        }
    192192
    193193        if (size != sizeof(inet_addr_t)) {
    194                 async_answer_0(chandle, EINVAL);
    195                 async_answer_0(icall_handle, EINVAL);
    196                 return;
    197         }
    198 
    199         errno_t rc = async_data_write_finalize(chandle, &dgram.src, size);
    200         if (rc != EOK) {
    201                 async_answer_0(chandle, rc);
    202                 async_answer_0(icall_handle, rc);
    203                 return;
    204         }
    205 
    206         if (!async_data_write_receive(&chandle, &size)) {
    207                 async_answer_0(chandle, EINVAL);
    208                 async_answer_0(icall_handle, EINVAL);
     194                async_answer_0(&call, EINVAL);
     195                async_answer_0(icall, EINVAL);
     196                return;
     197        }
     198
     199        errno_t rc = async_data_write_finalize(&call, &dgram.src, size);
     200        if (rc != EOK) {
     201                async_answer_0(&call, rc);
     202                async_answer_0(icall, rc);
     203                return;
     204        }
     205
     206        if (!async_data_write_receive(&call, &size)) {
     207                async_answer_0(&call, EINVAL);
     208                async_answer_0(icall, EINVAL);
    209209                return;
    210210        }
    211211
    212212        if (size != sizeof(inet_addr_t)) {
    213                 async_answer_0(chandle, EINVAL);
    214                 async_answer_0(icall_handle, EINVAL);
    215                 return;
    216         }
    217 
    218         rc = async_data_write_finalize(chandle, &dgram.dest, size);
    219         if (rc != EOK) {
    220                 async_answer_0(chandle, rc);
    221                 async_answer_0(icall_handle, rc);
     213                async_answer_0(&call, EINVAL);
     214                async_answer_0(icall, EINVAL);
     215                return;
     216        }
     217
     218        rc = async_data_write_finalize(&call, &dgram.dest, size);
     219        if (rc != EOK) {
     220                async_answer_0(&call, rc);
     221                async_answer_0(icall, rc);
    222222                return;
    223223        }
     
    225225        rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size);
    226226        if (rc != EOK) {
    227                 async_answer_0(icall_handle, rc);
     227                async_answer_0(icall, rc);
    228228                return;
    229229        }
     
    231231        rc = inet_ev_ops->recv(&dgram);
    232232        free(dgram.data);
    233         async_answer_0(icall_handle, rc);
    234 }
    235 
    236 static void inet_cb_conn(cap_call_handle_t icall_handle, ipc_call_t *icall, void *arg)
     233        async_answer_0(icall, rc);
     234}
     235
     236static void inet_cb_conn(ipc_call_t *icall, void *arg)
    237237{
    238238        while (true) {
    239239                ipc_call_t call;
    240                 cap_call_handle_t chandle = async_get_call(&call);
     240                async_get_call(&call);
    241241
    242242                if (!IPC_GET_IMETHOD(call)) {
     
    247247                switch (IPC_GET_IMETHOD(call)) {
    248248                case INET_EV_RECV:
    249                         inet_ev_recv(chandle, &call);
     249                        inet_ev_recv(&call);
    250250                        break;
    251251                default:
    252                         async_answer_0(chandle, ENOTSUP);
     252                        async_answer_0(&call, ENOTSUP);
    253253                }
    254254        }
Note: See TracChangeset for help on using the changeset viewer.