chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
util_create_path(): fix possible out of bounds array access
[elogind.git]
/
libudev
/
libudev-util-private.c
diff --git
a/libudev/libudev-util-private.c
b/libudev/libudev-util-private.c
index 5b5ecb1f503c788550b423e7722b6af223e4d6b6..fe8f29b3a89007e20b595a73693644e4b18484ca 100644
(file)
--- a/
libudev/libudev-util-private.c
+++ b/
libudev/libudev-util-private.c
@@
-30,15
+30,16
@@
int util_create_path(struct udev *udev, const char *path)
char p[UTIL_PATH_SIZE];
char *pos;
struct stat stats;
char p[UTIL_PATH_SIZE];
char *pos;
struct stat stats;
- int
ret
;
+ int
err
;
util_strscpy(p, sizeof(p), path);
pos = strrchr(p, '/');
util_strscpy(p, sizeof(p), path);
pos = strrchr(p, '/');
- if (pos ==
p || pos ==
NULL)
+ if (pos == NULL)
return 0;
return 0;
-
- while (pos[-1] == '/')
+ while (pos != p && pos[-1] == '/')
pos--;
pos--;
+ if (pos == p)
+ return 0;
pos[0] = '\0';
dbg(udev, "stat '%s'\n", p);
pos[0] = '\0';
dbg(udev, "stat '%s'\n", p);
@@
-50,15
+51,12
@@
int util_create_path(struct udev *udev, const char *path)
dbg(udev, "mkdir '%s'\n", p);
udev_selinux_setfscreatecon(udev, p, S_IFDIR|0755);
dbg(udev, "mkdir '%s'\n", p);
udev_selinux_setfscreatecon(udev, p, S_IFDIR|0755);
- ret = mkdir(p, 0755);
- udev_selinux_resetfscreatecon(udev);
- if (ret == 0)
- return 0;
-
- if (errno == EEXIST)
+ err = mkdir(p, 0755);
+ if (err != 0 && errno == EEXIST)
if (stat(p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
if (stat(p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
- return 0;
- return -1;
+ err = 0;
+ udev_selinux_resetfscreatecon(udev);
+ return err;
}
int util_delete_path(struct udev *udev, const char *path)
}
int util_delete_path(struct udev *udev, const char *path)
@@
-67,6
+65,9
@@
int util_delete_path(struct udev *udev, const char *path)
char *pos;
int retval;
char *pos;
int retval;
+ if (path[0] == '/')
+ while(path[1] == '/')
+ path++;
util_strscpy(p, sizeof(p), path);
pos = strrchr(p, '/');
if (pos == p || pos == NULL)
util_strscpy(p, sizeof(p), path);
pos = strrchr(p, '/');
if (pos == p || pos == NULL)
@@
-154,9
+155,12
@@
gid_t util_lookup_group(struct udev *udev, const char *group)
buf = NULL;
gid = 0;
for (;;) {
buf = NULL;
gid = 0;
for (;;) {
- buf = realloc(buf, buflen);
- if (!buf)
+ char *newbuf;
+
+ newbuf = realloc(buf, buflen);
+ if (!newbuf)
break;
break;
+ buf = newbuf;
errno = getgrnam_r(group, &grbuf, buf, buflen, &gr);
if (gr != NULL) {
gid = gr->gr_gid;
errno = getgrnam_r(group, &grbuf, buf, buflen, &gr);
if (gr != NULL) {
gid = gr->gr_gid;