X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvserver-stat.c;h=dee9d7705aae8d8fc56ece3ceaf02e58bb6d4526;hb=cd841ad88a1deb62271fff26455c4c2bbd23c6e0;hp=101b916984f68cca384a0a023fa12538f0a958ef;hpb=a923f0462d73c4f46c639b8ec4eb86e189047586;p=util-vserver.git diff --git a/src/vserver-stat.c b/src/vserver-stat.c index 101b916..dee9d77 100644 --- a/src/vserver-stat.c +++ b/src/vserver-stat.c @@ -308,6 +308,7 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) ssize_t cgroup_len; unsigned long long rss; char *endptr; + size_t len; if (vc_virt_stat(xid, &vstat) == -1) { perror("vc_virt_stat()"); @@ -338,14 +339,33 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) cgroup[cgroup_len] = 0; } - snprintf(filename, sizeof(filename), "%s/cgroup/name", vhi_name); + len = strlen(vhi_name); + if ((len + sizeof("/cgroup/name")) >= sizeof(filename)) { + WRITE_MSG(2, "too long context name: "); + WRITE_STR(2, vhi_name); + WRITE_MSG(2, "\n"); + return; + } + strcpy(filename, vhi_name); + strcpy(filename + len, "/cgroup/name"); + if ((fd = open(filename, O_RDONLY)) == -1) { char *dir = strrchr(vhi_name, '/'); if (dir == NULL) { - fprintf(stderr, "invalid context name: %s\n", dir); + WRITE_MSG(2, "invalid context name: "); + WRITE_STR(2, dir); + WRITE_MSG(2, "\n"); + return; + } + len = strlen(dir); + if ((len + cgroup_len) >= sizeof(cgroup)) { + WRITE_MSG(2, "cgroup name too long: "); + WRITE_STR(2, dir); + WRITE_MSG(2, "\n"); return; } - snprintf(cgroup + cgroup_len, sizeof(cgroup) - cgroup_len, "%s", dir); + strcpy(cgroup + cgroup_len, dir); + cgroup_len += len; } else { ssize_t ret; @@ -354,10 +374,19 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) perror("read(cgroup/name)"); return; } + cgroup_len += ret; close(fd); } - snprintf(filename, sizeof(filename), "%s/memory.usage_in_bytes", cgroup); + if ((cgroup_len + sizeof("/memory.usage_in_bytes")) > sizeof(filename)) { + WRITE_MSG(2, "cgroup name too long: "); + WRITE_STR(2, cgroup); + WRITE_MSG(2, "\n"); + return; + } + strcpy(filename, cgroup); + strcpy(filename + cgroup_len, "/memory.usage_in_bytes"); + if ((fd = open(filename, O_RDONLY)) == -1) { perror("open(memory.usage_in_bytes)"); return; @@ -733,7 +762,7 @@ int main(int argc, char **argv) Vector_init(&xid_data, sizeof(struct XidData)); - if (vc_isSupported(vcFEATURE_VSTAT) && !vc_isSupported(vcFEATURE_MEMCG)) { + if (vc_isSupported(vcFEATURE_VSTAT)) { unsigned long xid; Echdir(PROC_VIRT_DIR_NAME); proc_dir = Eopendir(".");