Changeset 0722869 in mainline for kernel/generic/src/ipc/sysipc.c


Ignore:
Timestamp:
2017-12-09T18:21:29Z (8 years ago)
Author:
GitHub <noreply@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bd253241
Parents:
071a1ddb (diff), 0016674 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2017-12-09 18:21:29)
git-committer:
GitHub <noreply@…> (2017-12-09 18:21:29)
Message:

Merge SYS_IPC_CONNECT_KBOX changes.

Return phone handle in SYS_IPC_CONNECT_KBOX separately from error code, don't leak phone on failure, and remove the unnecessary separation into two versions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/sysipc.c

    r071a1ddb r0722869  
    897897}
    898898
    899 #ifdef __32_BITS__
    900 
    901 /** Syscall connect to a task by ID (32 bits)
    902  *
    903  * @return Phone id on success, or negative error code.
    904  *
    905  */
    906 sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid)
     899/** Syscall connect to a task by ID
     900 *
     901 * @return Error code.
     902 *
     903 */
     904sysarg_t sys_ipc_connect_kbox(task_id_t *uspace_taskid, cap_handle_t *uspace_phone)
    907905{
    908906#ifdef CONFIG_UDEBUG
    909         sysarg64_t taskid;
    910         int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t));
    911         if (rc != 0)
    912                 return (sysarg_t) rc;
    913        
    914         return ipc_connect_kbox((task_id_t) taskid);
     907        task_id_t taskid;
     908        cap_handle_t phone;
     909       
     910        int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(task_id_t));
     911        if (rc == EOK) {
     912                rc = ipc_connect_kbox((task_id_t) taskid, &phone);
     913        }
     914       
     915        if (rc == EOK) {
     916                rc = copy_to_uspace(uspace_phone, &phone, sizeof(cap_handle_t));
     917                if (rc != EOK) {
     918                        // Clean up the phone on failure.
     919                        sys_ipc_hangup(phone);
     920                }
     921        }
     922       
     923        return (sysarg_t) rc;
    915924#else
    916925        return (sysarg_t) ENOTSUP;
     
    918927}
    919928
    920 #endif  /* __32_BITS__ */
    921 
    922 #ifdef __64_BITS__
    923 
    924 /** Syscall connect to a task by ID (64 bits)
    925  *
    926  * @return Phone id on success, or negative error code.
    927  *
    928  */
    929 sysarg_t sys_ipc_connect_kbox(sysarg_t taskid)
    930 {
    931 #ifdef CONFIG_UDEBUG
    932         return ipc_connect_kbox((task_id_t) taskid);
    933 #else
    934         return (sysarg_t) ENOTSUP;
    935 #endif
    936 }
    937 
    938 #endif  /* __64_BITS__ */
    939 
    940929/** @}
    941930 */
Note: See TracChangeset for help on using the changeset viewer.