misc/143350: pointer comparison against '\0' in strfmon.c
Corinna Vinschen
corinna at vinschen.de
Fri Jan 29 19:40:11 UTC 2010
>Number: 143350
>Category: misc
>Synopsis: pointer comparison against '\0' in strfmon.c
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jan 29 19:40:09 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Corinna Vinschen
>Release: CVS HEAD
>Organization:
Cygwin
>Environment:
>Description:
There appears to be a bug in strfom.c, function __setup_vars.
When the value for the negative sign string is fetched, there
are two comparisons of the following style:
*signstr = (lc->negative_sign == '\0') ? "-"
: lc->negative_sign;
lc->negative_sign is a string pointer. The above statement
compares the pointer against '\0'. This looks like a typo.
Actually the comparison should check if the first character
in lc->negative_sign is \0, or better, if lc->negative_sign
is an empty string. A check for NULL doesn't make sense
since localeconv never returns NULL pointers as struct lconv
members.
So I think the patch below should be the right way to go.
Corinna
>How-To-Repeat:
>Fix:
Index: strfmon.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/stdlib/strfmon.c,v
retrieving revision 1.19
diff -u -p -r1.19 strfmon.c
--- strfmon.c 24 Apr 2008 07:49:00 -0000 1.19
+++ strfmon.c 29 Jan 2010 19:23:39 -0000
@@ -413,7 +413,7 @@ __setup_vars(int flags, char *cs_precede
*cs_precedes = lc->int_n_cs_precedes;
*sep_by_space = lc->int_n_sep_by_space;
*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->int_n_sign_posn;
- *signstr = (lc->negative_sign == '\0') ? "-"
+ *signstr = (*lc->negative_sign == '\0') ? "-"
: lc->negative_sign;
} else if (flags & USE_INTL_CURRENCY) {
*cs_precedes = lc->int_p_cs_precedes;
@@ -424,7 +424,7 @@ __setup_vars(int flags, char *cs_precede
*cs_precedes = lc->n_cs_precedes;
*sep_by_space = lc->n_sep_by_space;
*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->n_sign_posn;
- *signstr = (lc->negative_sign == '\0') ? "-"
+ *signstr = (*lc->negative_sign == '\0') ? "-"
: lc->negative_sign;
} else {
*cs_precedes = lc->p_cs_precedes;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list