From 722f4e684a80587a72b9d958b487db3cd33872bc Mon Sep 17 00:00:00 2001 From: "Andrew V. Samoilov" Date: Sun, 7 Mar 2004 06:17:12 +0000 Subject: [PATCH] * utilvfs.c (vfs_parse_ls_lga): Handle device without whitespace(s) between major and minor. --- vfs/ChangeLog | 3 +++ vfs/utilvfs.c | 15 ++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/vfs/ChangeLog b/vfs/ChangeLog index 20a618960..a7085168f 100644 --- a/vfs/ChangeLog +++ b/vfs/ChangeLog @@ -1,5 +1,8 @@ 2004-03-07 Andrew V. Samoilov + * utilvfs.c (vfs_parse_ls_lga): Handle device without whitespace(s) + between major and minor. + * direntry.c (vfs_s_resolve_symlink): Check vfs_s_fullpath() return value to avoid NULL dereference. Reported by wwp . diff --git a/vfs/utilvfs.c b/vfs/utilvfs.c index b05b0246e..c470be627 100644 --- a/vfs/utilvfs.c +++ b/vfs/utilvfs.c @@ -748,12 +748,17 @@ vfs_parse_ls_lga (const char *p, struct stat *s, char **filename, if (S_ISCHR (s->st_mode) || S_ISBLK (s->st_mode)) { int maj, min; - if (!is_num (idx2) || sscanf (columns[idx2], " %d,", &maj) != 1) - goto error; - - if (!is_num (++idx2) || sscanf (columns[idx2], " %d", &min) != 1) - goto error; + /* Corner case: there is no whitespace(s) between maj & min */ + if (!is_num (idx2) && idx2 == 2) { + if (!is_num (++idx2) || sscanf (columns[idx2], " %d,%d", &min, &min) != 2) + goto error; + } else { + if (!is_num (idx2) || sscanf (columns[idx2], " %d,", &maj) != 1) + goto error; + if (!is_num (++idx2) || sscanf (columns[idx2], " %d", &min) != 1) + goto error; + } #ifdef HAVE_STRUCT_STAT_ST_RDEV s->st_rdev = ((maj & 0xff) << 8) | (min & 0xffff00ff); #endif