Changeset e06da7e in mainline


Ignore:
Timestamp:
2009-03-07T15:59:32Z (15 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
411b6a6
Parents:
b11ee88
Message:

If the server cannot receive a call because it supplied a bad userspace address, the kernel will immediately answer the call with EPARTY.

Location:
kernel/generic
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/errno.h

    rb11ee88 re06da7e  
    4949                                 * Used by answerbox to close the connection.
    5050                                 */
    51 #define EEXISTS         -8      /* Entry already exists */
    52 #define EBADMEM         -9      /* Bad memory pointer */
    53 #define ENOTSUP         -10     /* Not supported */
    54 #define EADDRNOTAVAIL   -11     /* Address not available. */
    55 #define ETIMEOUT        -12     /* Timeout expired */
    56 #define EINVAL          -13     /* Invalid value */
    57 #define EBUSY           -14     /* Resource is busy */
    58 #define EOVERFLOW       -15     /* The result does not fit its size. */
    59 #define EINTR           -16     /* Operation was interrupted. */
     51#define EPARTY          -8      /* The other party encountered an error when
     52                                 * receiving the call.
     53                                 */
     54#define EEXISTS         -9      /* Entry already exists */
     55#define EBADMEM         -10     /* Bad memory pointer */
     56#define ENOTSUP         -11     /* Not supported */
     57#define EADDRNOTAVAIL   -12     /* Address not available. */
     58#define ETIMEOUT        -13     /* Timeout expired */
     59#define EINVAL          -14     /* Invalid value */
     60#define EBUSY           -15     /* Resource is busy */
     61#define EOVERFLOW       -16     /* The result does not fit its size. */
     62#define EINTR           -17     /* Operation was interrupted. */
    6063
    6164#endif
  • kernel/generic/src/ipc/sysipc.c

    rb11ee88 re06da7e  
    937937         * copy whole call->data, not only call->data.args */
    938938        if (STRUCT_TO_USPACE(calldata, &call->data)) {
    939                 /* XXX
    940                  * To avoid deadlocks in synchronous calls
    941                  * this should be replaced by discarding
    942                  * the call and notifying the caller.
     939                /*
     940                 * The callee will not receive this call and no one else has
     941                 * a chance to answer it. Reply with the EPARTY error code.
    943942                 */
     943                ipc_data_t saved_data;
     944                int saveddata = 0;
     945
     946                if (answer_need_old(call)) {
     947                        memcpy(&saved_data, &call->data, sizeof(call->data));
     948                        saveddata = 1;
     949                }
     950               
     951                IPC_SET_RETVAL(call->data, EPARTY);
     952                (void) answer_preprocess(call, saveddata ? &saved_data : NULL);
     953                ipc_answer(&TASK->answerbox, call);
    944954                return 0;
    945955        }
Note: See TracChangeset for help on using the changeset viewer.