Вызов ioctl () приводит к ошибке, указывающей «неверный адрес» - PullRequest
0 голосов
/ 19 сентября 2018

Я получаю следующую ошибку:

wlan_config_vap_priv_int vap lan0 cmd cpauth val 0(0) error: Bad address

Из печати в wlan_config_vap_priv_int.Кто-нибудь знает, что может быть причиной ошибки «Неправильный адрес»?

С почему ioctl возвращает «неправильный адрес» Я подозреваю, что виновником может быть вызов ioctl, но я непонятно почему.

int wlan_config_vap_priv(char *vap, char *cmd, char * val) {
    int fd, ret;
    struct ifreq ifr;
    param_t fp;

    strncpy(ifr.ifr_name, vap, IFNAMSIZ);
    strncpy(fp.cmd, cmd, sizeof(fp.cmd));
    strncpy(fp.val, val, sizeof(fp.val));
    ifr.ifr_data = (void *) &fp;
    printf("%s:%d: config vap %s priv %s=%s\n", __func__, __LINE__, vap, cmd, val);
    if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket");
        return -1;
    }
    ret = ioctl(fd, SIOCSPARAM, &ifr);
    close(fd);
    return (ret);
}

int wlan_config_vap_priv_int(uint8_t rId, char *vap, char *cmd, int val) {

    char buf[32];
    int ret;

    snprintf(buf, sizeof(buf), "%d", val);
    ret = wlan_config_vap_priv(vap, cmd, buf);
    if (ret < 0) {
        CW_LOG_ERR("%s vap %s cmd %s val %s(%d) error: %s\n",
                    __FUNCTION__, vap, cmd, buf, val, strerror(errno));
    }
    return ret;
}

1 Ответ

0 голосов
/ 19 сентября 2018

Ваша информация неполная, поскольку у вас нет части ядра для SIOCSPARAM.

Однако, согласно http://man7.org/linux/man-pages/man2/ioctl.2.html, эта ошибка возникает, когда argp ссылается на недоступную памятьarea

EFAULT argp ссылается на недоступную область памяти.

К исходным строкам не привязан размер.Использование strncpy в этой строке небезопасно и может быть причиной.Вы можете попробовать использовать что-то вроде snprintf.

...