]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Check os_get_random() return value more consistently
authorJouni Malinen <j@w1.fi>
Sat, 13 Sep 2014 13:27:52 +0000 (16:27 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 13 Sep 2014 13:27:52 +0000 (16:27 +0300)
In theory, this call could fail, so check the return value before using
the received data. These specific cases would not really care much about
the failures, but this keeps the code more consistent and keeps static
analyzer warnings more useful. (CID 72678, CID 72679, CID 72680,
CID 72683, CID 72689, CID 72698, CID 72703)

Signed-off-by: Jouni Malinen <j@w1.fi>
src/p2p/p2p.c
src/p2p/p2p_utils.c
wpa_supplicant/p2p_supplicant.c

index 565cbdbd220c915c323082cd2ec11c58b13a19b8..e746310e52bcbf22e695f8c244389ce36d00173b 100644 (file)
@@ -259,7 +259,8 @@ static void p2p_listen_in_find(struct p2p_data *p2p, int dev_disc)
                return;
        }
 
-       os_get_random((u8 *) &r, sizeof(r));
+       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+               r = 0;
        tu = (r % ((p2p->max_disc_int - p2p->min_disc_int) + 1) +
              p2p->min_disc_int) * 100;
        if (p2p->max_disc_tu >= 0 && tu > (unsigned int) p2p->max_disc_tu)
@@ -2480,7 +2481,8 @@ struct p2p_data * p2p_init(const struct p2p_config *cfg)
        p2p->max_disc_int = 3;
        p2p->max_disc_tu = -1;
 
-       os_get_random(&p2p->next_tie_breaker, 1);
+       if (os_get_random(&p2p->next_tie_breaker, 1) < 0)
+               p2p->next_tie_breaker = 0;
        p2p->next_tie_breaker &= 0x01;
        if (cfg->sd_request)
                p2p->dev_capab |= P2P_DEV_CAPAB_SERVICE_DISCOVERY;
@@ -3003,7 +3005,8 @@ static void p2p_go_neg_req_cb(struct p2p_data *p2p, int success)
                 * make it less likely to hit cases where we could end up in
                 * sync with peer not listening.
                 */
-               os_get_random((u8 *) &r, sizeof(r));
+               if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                       r = 0;
                timeout += r % 100000;
        }
        p2p_set_timeout(p2p, 0, timeout);
index 189300adf97c38faed5e017dd91dca08ebfd0f57..508a609432e30162f67fe9c166c67cfb3cf14668 100644 (file)
@@ -441,7 +441,8 @@ void p2p_channels_dump(struct p2p_data *p2p, const char *title,
 static u8 p2p_channel_pick_random(const u8 *channels, unsigned int num_channels)
 {
        unsigned int r;
-       os_get_random((u8 *) &r, sizeof(r));
+       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+               r = 0;
        r %= num_channels;
        return channels[r];
 }
index 5d63de3328083037ab9b581a0db4164209cce0a2..e1a384b93a0b71e117f318132339308a0b2cba09 100644 (file)
@@ -3927,7 +3927,8 @@ int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
                 * Pick one of the social channels randomly as the listen
                 * channel.
                 */
-               os_get_random((u8 *) &r, sizeof(r));
+               if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                       return -1;
                p2p.channel = 1 + (r % 3) * 5;
                p2p.channel_forced = 0;
        }
@@ -3947,7 +3948,8 @@ int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
                 * Use random operation channel from (1, 6, 11) if no other
                 * preference is indicated.
                 */
-               os_get_random((u8 *) &r, sizeof(r));
+               if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                       return -1;
                p2p.op_channel = 1 + (r % 3) * 5;
                p2p.cfg_op_channel = 0;
                wpa_printf(MSG_DEBUG, "P2P: Random operating channel: "
@@ -5030,7 +5032,8 @@ static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq)
                        wpa_printf(MSG_DEBUG, "P2P: Use best 2.4 GHz band "
                                   "channel: %d MHz", freq);
                } else {
-                       os_get_random((u8 *) &r, sizeof(r));
+                       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                               return -1;
                        freq = 2412 + (r % 3) * 25;
                        wpa_printf(MSG_DEBUG, "P2P: Use random 2.4 GHz band "
                                   "channel: %d MHz", freq);
@@ -5047,7 +5050,8 @@ static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq)
                        wpa_printf(MSG_DEBUG, "P2P: Use best 5 GHz band "
                                   "channel: %d MHz", freq);
                } else {
-                       os_get_random((u8 *) &r, sizeof(r));
+                       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                               return -1;
                        freq = 5180 + (r % 4) * 20;
                        if (!p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
                                wpa_printf(MSG_DEBUG, "P2P: Could not select "
@@ -6329,8 +6333,10 @@ void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
                         * Pick one of the social channels randomly as the
                         * listen channel.
                         */
-                       os_get_random((u8 *) &r, sizeof(r));
-                       channel = 1 + (r % 3) * 5;
+                       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                               channel = 1;
+                       else
+                               channel = 1 + (r % 3) * 5;
                        channel_forced = 0;
                }
                ret = p2p_set_listen_channel(p2p, reg_class, channel,
@@ -6354,8 +6360,10 @@ void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
                         * Use random operation channel from (1, 6, 11)
                         *if no other preference is indicated.
                         */
-                       os_get_random((u8 *) &r, sizeof(r));
-                       op_channel = 1 + (r % 3) * 5;
+                       if (os_get_random((u8 *) &r, sizeof(r)) < 0)
+                               op_channel = 1;
+                       else
+                               op_channel = 1 + (r % 3) * 5;
                        cfg_op_channel = 0;
                }
                ret = p2p_set_oper_channel(p2p, op_reg_class, op_channel,