Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/sysinfo/sysinfo.c

    r311bc25 r96b02eb9  
    4040#include <arch/asm.h>
    4141#include <errno.h>
    42 #include <macros.h>
    4342
    4443/** Maximal sysinfo path length */
     
    762761 * character must be null).
    763762 *
    764  * If the user space buffer size does not equal
    765  * the actual size of the returned data, the data
    766  * is truncated. Whether this is actually a fatal
    767  * error or the data can be still interpreted as valid
    768  * depends on the nature of the data and has to be
    769  * decided by the user space.
    770  *
    771  * The actual size of data returned is stored to
    772  * size_ptr.
     763 * The user space buffer must be sized exactly according
     764 * to the size of the binary data, otherwise the request
     765 * fails.
    773766 *
    774767 * @param path_ptr    Sysinfo path in the user address space.
     
    777770 *                    to store the binary data.
    778771 * @param buffer_size User space buffer size.
    779  * @param size_ptr    User space pointer where to store the
    780  *                    binary data size.
    781772 *
    782773 * @return Error code (EOK in case of no error).
     
    784775 */
    785776sysarg_t sys_sysinfo_get_data(void *path_ptr, size_t path_size,
    786     void *buffer_ptr, size_t buffer_size, size_t *size_ptr)
     777    void *buffer_ptr, size_t buffer_size)
    787778{
    788779        int rc;
    789780       
    790781        /* Get the item */
    791         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size,
    792             false);
    793        
     782        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, false);
     783
    794784        /* Only constant or generated binary data is considered */
    795         if ((ret.tag == SYSINFO_VAL_DATA) ||
    796             (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) {
    797                 size_t size = min(ret.data.size, buffer_size);
    798                 rc = copy_to_uspace(buffer_ptr, ret.data.data, size);
    799                 if (rc == EOK)
    800                         rc = copy_to_uspace(size_ptr, &size, sizeof(size));
     785        if ((ret.tag == SYSINFO_VAL_DATA) || (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) {
     786                /* Check destination buffer size */
     787                if (ret.data.size == buffer_size)
     788                        rc = copy_to_uspace(buffer_ptr, ret.data.data,
     789                            ret.data.size);
     790                else
     791                        rc = ENOMEM;
    801792        } else
    802793                rc = EINVAL;
Note: See TracChangeset for help on using the changeset viewer.