ath10k: ret used but uninitialized
diff mbox

Message ID 87bmowd0mh.fsf@kamboji.qca.qualcomm.com
State New
Headers show

Commit Message

Kalle Valo July 7, 2017, 10:04 a.m. UTC
Erik Stromdahl <erik.stromdahl@gmail.com> writes:

>> With gcc 4.1.2:

>>

>> drivers/net/wireless/ath/ath10k/sdio.c: In function

>> ‘ath10k_sdio_mbox_rxmsg_pending_handler’:

>> drivers/net/wireless/ath/ath10k/sdio.c:676: warning: ‘ret’ may be used

>> uninitialized in this function

>>

>>> +

>>> +       *done = true;

>>> +

>>> +       /* Copy the lookahead obtained from the HTC register table into our

>>> +        * temp array as a start value.

>>> +        */

>>> +       lookaheads[0] = msg_lookahead;

>>> +

>>> +       timeout = jiffies + SDIO_MBOX_PROCESSING_TIMEOUT_HZ;

>>

>> Although very unlikely due to the long timeout, if the code is preempted here,

>> and the loop below never entered, ret will indeed be uninitialized.

>>

>> It's unclear to me what the proper initialization would be, though, so

>> that's why I didn't send a patch.

>>

> I think it would be best to use 0 as initial value of ret in this case.

> This will make all other interrupts be processed in a normal way.

>

> Kalle: Should I create a new patch (initializing ret with zero)?


Yes, please send a new patch fixing this.

But I don't like that much with the style of initialising ret to zero,
it tends to hide things. Instead my preference is something like below
where the error handling is more explicit and easier to find where it's
exactly failing. But that's just an example how I would try to solve it,
it still lacks the handling of -ECANCEL etc.



-- 
Kalle Valo

Comments

Arnd Bergmann July 7, 2017, 2:14 p.m. UTC | #1
On Fri, Jul 7, 2017 at 12:04 PM, Kalle Valo <kvalo@qca.qualcomm.com> wrote:
> Erik Stromdahl <erik.stromdahl@gmail.com> writes:
>
>>> With gcc 4.1.2:
>>>
>>> drivers/net/wireless/ath/ath10k/sdio.c: In function
>>> ‘ath10k_sdio_mbox_rxmsg_pending_handler’:
>>> drivers/net/wireless/ath/ath10k/sdio.c:676: warning: ‘ret’ may be used
>>> uninitialized in this function
>>>
>>>> +
>>>> +       *done = true;
>>>> +
>>>> +       /* Copy the lookahead obtained from the HTC register table into our
>>>> +        * temp array as a start value.
>>>> +        */
>>>> +       lookaheads[0] = msg_lookahead;
>>>> +
>>>> +       timeout = jiffies + SDIO_MBOX_PROCESSING_TIMEOUT_HZ;
>>>
>>> Although very unlikely due to the long timeout, if the code is preempted here,
>>> and the loop below never entered, ret will indeed be uninitialized.
>>>
>>> It's unclear to me what the proper initialization would be, though, so
>>> that's why I didn't send a patch.
>>>
>> I think it would be best to use 0 as initial value of ret in this case.
>> This will make all other interrupts be processed in a normal way.
>>
>> Kalle: Should I create a new patch (initializing ret with zero)?
>
> Yes, please send a new patch fixing this.
>
> But I don't like that much with the style of initialising ret to zero,
> it tends to hide things. Instead my preference is something like below
> where the error handling is more explicit and easier to find where it's
> exactly failing. But that's just an example how I would try to solve it,
> it still lacks the handling of -ECANCEL etc.

I think I would simply replace the "while() {}" loop with "do{} while()",
as that would guarantee it to be run at least once in a way that the
compiler can see.

       Arnd
Geert Uytterhoeven July 7, 2017, 2:15 p.m. UTC | #2
Hi Arnd,

On Fri, Jul 7, 2017 at 4:14 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Fri, Jul 7, 2017 at 12:04 PM, Kalle Valo <kvalo@qca.qualcomm.com> wrote:
>> Erik Stromdahl <erik.stromdahl@gmail.com> writes:
>>>> With gcc 4.1.2:
>>>>
>>>> drivers/net/wireless/ath/ath10k/sdio.c: In function
>>>> ‘ath10k_sdio_mbox_rxmsg_pending_handler’:
>>>> drivers/net/wireless/ath/ath10k/sdio.c:676: warning: ‘ret’ may be used
>>>> uninitialized in this function
>>>>
>>>>> +
>>>>> +       *done = true;
>>>>> +
>>>>> +       /* Copy the lookahead obtained from the HTC register table into our
>>>>> +        * temp array as a start value.
>>>>> +        */
>>>>> +       lookaheads[0] = msg_lookahead;
>>>>> +
>>>>> +       timeout = jiffies + SDIO_MBOX_PROCESSING_TIMEOUT_HZ;
>>>>
>>>> Although very unlikely due to the long timeout, if the code is preempted here,
>>>> and the loop below never entered, ret will indeed be uninitialized.
>>>>
>>>> It's unclear to me what the proper initialization would be, though, so
>>>> that's why I didn't send a patch.
>>>>
>>> I think it would be best to use 0 as initial value of ret in this case.
>>> This will make all other interrupts be processed in a normal way.
>>>
>>> Kalle: Should I create a new patch (initializing ret with zero)?
>>
>> Yes, please send a new patch fixing this.
>>
>> But I don't like that much with the style of initialising ret to zero,
>> it tends to hide things. Instead my preference is something like below
>> where the error handling is more explicit and easier to find where it's
>> exactly failing. But that's just an example how I would try to solve it,
>> it still lacks the handling of -ECANCEL etc.
>
> I think I would simply replace the "while() {}" loop with "do{} while()",
> as that would guarantee it to be run at least once in a way that the
> compiler can see.

Right, that's probably the simplest and cleanest solution.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

Patch
diff mbox

diff --git a/drivers/net/wireless/ath/ath10k/sdio.c b/drivers/net/wireless/ath/ath10k/sdio.c
index 859ed870bd97..19a53e577932 100644
--- a/drivers/net/wireless/ath/ath10k/sdio.c
+++ b/drivers/net/wireless/ath/ath10k/sdio.c
@@ -689,8 +689,10 @@  static int ath10k_sdio_mbox_rxmsg_pending_handler(struct ath10k *ar,
 		 */
 		ret = ath10k_sdio_mbox_rx_alloc(ar, lookaheads,
 						n_lookaheads);
-		if (ret)
-			break;
+		if (ret) {
+			ath10k_warn(ar, "failed to ....: %d", ret);
+			return ret;
+		}
 
 		if (ar_sdio->n_rx_pkts >= 2)
 			/* A recv bundle was detected, force IRQ status
@@ -709,8 +711,10 @@  static int ath10k_sdio_mbox_rxmsg_pending_handler(struct ath10k *ar,
 							  lookaheads,
 							  &n_lookaheads);
 
-		if (!n_lookaheads || ret)
-			break;
+		if (!n_lookaheads || ret) {
+			ath10k_warn(ar, "failed to ....");
+			return ret;
+		}
 
 		/* For SYNCH processing, if we get here, we are running
 		 * through the loop again due to updated lookaheads. Set
@@ -721,11 +725,7 @@  static int ath10k_sdio_mbox_rxmsg_pending_handler(struct ath10k *ar,
 		*done = false;
 	}
 
-	if (ret && (ret != -ECANCELED))
-		ath10k_warn(ar, "failed to get pending recv messages: %d\n",
-			    ret);
-
-	return ret;
+	return 0;
 }
 
 static int ath10k_sdio_mbox_proc_dbg_intr(struct ath10k *ar)