On Mon 25-07-11 08:04:41, Nikiforov Alex wrote: > On 07/22/2011 06:15 PM, Michal Hocko wrote: > > On Fri 22-07-11 09:06:59, Nikiforov Alex wrote: > >> @@ -3704,6 +3705,7 @@ int cgroup_register_unchanged_process(pid_t pid, > >> int flags) > >> int ret = 1; > >> char buff[sizeof(CGRULE_SUCCESS_STORE_PID)]; > >> struct sockaddr_un addr; > >> + struct iovec iov[2] = {}; > >> > >> sk = socket(PF_UNIX, SOCK_STREAM, 0); > >> if (sk< 0) > >> @@ -3720,10 +3722,13 @@ int cgroup_register_unchanged_process(pid_t pid, > >> int flags) > >> ret = 0; > >> goto close; > >> } > >> - if (write(sk,&pid, sizeof(pid))< 0) > >> - goto close; > >> > >> - if (write(sk,&flags, sizeof(flags))< 0) > >> + iov[0].iov_base =&pid; > >> + iov[0].iov_len = sizeof(pid); > >> + iov[1].iov_base =&flags; > >> + iov[1].iov_len = sizeof(flags); > >> + > >> + if (writev(sk, iov, 2)< 0) > >> goto close; > > > > shouldn't you check for< iov[0].iov_len + iov[1].iov_len? > > > >> > >> if (read(sk, buff, sizeof(buff))< 0) > >> diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c > >> index 2f42a57..14887bb 100644 > >> --- a/src/daemon/cgrulesengd.c > >> +++ b/src/daemon/cgrulesengd.c > >> @@ -40,6 +40,7 @@ > >> #include<stdio.h> > >> #include<stdlib.h> > >> #include<sys/socket.h> > >> +#include<sys/uio.h> > >> #include<sys/syslog.h> > >> #include<string.h> > >> #include<linux/netlink.h> > >> @@ -552,6 +553,7 @@ static void cgre_receive_unix_domain_msg(int sk_unix) > >> socklen_t caddr_len; > >> struct stat buff_stat; > >> char path[FILENAME_MAX]; > >> + struct iovec iov[2] = {}; > >> > >> caddr_len = sizeof(caddr); > >> fd_client = accept(sk_unix, (struct sockaddr > >> *)&caddr,&caddr_len); > >> @@ -559,16 +561,19 @@ static void cgre_receive_unix_domain_msg(int sk_unix) > >> cgroup_dbg("accept error: %s\n", strerror(errno)); > >> return; > >> } > >> - if (read(fd_client,&pid, sizeof(pid))< 0) { > >> - cgroup_dbg("read error: %s\n", strerror(errno)); > >> - goto close; > >> - } > >> - sprintf(path, "/proc/%d", pid); > >> - if (stat(path,&buff_stat)) { > >> - cgroup_dbg("There is not such process (PID: %d)", pid); > >> - goto close; > >> - } > >> - if (read(fd_client,&flags, sizeof(flags))< 0) { > >> + > >> + iov[0].iov_base =&pid; > >> + iov[0].iov_len = sizeof(pid); > >> + iov[1].iov_base =&flags; > >> + iov[1].iov_len = sizeof(flags); > >> + > >> + if (readv(fd_client, iov, 2)< 0) { > > > > Same here. > > 1) Dont think that's point here, we are on local iface and we write/read > just few bytes. For me it's hardly to figure that in this place we can > get EAGAIN.
The client could send just a pid number without flags you have to be defensive here as you have no guarantee that the client is behaving... You would end up with a random garbage from the stack. > BTW look at previous code, it's twice harder in syscall and > seems that you dont have any trouble with it The previous code should have checked the return value properly as well. It is not that critical, though, because both values could fit also in a single byte and still have a good meaning. In your case, you have to be sure that you have read at least one byt for iov[1] (but I think that it is much better to not be too clever and check the value you are expecting). -- Michal Hocko SUSE Labs SUSE LINUX s.r.o. Lihovarska 1060/12 190 00 Praha 9 Czech Republic ------------------------------------------------------------------------------ Storage Efficiency Calculator This modeling tool is based on patent-pending intellectual property that has been used successfully in hundreds of IBM storage optimization engage- ments, worldwide. Store less, Store more with what you own, Move data to the right place. Try It Now! http://www.accelacomm.com/jaw/sfnl/114/51427378/ _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel