mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
new-ipc: Introduce serviceCreateNonDomainSubservice in order to avoid calling cmifQueryPointerBufferSize during response parsing and corrupting output data as a result [bug found by @SciresM]
This commit is contained in:
parent
cd9f29fc8e
commit
324a3624ac
@ -142,6 +142,20 @@ NX_INLINE void serviceCreate(Service* s, Handle h)
|
|||||||
cmifQueryPointerBufferSize(h, &s->pointer_buffer_size);
|
cmifQueryPointerBufferSize(h, &s->pointer_buffer_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a non-domain subservice object from a parent service.
|
||||||
|
* @param[out] s Service object.
|
||||||
|
* @param[in] parent Parent service.
|
||||||
|
* @param[in] h IPC session handle for this subservice.
|
||||||
|
*/
|
||||||
|
NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Handle h)
|
||||||
|
{
|
||||||
|
s->session = h;
|
||||||
|
s->own_handle = 1;
|
||||||
|
s->object_id = 0;
|
||||||
|
s->pointer_buffer_size = parent->pointer_buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a domain subservice object from a parent service.
|
* @brief Creates a domain subservice object from a parent service.
|
||||||
* @param[out] s Service object.
|
* @param[out] s Service object.
|
||||||
@ -397,7 +411,7 @@ NX_INLINE Result serviceParseResponse(
|
|||||||
if (is_domain)
|
if (is_domain)
|
||||||
serviceCreateDomainSubservice(&out_objects[i], s, cmifResponseGetObject(&res));
|
serviceCreateDomainSubservice(&out_objects[i], s, cmifResponseGetObject(&res));
|
||||||
else // Output objects are marshalled as move handles at the beginning of the list.
|
else // Output objects are marshalled as move handles at the beginning of the list.
|
||||||
serviceCreate(&out_objects[i], cmifResponseGetMoveHandle(&res));
|
serviceCreateNonDomainSubservice(&out_objects[i], s, cmifResponseGetMoveHandle(&res));
|
||||||
}
|
}
|
||||||
|
|
||||||
_serviceResponseGetHandle(&res, out_handle_attrs.attr0, &out_handles[0]);
|
_serviceResponseGetHandle(&res, out_handle_attrs.attr0, &out_handles[0]);
|
||||||
|
Loading…
Reference in New Issue
Block a user