Ticket #1024: getappiebuf.2.patch

File getappiebuf.2.patch, 2.2 kB (added by zdarsky@informatik.uni-kl.de, 5 years ago)

updated patch with more error checks (replaces previous one)

  • net80211/ieee80211_wireless.c

    old new  
    30213021static int 
    30223022ieee80211_ioctl_setappiebuf(struct net_device *dev, 
    30233023        struct iw_request_info *info, 
    3024         void *w, char *extra) 
     3024        struct iw_point *data, char *extra) 
    30253025{ 
    30263026        struct ieee80211vap *vap = dev->priv; 
    30273027        struct ieee80211req_getset_appiebuf *iebuf = 
    30283028                (struct ieee80211req_getset_appiebuf *)extra; 
    30293029        enum ieee80211_opmode chk_opmode; 
     3030        int iebuf_len; 
    30303031        int rc = 0; 
    30313032 
    3032         if (iebuf->app_buflen > IEEE80211_APPIE_MAX) 
     3033        iebuf_len = data->length - sizeof(struct ieee80211req_getset_appiebuf); 
     3034        if ( iebuf_len < 0 || iebuf_len != iebuf->app_buflen || 
     3035                 iebuf->app_buflen > IEEE80211_APPIE_MAX ) 
    30333036                return -EINVAL; 
    30343037 
    30353038        switch (iebuf->app_frmtype) { 
     
    30603063 
    30613064static int 
    30623065ieee80211_ioctl_getappiebuf(struct net_device *dev, struct iw_request_info *info, 
    3063         void *w, char *extra) 
     3066        struct iw_point *data, char *extra) 
    30643067{ 
    30653068        struct ieee80211vap *vap = dev->priv; 
    30663069        struct ieee80211req_getset_appiebuf *iebuf = 
    30673070                (struct ieee80211req_getset_appiebuf *)extra; 
     3071        int max_iebuf_len; 
     3072        int rc = 0; 
    30683073 
     3074        max_iebuf_len = data->length - sizeof(struct ieee80211req_getset_appiebuf); 
     3075        if (max_iebuf_len < 0) 
     3076                return -EINVAL; 
     3077        if (copy_from_user(iebuf, data->pointer, sizeof(struct ieee80211req_getset_appiebuf))) 
     3078                return -EFAULT;          
     3079        if (iebuf->app_buflen > max_iebuf_len) 
     3080                iebuf->app_buflen = max_iebuf_len; 
     3081 
    30693082        switch (iebuf->app_frmtype) { 
    30703083        case IEEE80211_APPIE_FRAME_BEACON: 
    30713084        case IEEE80211_APPIE_FRAME_PROBE_RESP: 
     
    30823095                return -EINVAL; 
    30833096        } 
    30843097 
    3085         return get_app_ie(iebuf->app_frmtype, vap, iebuf); 
     3098        rc = get_app_ie(iebuf->app_frmtype, vap, iebuf); 
     3099         
     3100        data->length = sizeof(struct ieee80211req_getset_appiebuf) + iebuf->app_buflen; 
     3101         
     3102        return rc; 
    30863103} 
    30873104 
    30883105static int 
     
    48204837#define IW_PRIV_TYPE_CHANINFO \ 
    48214838        IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_chaninfo) 
    48224839#define IW_PRIV_TYPE_APPIEBUF \ 
    4823         (IW_PRIV_TYPE_BYTE | IEEE80211_APPIE_MAX
     4840        (IW_PRIV_TYPE_BYTE | (sizeof(struct ieee80211req_getset_appiebuf) + IEEE80211_APPIE_MAX)
    48244841#define IW_PRIV_TYPE_FILTER \ 
    48254842        IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_set_filter) 
    48264843