编写设备驱动程序

处理 copyout() 溢出

驱动程序有时需要将不再适于 32 位大小结构的本机数值复制出来。在这种情况下,驱动程序应向调用方返回 EOVERFLOWEOVERFLOW 用于表明接口中的数据类型太小,无法保存要返回的值,如以下示例中所示。


示例 15–15 处理 copyout(9F) 溢出

int
    xxioctl(dev_t dev, int cmd, intptr_t arg, int mode,
     cred_t *cr, int *rval_p)
    {
        struct resdata res;
        /* body of driver */
        switch (ddi_model_convert_from(mode & FMODELS)) {
        case DDI_MODEL_ILP32: {
            struct resdata32 res32;

            if (res.size > UINT_MAX)
                    return (EOVERFLOW);    
            res32.size = (size32_t)res.size;
            res32.flag = res.flag;
            if (ddi_copyout(&res32,
                (void *)arg, sizeof (res32), mode))
                    return (EFAULT);
        }
        break;

        case DDI_MODEL_NONE:
            if (ddi_copyout(&res, (void *)arg, sizeof (res), mode))
                    return (EFAULT);
            break;
        }
        return (0);
    }