--- a/iwlist.c +++ b/iwlist.c @@ -792,7 +792,8 @@ print_scanning_info(int skfd, if(iw_get_ext(skfd, ifname, SIOCGIWSCAN, &wrq) < 0) { /* Check if buffer was too small (WE-17 only) */ - if((errno == E2BIG) && (range.we_version_compiled > 16)) + if((errno == E2BIG) && (range.we_version_compiled > 16) + && (buflen < 0xFFFF)) { /* Some driver may return very large scan results, either * because there are many cells, or because they have many @@ -808,6 +809,10 @@ print_scanning_info(int skfd, else buflen *= 2; + /* wrq.u.data.length is 16 bits so max size is 65535 */ + if(buflen > 0xFFFF) + buflen = 0xFFFF; + /* Try again */ goto realloc; } @@ -2152,6 +2157,7 @@ main(int argc, char **args; /* Command arguments */ int count; /* Number of arguments */ const iwlist_cmd *iwcmd; + int goterr = 0; if(argc < 2) iw_usage(1); @@ -2199,12 +2205,12 @@ main(int argc, /* do the actual work */ if (dev) - (*iwcmd->fn)(skfd, dev, args, count); + goterr = (*iwcmd->fn)(skfd, dev, args, count); else iw_enum_devices(skfd, iwcmd->fn, args, count); /* Close the socket. */ iw_sockets_close(skfd); - return 0; + return goterr; }