[PATCH] Bugfix: zeroing errno before strtol is mandatory

6 views
Skip to first unread message

Andreas J. Reichel

unread,
Oct 20, 2017, 7:12:47 AM10/20/17
to efibootg...@googlegroups.com, Andreas Reichel
From: Andreas Reichel <andreas.r...@siemens.com>

If errno is not set to zero before strtol is called, one cannot
distinguish between a successful conversion of "0" and a real error,
because errno might have already been set before the call to strtol but
strtol itself does not set errno to zero.

Signed-off-by: Andreas Reichel <andreas.r...@siemens.com>
---
env/env_api_fat.c | 3 +++
tools/bg_setenv.c | 2 ++
2 files changed, 5 insertions(+)

diff --git a/env/env_api_fat.c b/env/env_api_fat.c
index 851b70c..653d3f8 100644
--- a/env/env_api_fat.c
+++ b/env/env_api_fat.c
@@ -552,6 +552,7 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
}
switch (e) {
case EBGENV_REVISION:
+ errno = 0;
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
@@ -569,6 +570,7 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
str8to16(env->data->kernelparams, value);
break;
case EBGENV_WATCHDOG_TIMEOUT_SEC:
+ errno = 0;
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
@@ -580,6 +582,7 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
env->data->watchdog_timeout_sec = val;
break;
case EBGENV_USTATE:
+ errno = 0;
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
diff --git a/tools/bg_setenv.c b/tools/bg_setenv.c
index 3afcc9f..8aa6668 100644
--- a/tools/bg_setenv.c
+++ b/tools/bg_setenv.c
@@ -244,6 +244,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
(uint8_t *)arg, strlen(arg) + 1);
break;
case 'p':
+ errno = 0;
i = strtol(arg, &tmp, 10);
if ((errno == ERANGE && (i == LONG_MAX || i == LONG_MIN)) ||
(errno != 0 && i == 0) || (tmp == arg)) {
@@ -262,6 +263,7 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
}
break;
case 's':
+ errno = 0;
i = strtol(arg, &tmp, 10);
if ((errno == ERANGE && (i == LONG_MAX || i == LONG_MIN)) ||
(errno != 0 && i == 0) || (tmp == arg)) {
--
2.14.2

Andreas Reichel

unread,
Nov 2, 2017, 7:55:02 AM11/2/17
to efibootg...@googlegroups.com, jan.k...@siemens.com
On Fri, Oct 20, 2017 at 01:11:51PM +0200, Andreas J. Reichel wrote:
Can we please apply this patch now? [ This is 3/3 ]
--
Andreas Reichel
Dipl.-Phys. (Univ.)
Software Consultant

Andreas...@tngtech.com, +49-174-3180074
TNG Technology Consulting GmbH, Betastr. 13a, 85774 Unterfoehring
Geschaeftsfuehrer: Henrik Klagges, Dr. Robert Dahlke, Gerhard Mueller
Sitz: Unterfoehring * Amtsgericht Muenchen * HRB 135082

Jan Kiszka

unread,
Nov 2, 2017, 8:41:52 AM11/2/17
to Andreas Reichel, efibootg...@googlegroups.com
On 2017-11-02 12:54, Andreas Reichel wrote:
> On Fri, Oct 20, 2017 at 01:11:51PM +0200, Andreas J. Reichel wrote:
> Can we please apply this patch now? [ This is 3/3 ]
>

Thanks, also applied to next.

Jan
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux
Reply all
Reply to author
Forward
0 new messages