| 1 | --- a/iwlist.c |
| 2 | +++ b/iwlist.c |
| 3 | @@ -792,7 +792,8 @@ print_scanning_info(int skfd, |
| 4 | if(iw_get_ext(skfd, ifname, SIOCGIWSCAN, &wrq) < 0) |
| 5 | { |
| 6 | /* Check if buffer was too small (WE-17 only) */ |
| 7 | - if((errno == E2BIG) && (range.we_version_compiled > 16)) |
| 8 | + if((errno == E2BIG) && (range.we_version_compiled > 16) |
| 9 | + && (buflen < 0xFFFF)) |
| 10 | { |
| 11 | /* Some driver may return very large scan results, either |
| 12 | * because there are many cells, or because they have many |
| 13 | @@ -808,6 +809,10 @@ print_scanning_info(int skfd, |
| 14 | else |
| 15 | buflen *= 2; |
| 16 | |
| 17 | + /* wrq.u.data.length is 16 bits so max size is 65535 */ |
| 18 | + if(buflen > 0xFFFF) |
| 19 | + buflen = 0xFFFF; |
| 20 | + |
| 21 | /* Try again */ |
| 22 | goto realloc; |
| 23 | } |
| 24 | @@ -2152,6 +2157,7 @@ main(int argc, |
| 25 | char **args; /* Command arguments */ |
| 26 | int count; /* Number of arguments */ |
| 27 | const iwlist_cmd *iwcmd; |
| 28 | + int goterr = 0; |
| 29 | |
| 30 | if(argc < 2) |
| 31 | iw_usage(1); |
| 32 | @@ -2199,12 +2205,12 @@ main(int argc, |
| 33 | |
| 34 | /* do the actual work */ |
| 35 | if (dev) |
| 36 | - (*iwcmd->fn)(skfd, dev, args, count); |
| 37 | + goterr = (*iwcmd->fn)(skfd, dev, args, count); |
| 38 | else |
| 39 | iw_enum_devices(skfd, iwcmd->fn, args, count); |
| 40 | |
| 41 | /* Close the socket. */ |
| 42 | iw_sockets_close(skfd); |
| 43 | |
| 44 | - return 0; |
| 45 | + return goterr; |
| 46 | } |
| 47 | |