Skip to content

Commit 9d442d2

Browse files
ajaykathatgregkh
authored andcommitted
staging: wilc1000: remove use of infinite loop conditions
Avoid the use of 'while (1)' infinite loop conditions. It's not recommended to have infinite loop in kernel code because a small bug can cause never ending loops so use terminator condition as suggested in full driver review [1]. [1]. https://lore.kernel.org/linux-wireless/[email protected]/ Signed-off-by: Ajay Singh <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b5909c6 commit 9d442d2

File tree

3 files changed

+84
-146
lines changed

3 files changed

+84
-146
lines changed

drivers/staging/wilc1000/netdev.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ static const struct net_device_ops wilc_netdev_ops = {
837837
void wilc_netdev_cleanup(struct wilc *wilc)
838838
{
839839
struct wilc_vif *vif;
840-
int srcu_idx;
840+
int srcu_idx, ifc_cnt = 0;
841841

842842
if (!wilc)
843843
return;
@@ -858,7 +858,7 @@ void wilc_netdev_cleanup(struct wilc *wilc)
858858
flush_workqueue(wilc->hif_workqueue);
859859
destroy_workqueue(wilc->hif_workqueue);
860860

861-
do {
861+
while (ifc_cnt < WILC_NUM_CONCURRENT_IFC) {
862862
mutex_lock(&wilc->vif_mutex);
863863
if (wilc->vif_num <= 0) {
864864
mutex_unlock(&wilc->vif_mutex);
@@ -871,7 +871,8 @@ void wilc_netdev_cleanup(struct wilc *wilc)
871871
wilc->vif_num--;
872872
mutex_unlock(&wilc->vif_mutex);
873873
synchronize_srcu(&wilc->srcu);
874-
} while (1);
874+
ifc_cnt++;
875+
}
875876

876877
wilc_wlan_cfg_deinit(wilc);
877878
wlan_deinit_locks(wilc);

drivers/staging/wilc1000/wlan.c

Lines changed: 29 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -499,37 +499,31 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
499499
wilc_wlan_txq_filter_dup_tcp_ack(dev);
500500
i = 0;
501501
sum = 0;
502-
do {
503-
if (tqe && (i < (WILC_VMM_TBL_SIZE - 1))) {
504-
if (tqe->type == WILC_CFG_PKT)
505-
vmm_sz = ETH_CONFIG_PKT_HDR_OFFSET;
506-
507-
else if (tqe->type == WILC_NET_PKT)
508-
vmm_sz = ETH_ETHERNET_HDR_OFFSET;
509-
510-
else
511-
vmm_sz = HOST_HDR_OFFSET;
502+
while (tqe && (i < (WILC_VMM_TBL_SIZE - 1))) {
503+
if (tqe->type == WILC_CFG_PKT)
504+
vmm_sz = ETH_CONFIG_PKT_HDR_OFFSET;
505+
else if (tqe->type == WILC_NET_PKT)
506+
vmm_sz = ETH_ETHERNET_HDR_OFFSET;
507+
else
508+
vmm_sz = HOST_HDR_OFFSET;
512509

513-
vmm_sz += tqe->buffer_size;
510+
vmm_sz += tqe->buffer_size;
514511

515-
if (vmm_sz & 0x3)
516-
vmm_sz = (vmm_sz + 4) & ~0x3;
512+
if (vmm_sz & 0x3)
513+
vmm_sz = (vmm_sz + 4) & ~0x3;
517514

518-
if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE)
519-
break;
515+
if ((sum + vmm_sz) > WILC_TX_BUFF_SIZE)
516+
break;
520517

521-
vmm_table[i] = vmm_sz / 4;
522-
if (tqe->type == WILC_CFG_PKT)
523-
vmm_table[i] |= BIT(10);
524-
cpu_to_le32s(&vmm_table[i]);
518+
vmm_table[i] = vmm_sz / 4;
519+
if (tqe->type == WILC_CFG_PKT)
520+
vmm_table[i] |= BIT(10);
521+
cpu_to_le32s(&vmm_table[i]);
525522

526-
i++;
527-
sum += vmm_sz;
528-
tqe = wilc_wlan_txq_get_next(wilc, tqe);
529-
} else {
530-
break;
531-
}
532-
} while (1);
523+
i++;
524+
sum += vmm_sz;
525+
tqe = wilc_wlan_txq_get_next(wilc, tqe);
526+
}
533527

534528
if (i == 0)
535529
goto out;
@@ -594,12 +588,8 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
594588
break;
595589
reg &= ~BIT(0);
596590
ret = func->hif_write_reg(wilc, WILC_HOST_TX_CTRL, reg);
597-
if (!ret)
598-
break;
599-
break;
600591
}
601-
break;
602-
} while (1);
592+
} while (0);
603593

604594
if (!ret)
605595
goto out_release_bus;
@@ -725,9 +715,7 @@ static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 *buffer, int size)
725715
}
726716
}
727717
offset += tp_len;
728-
if (offset >= size)
729-
break;
730-
} while (1);
718+
} while (offset < size);
731719
}
732720

733721
static void wilc_wlan_handle_rxq(struct wilc *wilc)
@@ -736,11 +724,7 @@ static void wilc_wlan_handle_rxq(struct wilc *wilc)
736724
u8 *buffer;
737725
struct rxq_entry_t *rqe;
738726

739-
do {
740-
if (wilc->quit) {
741-
complete(&wilc->cfg_event);
742-
break;
743-
}
727+
while (!wilc->quit) {
744728
rqe = wilc_wlan_rxq_remove(wilc);
745729
if (!rqe)
746730
break;
@@ -750,7 +734,9 @@ static void wilc_wlan_handle_rxq(struct wilc *wilc)
750734
wilc_wlan_handle_rx_buff(wilc, buffer, size);
751735

752736
kfree(rqe);
753-
} while (1);
737+
}
738+
if (wilc->quit)
739+
complete(&wilc->cfg_event);
754740
}
755741

756742
static void wilc_unknown_isr_ext(struct wilc *wilc)
@@ -969,21 +955,14 @@ void wilc_wlan_cleanup(struct net_device *dev)
969955
struct wilc *wilc = vif->wilc;
970956

971957
wilc->quit = 1;
972-
do {
973-
tqe = wilc_wlan_txq_remove_from_head(dev);
974-
if (!tqe)
975-
break;
958+
while ((tqe = wilc_wlan_txq_remove_from_head(dev))) {
976959
if (tqe->tx_complete_func)
977960
tqe->tx_complete_func(tqe->priv, 0);
978961
kfree(tqe);
979-
} while (1);
962+
}
980963

981-
do {
982-
rqe = wilc_wlan_rxq_remove(wilc);
983-
if (!rqe)
984-
break;
964+
while ((rqe = wilc_wlan_rxq_remove(wilc)))
985965
kfree(rqe);
986-
} while (1);
987966

988967
kfree(wilc->rx_buffer);
989968
wilc->rx_buffer = NULL;

drivers/staging/wilc1000/wlan_cfg.c

Lines changed: 51 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -137,70 +137,50 @@ static void wilc_wlan_parse_response_frame(struct wilc *wl, u8 *info, int size)
137137
{
138138
u16 wid;
139139
u32 len = 0, i = 0;
140+
struct wilc_cfg *cfg = &wl->cfg;
140141

141142
while (size > 0) {
142143
i = 0;
143144
wid = get_unaligned_le16(info);
144145

145146
switch (FIELD_GET(WILC_WID_TYPE, wid)) {
146147
case WID_CHAR:
147-
do {
148-
if (wl->cfg.b[i].id == WID_NIL)
149-
break;
150-
151-
if (wl->cfg.b[i].id == wid) {
152-
wl->cfg.b[i].val = info[4];
153-
break;
154-
}
148+
while (cfg->b[i].id != WID_NIL && cfg->b[i].id != wid)
155149
i++;
156-
} while (1);
150+
151+
if (cfg->b[i].id == wid)
152+
cfg->b[i].val = info[4];
153+
157154
len = 3;
158155
break;
159156

160157
case WID_SHORT:
161-
do {
162-
struct wilc_cfg_hword *hw = &wl->cfg.hw[i];
158+
while (cfg->hw[i].id != WID_NIL && cfg->hw[i].id != wid)
159+
i++;
163160

164-
if (hw->id == WID_NIL)
165-
break;
161+
if (cfg->hw[i].id == wid)
162+
cfg->hw[i].val = get_unaligned_le16(&info[4]);
166163

167-
if (hw->id == wid) {
168-
hw->val = get_unaligned_le16(&info[4]);
169-
break;
170-
}
171-
i++;
172-
} while (1);
173164
len = 4;
174165
break;
175166

176167
case WID_INT:
177-
do {
178-
struct wilc_cfg_word *w = &wl->cfg.w[i];
168+
while (cfg->w[i].id != WID_NIL && cfg->w[i].id != wid)
169+
i++;
179170

180-
if (w->id == WID_NIL)
181-
break;
171+
if (cfg->w[i].id == wid)
172+
cfg->w[i].val = get_unaligned_le32(&info[4]);
182173

183-
if (w->id == wid) {
184-
w->val = get_unaligned_le32(&info[4]);
185-
break;
186-
}
187-
i++;
188-
} while (1);
189174
len = 6;
190175
break;
191176

192177
case WID_STR:
193-
do {
194-
if (wl->cfg.s[i].id == WID_NIL)
195-
break;
196-
197-
if (wl->cfg.s[i].id == wid) {
198-
memcpy(wl->cfg.s[i].str, &info[2],
199-
(info[2] + 2));
200-
break;
201-
}
178+
while (cfg->s[i].id != WID_NIL && cfg->s[i].id != wid)
202179
i++;
203-
} while (1);
180+
181+
if (cfg->s[i].id == wid)
182+
memcpy(cfg->s[i].str, &info[2], info[2] + 2);
183+
204184
len = 2 + info[2];
205185
break;
206186

@@ -223,16 +203,12 @@ static void wilc_wlan_parse_info_frame(struct wilc *wl, u8 *info)
223203
if (len == 1 && wid == WID_STATUS) {
224204
int i = 0;
225205

226-
do {
227-
if (wl->cfg.b[i].id == WID_NIL)
228-
break;
229-
230-
if (wl->cfg.b[i].id == wid) {
231-
wl->cfg.b[i].val = info[3];
232-
break;
233-
}
206+
while (wl->cfg.b[i].id != WID_NIL &&
207+
wl->cfg.b[i].id != wid)
234208
i++;
235-
} while (1);
209+
210+
if (wl->cfg.b[i].id == wid)
211+
wl->cfg.b[i].val = info[3];
236212
}
237213
}
238214

@@ -292,63 +268,45 @@ int wilc_wlan_cfg_get_val(struct wilc *wl, u16 wid, u8 *buffer,
292268
{
293269
u8 type = FIELD_GET(WILC_WID_TYPE, wid);
294270
int i, ret = 0;
271+
struct wilc_cfg *cfg = &wl->cfg;
295272

296273
i = 0;
297274
if (type == CFG_BYTE_CMD) {
298-
do {
299-
if (wl->cfg.b[i].id == WID_NIL)
300-
break;
301-
302-
if (wl->cfg.b[i].id == wid) {
303-
memcpy(buffer, &wl->cfg.b[i].val, 1);
304-
ret = 1;
305-
break;
306-
}
275+
while (cfg->b[i].id != WID_NIL && cfg->b[i].id != wid)
307276
i++;
308-
} while (1);
277+
278+
if (cfg->b[i].id == wid) {
279+
memcpy(buffer, &cfg->b[i].val, 1);
280+
ret = 1;
281+
}
309282
} else if (type == CFG_HWORD_CMD) {
310-
do {
311-
if (wl->cfg.hw[i].id == WID_NIL)
312-
break;
313-
314-
if (wl->cfg.hw[i].id == wid) {
315-
memcpy(buffer, &wl->cfg.hw[i].val, 2);
316-
ret = 2;
317-
break;
318-
}
283+
while (cfg->hw[i].id != WID_NIL && cfg->hw[i].id != wid)
319284
i++;
320-
} while (1);
285+
286+
if (cfg->hw[i].id == wid) {
287+
memcpy(buffer, &cfg->hw[i].val, 2);
288+
ret = 2;
289+
}
321290
} else if (type == CFG_WORD_CMD) {
322-
do {
323-
if (wl->cfg.w[i].id == WID_NIL)
324-
break;
325-
326-
if (wl->cfg.w[i].id == wid) {
327-
memcpy(buffer, &wl->cfg.w[i].val, 4);
328-
ret = 4;
329-
break;
330-
}
291+
while (cfg->w[i].id != WID_NIL && cfg->w[i].id != wid)
331292
i++;
332-
} while (1);
333-
} else if (type == CFG_STR_CMD) {
334-
do {
335-
u32 id = wl->cfg.s[i].id;
336293

337-
if (id == WID_NIL)
338-
break;
294+
if (cfg->w[i].id == wid) {
295+
memcpy(buffer, &cfg->w[i].val, 4);
296+
ret = 4;
297+
}
298+
} else if (type == CFG_STR_CMD) {
299+
while (cfg->s[i].id != WID_NIL && cfg->s[i].id != wid)
300+
i++;
339301

340-
if (id == wid) {
341-
u16 size = get_unaligned_le16(wl->cfg.s[i].str);
302+
if (cfg->s[i].id == wid) {
303+
u16 size = get_unaligned_le16(cfg->s[i].str);
342304

343-
if (buffer_size >= size) {
344-
memcpy(buffer, &wl->cfg.s[i].str[2],
345-
size);
346-
ret = size;
347-
}
348-
break;
305+
if (buffer_size >= size) {
306+
memcpy(buffer, &cfg->s[i].str[2], size);
307+
ret = size;
349308
}
350-
i++;
351-
} while (1);
309+
}
352310
}
353311
return ret;
354312
}

0 commit comments

Comments
 (0)