mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-31 16:35:28 +00:00
4903487f21
In 'SUPR3InitEx' (SUPLib.cpp) a 'SUPQUERYFUNCS' structure is allocated with ! (PSUPQUERYFUNCS)RTMemAllocZ(SUP_IOCTL_QUERY_FUNCS_SIZE(CookieReq.u.Out.cFunctions)); where 'CookieReq.u.Out.cFunctions' is 0. To determine the size of the allocation ! #define SUP_IOCTL_QUERY_FUNCS_SIZE(cFuncs) \ ! RT_UOFFSETOF_DYN(SUPQUERYFUNCS, u.Out.aFunctions[(cFuncs)]) is used with cFuncs = 0 (SUPDrvIOC.h) leading to an allocation up to the arrow below ! typedef struct SUPQUERYFUNCS ! { ! /** The header. */ ! SUPREQHDR Hdr; ! union ! { ! struct ! { ! /** Number of functions returned. */ ! uint32_t cFunctions; ! /** Array of functions. */ ==> end of allocation ! SUPFUNC aFunctions[1]; ! } Out; ! } u; ==> sizeof(SUPQUERYFUNCS) ! } SUPQUERYFUNCS, *PSUPQUERYFUNCS; In sup.cc (Genode) 'ioctl(SUPQUERYFUNCS &request)' will lead to 'with_out_ioctl' ! auto &out = request.u.Out; where auto is 'SUPQUERYFUNCS' and finally ! out = { }; will zero out 'SUPQUERYFUNCS' up to the second arrow above. Because 'RTMemAllocZ' will call 'calloc' to allocate the memory 'out = { };' will corrupt the slab block after the allocation. Therefore, it is reasonable to allocate at least 'sizeof(SUPQUERYFUNCS)'. Note there might be other 'ioctl' cases like this. A better way might be to use 'SUPQUERYFUNCS.Hdr.cbOut' to determine the 'out' size. fixes #4675
This directory contains ports of 3rd-party applications to Genode. The 'ports' repository follows the patterns of the 'libports' repository. For instructions about downloading and building 3rd-party applications, please refer to _libports/README_. Dependencies from other repositories ------------------------------------ Applications provided by the 'ports' repository typically expect a rich runtime environment, including shared libraries provided by the 'libports' repository. Hence, 'ports' depends on 'libports'.