Rev 2556 | Rev 2601 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2556 | Rev 2557 | ||
---|---|---|---|
Line 67... | Line 67... | ||
67 | * @param method Method to be decided. |
67 | * @param method Method to be decided. |
68 | * |
68 | * |
69 | * @return Return 1 if the method is a system method. |
69 | * @return Return 1 if the method is a system method. |
70 | * Otherwise return 0. |
70 | * Otherwise return 0. |
71 | */ |
71 | */ |
72 | static inline int is_system_method(unative_t method) |
72 | static inline int method_is_system(unative_t method) |
73 | { |
73 | { |
74 | if (method <= IPC_M_LAST_SYSTEM) |
74 | if (method <= IPC_M_LAST_SYSTEM) |
75 | return 1; |
75 | return 1; |
76 | return 0; |
76 | return 0; |
77 | } |
77 | } |
Line 84... | Line 84... | ||
84 | * @param method Method to be decided. |
84 | * @param method Method to be decided. |
85 | * |
85 | * |
86 | * @return Return 1 if the method is forwardable. |
86 | * @return Return 1 if the method is forwardable. |
87 | * Otherwise return 0. |
87 | * Otherwise return 0. |
88 | */ |
88 | */ |
89 | static inline int is_forwardable(unative_t method) |
89 | static inline int method_is_forwardable(unative_t method) |
90 | { |
90 | { |
91 | switch (method) { |
91 | switch (method) { |
92 | case IPC_M_PHONE_HUNGUP: |
92 | case IPC_M_PHONE_HUNGUP: |
93 | case IPC_M_AS_AREA_SEND: |
- | |
94 | case IPC_M_AS_AREA_RECV: |
- | |
95 | case IPC_M_DATA_SEND: |
- | |
96 | /* This message is meant only for the original recipient. */ |
93 | /* This message is meant only for the original recipient. */ |
97 | return 0; |
94 | return 0; |
98 | default: |
95 | default: |
99 | return 1; |
96 | return 1; |
100 | } |
97 | } |
101 | } |
98 | } |
102 | 99 | ||
- | 100 | /** Decide if the message with this method is immutable on forward. |
|
- | 101 | * |
|
- | 102 | * - some system messages may be forwarded, for some of them |
|
- | 103 | * it is useless |
|
- | 104 | * |
|
- | 105 | * @param method Method to be decided. |
|
- | 106 | * |
|
- | 107 | * @return Return 1 if the method is immutable on forward. |
|
- | 108 | * Otherwise return 0. |
|
- | 109 | */ |
|
- | 110 | static inline int method_is_immutable(unative_t method) |
|
- | 111 | { |
|
- | 112 | switch (method) { |
|
- | 113 | case IPC_M_AS_AREA_SEND: |
|
- | 114 | case IPC_M_AS_AREA_RECV: |
|
- | 115 | case IPC_M_DATA_SEND: |
|
- | 116 | return 1; |
|
- | 117 | break; |
|
- | 118 | default: |
|
- | 119 | return 0; |
|
- | 120 | } |
|
- | 121 | } |
|
- | 122 | ||
103 | 123 | ||
104 | /*********************************************************************** |
124 | /*********************************************************************** |
105 | * Functions that preprocess answer before sending it to the recepient. |
125 | * Functions that preprocess answer before sending it to the recepient. |
106 | ***********************************************************************/ |
126 | ***********************************************************************/ |
107 | 127 | ||
Line 501... | Line 521... | ||
501 | * @return Return 0 on succes, otherwise return an error code. |
521 | * @return Return 0 on succes, otherwise return an error code. |
502 | * |
522 | * |
503 | * In case the original method is a system method, ARG1 and ARG2 are overwritten |
523 | * In case the original method is a system method, ARG1 and ARG2 are overwritten |
504 | * in the forwarded message with the new method and the new arg1, respectively. |
524 | * in the forwarded message with the new method and the new arg1, respectively. |
505 | * Otherwise the METHOD and ARG1 are rewritten with the new method and arg1, |
525 | * Otherwise the METHOD and ARG1 are rewritten with the new method and arg1, |
506 | * respectively. |
526 | * respectively. Also note there is a set of immutable methods, for which the |
- | 527 | * new method and argument is not set and these values are ignored. |
|
507 | * |
528 | * |
508 | * Warning: If implementing non-fast version, make sure that |
529 | * Warning: If implementing non-fast version, make sure that |
509 | * ARG3 is not rewritten for certain system IPC |
530 | * ARG3 is not rewritten for certain system IPC |
510 | */ |
531 | */ |
511 | unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid, |
532 | unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid, |
Line 524... | Line 545... | ||
524 | IPC_SET_RETVAL(call->data, EFORWARD); |
545 | IPC_SET_RETVAL(call->data, EFORWARD); |
525 | ipc_answer(&TASK->answerbox, call); |
546 | ipc_answer(&TASK->answerbox, call); |
526 | return ENOENT; |
547 | return ENOENT; |
527 | }); |
548 | }); |
528 | 549 | ||
529 | if (!is_forwardable(IPC_GET_METHOD(call->data))) { |
550 | if (!method_is_forwardable(IPC_GET_METHOD(call->data))) { |
530 | IPC_SET_RETVAL(call->data, EFORWARD); |
551 | IPC_SET_RETVAL(call->data, EFORWARD); |
531 | ipc_answer(&TASK->answerbox, call); |
552 | ipc_answer(&TASK->answerbox, call); |
532 | return EPERM; |
553 | return EPERM; |
533 | } |
554 | } |
534 | 555 | ||
- | 556 | /* |
|
535 | /* Userspace is not allowed to change method of system methods |
557 | * Userspace is not allowed to change method of system methods on |
536 | * on forward, allow changing ARG1 and ARG2 by means of method and arg1 |
558 | * forward, allow changing ARG1 and ARG2 by means of method and arg1. |
- | 559 | * If the method is immutable, don't change anything. |
|
537 | */ |
560 | */ |
- | 561 | if (!method_is_immutable(IPC_GET_METHOD(call->data))) { |
|
538 | if (is_system_method(IPC_GET_METHOD(call->data))) { |
562 | if (method_is_system(IPC_GET_METHOD(call->data))) { |
539 | if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME) |
563 | if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME) |
540 | phone_dealloc(IPC_GET_ARG3(call->data)); |
564 | phone_dealloc(IPC_GET_ARG3(call->data)); |
541 | 565 | ||
542 | IPC_SET_ARG1(call->data, method); |
566 | IPC_SET_ARG1(call->data, method); |
543 | IPC_SET_ARG2(call->data, arg1); |
567 | IPC_SET_ARG2(call->data, arg1); |
544 | } else { |
568 | } else { |
545 | IPC_SET_METHOD(call->data, method); |
569 | IPC_SET_METHOD(call->data, method); |
546 | IPC_SET_ARG1(call->data, arg1); |
570 | IPC_SET_ARG1(call->data, arg1); |
- | 571 | } |
|
547 | } |
572 | } |
548 | 573 | ||
549 | return ipc_forward(call, phone, &TASK->answerbox); |
574 | return ipc_forward(call, phone, &TASK->answerbox); |
550 | } |
575 | } |
551 | 576 |