Commit dd871fa0 by Christian Brauner Committed by GitHub

Merge pull request #1720 from hallyn/2017-07-29/cg

Fix some bugs in #1719
parents 1135b35b 2c2d6c49
......@@ -1904,11 +1904,10 @@ static int cgfsng_set(const char *filename, const char *value, const char *name,
*/
static int convert_devpath(const char *invalue, char *dest)
{
char *p, *path, *mode, type = 0;
char *p, *path, *mode, type;
struct stat sb;
unsigned long minor, major;
int n_parts, ret;
dev_t dev;
int n_parts, ret = -EINVAL;
path = must_copy_string(invalue);
......@@ -1918,25 +1917,27 @@ static int convert_devpath(const char *invalue, char *dest)
* is not legal, we could check for that if we cared to
*/
for (n_parts = 1, p = path; *p && n_parts < 3; p++) {
if (*p == ' ') {
if (*p != ' ')
continue;
*p = '\0';
mode = p + 1;
if (n_parts != 1)
break;
p++;
n_parts++;
while (*p == ' ')
p++;
}
}
if (n_parts == 1) {
ret = -EINVAL;
mode = p;
if (*p == '\0')
goto out;
}
if (n_parts == 1)
goto out;
ret = stat(path, &sb);
if (ret < 0)
goto out;
dev = sb.st_rdev;
mode_t m = sb.st_mode & S_IFMT;
switch (m) {
case S_IFBLK:
......@@ -1945,16 +1946,15 @@ static int convert_devpath(const char *invalue, char *dest)
case S_IFCHR:
type = 'c';
break;
}
if (type == 0) {
default:
ERROR("Unsupported device type %i for %s", m, path);
ret = -EINVAL;
goto out;
}
major = MAJOR(dev), minor = MINOR(dev);
ret = snprintf(dest, 50,
"%c %lu:%lu %s", type, major, minor, mode);
major = MAJOR(sb.st_rdev);
minor = MINOR(sb.st_rdev);
ret = snprintf(dest, 50, "%c %lu:%lu %s", type, major, minor, mode);
if (ret < 0 || ret >= 50) {
ERROR("Error on configuration value \"%c %lu:%lu %s\" (max 50 chars)",
type, major, minor, mode);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment