Ignore:
Timestamp:
2012-09-03T21:39:37Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9c9bbaf
Parents:
9ef1b79b
Message:

Make sure that both dispatched and non-dispatched calls are properly
answered in ipc_cleanup_call_list().

  • Define simple request_preprocess() hook for IPC_M_CONNECT_TO_ME to detect when the request_process() was not called and no resources allocated so that answer_cleanup() does not attempt to free non-existent resources.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/ops/concttome.c

    r9ef1b79b r5d3ed34  
    4040#include <arch.h>
    4141
     42static int request_preprocess(call_t *call, phone_t *phone)
     43{
     44        /* Start with the assumption that there is no allocated phoneid. */
     45        IPC_SET_ARG5(call->data, -1);
     46        return EOK;
     47}
     48
    4249static int request_process(call_t *call, answerbox_t *box)
    4350{
    4451        int phoneid = phone_alloc(TASK);
    4552
    46         if (phoneid < 0) {
    47                 IPC_SET_RETVAL(call->data, ELIMIT);
    48                 /*
    49                  * This is a shortcut which bypasses the standard call
    50                  * processing hooks. We are still playing it save here as
    51                  * there is no state to be cleaned up at this stage.
    52                  */
    53                 ipc_answer(box, call);
    54                 return -1;
    55         }
    56                
    5753        IPC_SET_ARG5(call->data, phoneid);
    5854       
     
    6460        int phoneid = (int) IPC_GET_ARG5(*olddata);
    6561
    66         phone_dealloc(phoneid);
     62        if (phoneid >= 0)
     63                phone_dealloc(phoneid);
    6764}
    6865
     
    7471                /* The connection was not accepted */
    7572                answer_cleanup(answer, olddata);
    76         } else {
     73        } else if (phoneid >= 0) {
    7774                /* The connection was accepted */
    7875                phone_connect(phoneid, &answer->sender->answerbox);
    7976                /* Set 'phone hash' as arg5 of response */
    8077                IPC_SET_ARG5(answer->data, (sysarg_t) &TASK->phones[phoneid]);
     78        } else {
     79                IPC_SET_RETVAL(answer->data, ELIMIT);
    8180        }
    8281
     
    8685
    8786sysipc_ops_t ipc_m_connect_to_me_ops = {
    88         .request_preprocess = null_request_preprocess,
     87        .request_preprocess = request_preprocess,
    8988        .request_forget = null_request_forget,
    9089        .request_process = request_process,
Note: See TracChangeset for help on using the changeset viewer.