I noticed some use of undefined behavior of ctype macros (not all platforms guarantee that isxxx(char) produces sane results, when the high bit is set). Also, is there any reason that src/Makefile.in is stored in git, but not the toplevel Makefile.in?
From: Eric Blake <[email protected]> Date: Fri, 8 May 2009 09:36:28 -0600 Subject: [PATCH] avoid undefined behavior * src/xheader.c (xheader_set_keyword_equal): Pass correct type to ctype macros. * src/transform.c (run_case_conv): Likewise. Signed-off-by: Eric Blake <[email protected]> --- src/transform.c | 9 ++++----- src/xheader.c | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/transform.c b/src/transform.c index 2e0de31..03c06f6 100644 --- a/src/transform.c +++ b/src/transform.c @@ -430,21 +430,21 @@ run_case_conv (enum case_ctl_type case_ctl, char *ptr, size_t size) switch (case_ctl) { case ctl_upcase_next: - case_ctl_buffer[0] = toupper (case_ctl_buffer[0]); + case_ctl_buffer[0] = toupper ((unsigned char) case_ctl_buffer[0]); break; case ctl_locase_next: - case_ctl_buffer[0] = tolower (case_ctl_buffer[0]); + case_ctl_buffer[0] = tolower ((unsigned char) case_ctl_buffer[0]); break; case ctl_upcase: for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++) - *p = toupper (*p); + *p = toupper ((unsigned char) *p); break; case ctl_locase: for (p = case_ctl_buffer; p < case_ctl_buffer + size; p++) - *p = tolower (*p); + *p = tolower ((unsigned char) *p); break; case ctl_stop: @@ -628,4 +628,3 @@ transform_name (char **pinput, int type) { return transform_name_fp (pinput, type, NULL, NULL); } - diff --git a/src/xheader.c b/src/xheader.c index 919ecd3..84ae08b 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -1,6 +1,6 @@ /* POSIX extended headers for tar. - Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -168,12 +168,12 @@ xheader_set_keyword_equal (char *kw, char *eq) global = false; } - while (p > kw && isspace (*p)) + while (p > kw && isspace ((unsigned char) *p)) p--; *p = 0; - for (p = eq + 1; *p && isspace (*p); p++) + for (p = eq + 1; *p && isspace ((unsigned char) *p); p++) ; if (strcmp (kw, "delete") == 0) -- 1.6.2.4
