aboutsummaryrefslogtreecommitdiff
path: root/src/xz/args.c
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2009-06-24 13:01:59 +0300
committerLasse Collin <lasse.collin@tukaani.org>2009-06-24 13:01:59 +0300
commitae82dde5d9cc60c80cc89601b6c51cc1611d48e7 (patch)
tree1eff9d50516a738243f2bd334ca7475ac42c4104 /src/xz/args.c
parentA few more spelling fixes. Released the .xz spec 1.0.3. (diff)
downloadxz-ae82dde5d9cc60c80cc89601b6c51cc1611d48e7.tar.xz
Cast a char argument to isspace() to unsigned char.
Diffstat (limited to '')
-rw-r--r--src/xz/args.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/xz/args.c b/src/xz/args.c
index 57f34823..97b22448 100644
--- a/src/xz/args.c
+++ b/src/xz/args.c
@@ -374,7 +374,14 @@ parse_environment(args_info *args, char *argv0)
int argc = 1;
bool prev_was_space = true;
for (size_t i = 0; env[i] != '\0'; ++i) {
- if (isspace(env[i])) {
+ // NOTE: Cast to unsigned char is needed so that correct
+ // value gets passed to isspace(), which expects
+ // unsigned char cast to int. Casting to int is done
+ // automatically due to integer promotion, but we need to
+ // force char to unsigned char manually. Otherwise 8-bit
+ // characters would get promoted to wrong value if
+ // char is signed.
+ if (isspace((unsigned char)env[i])) {
prev_was_space = true;
} else if (prev_was_space) {
prev_was_space = false;
@@ -399,7 +406,7 @@ parse_environment(args_info *args, char *argv0)
argc = 1;
prev_was_space = true;
for (size_t i = 0; env[i] != '\0'; ++i) {
- if (isspace(env[i])) {
+ if (isspace((unsigned char)env[i])) {
prev_was_space = true;
env[i] = '\0';
} else if (prev_was_space) {