Вызов ioctl () приводит к ошибке, указывающей на неверный адрес.

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

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;
}

person Jobs    schedule 19.09.2018    source источник
comment
Что такое SIOCSPARAM? Вызов завершается неудачно на ioctl или на socket? Строка это просто функция CW_LOG_ERR, напечатанная в ней. EFAULT - это странная ошибка, вы сбрасывали ее перед вызовом wlan_config_vap_priv?   -  person KamilCuk    schedule 19.09.2018
comment
Использование strncpy(str, str2, sizeof(str)) - плохая практика, в случае, если строка strlen(str2) == sizeof(str) не будет завершена нулем. Используйте strscpy.   -  person KamilCuk    schedule 19.09.2018
comment
Я не могу найти упоминания о SIOCSPARAM ни в Google, ни на страницах руководства, ни в исходных текстах ядра Linux, ни в заголовках C ...   -  person o11c    schedule 19.09.2018
comment
Я сам реализовал SIOCSPARAM, поэтому это не стандартный ioctl. @ o11c   -  person Jobs    schedule 19.09.2018
comment
@KamilCuk, ты говоришь, что я должен использовать вместо этого sizeof (str2)?   -  person Jobs    schedule 19.09.2018
comment
Я говорю, что вы не должны ожидать строки с завершающим нулем после использования функции strncpy, независимо от того, что вы с ней используете. Если вы ожидаете, что строки будут завершаться нулем, используйте strscpy. Забудьте о strncpy. Отрицательное значение, возвращаемое wlan_config_vap_priv, возвращается вызовом ioctl или вызовом сокета? Как вы реализовали вызов ioctl? Как определяется SIOCSPARAM? Что это за система / среда?   -  person KamilCuk    schedule 19.09.2018
comment
Я сам реализовал SIOCSPARAM. Только вы можете сказать, почему тогда ваш ioctl возвращает ошибку.   -  person n. 1.8e9-where's-my-share m.    schedule 19.09.2018
comment
Включите часть ядра для SIOCSPARAM. В противном случае этот вопрос не дает достаточно информации.   -  person milaniez    schedule 19.09.2018
comment
@KamilCuk strscpy предназначен для ядра. Это похоже на код пользовательского пространства.   -  person milaniez    schedule 19.09.2018
comment
strscpy не является стандартной библиотечной функцией C. Наверное, лучше просто научиться правильно использовать strncpy.   -  person Christian Gibbons    schedule 19.09.2018
comment
Две функции без информации о том, что вы им передаете, какова ваша среда и оборудование, каковы ваши пользовательские части и т. Д. - не вопрос. На таких неполных данных нет смысла строить догадки.   -  person underscore_d    schedule 19.09.2018


Ответы (1)


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

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

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

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

person milaniez    schedule 19.09.2018