调用ioctl()会导致errno指示“错误地址”

时间:2018-09-19 18:05:36

标签: c sockets ioctl

我遇到以下错误:

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

来自wlan_config_vap_priv_int中的打印内容。有谁知道是什么原因导致“地址错误”错误?

why does ioctl return "bad address"起,我怀疑罪魁祸首可能是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 :(得分:0)

您的信息不完整,因为您没有SIOCSPARAM的内核部分。

但是根据http://man7.org/linux/man-pages/man2/ioctl.2.html,当 argp 引用无法访问的内存区域时,会发生此错误

  

EFAULT argp 引用了无法访问的内存区域。

您的源字符串没有附加大小。在此字符串上使用strncpy是不安全的,可能是罪魁祸首。您可以尝试使用类似snprintf之类的东西。