1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-28 09:49:30 +03:00

r698: Now wb pipe is non-blocking remember to read in non-blocking mode...

Jeremy.
(This used to be commit 3399727864)
This commit is contained in:
Jeremy Allison
2004-05-13 18:37:54 +00:00
committed by Gerald (Jerry) Carter
parent 0f462790a3
commit 8fd6298df0
2 changed files with 53 additions and 14 deletions

View File

@ -410,25 +410,58 @@ int write_sock(void *buffer, int count)
static int read_sock(void *buffer, int count)
{
int result = 0, nread = 0;
int total_time = 0, selret;
/* Read data from socket */
while(nread < count) {
struct timeval tv;
fd_set r_fds;
result = read(winbindd_fd, (char *)buffer + nread,
count - nread);
if ((result == -1) || (result == 0)) {
/* Read failed. I think the only useful thing we
can do here is just return -1 and fail since the
transaction has failed half way through. */
/* Catch pipe close on other end by checking if a read()
call would not block by calling select(). */
FD_ZERO(&r_fds);
FD_SET(winbindd_fd, &r_fds);
ZERO_STRUCT(tv);
/* Wait for 5 seconds for a reply. May need to parameterise this... */
tv.tv_sec = 5;
if ((selret = select(winbindd_fd + 1, &r_fds, NULL, NULL, &tv)) == -1) {
close_sock();
return -1;
return -1; /* Select error */
}
nread += result;
if (selret == 0) {
/* Not ready for read yet... */
if (total_time >= 30) {
/* Timeout */
close_sock();
return -1;
}
total_time += 5;
continue;
}
if (FD_ISSET(winbindd_fd, &r_fds)) {
/* Do the Read */
result = read(winbindd_fd, (char *)buffer + nread,
count - nread);
if ((result == -1) || (result == 0)) {
/* Read failed. I think the only useful thing we
can do here is just return -1 and fail since the
transaction has failed half way through. */
close_sock();
return -1;
}
nread += result;
}
}
return result;

View File

@ -3506,12 +3506,17 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
srvstr_pull(inbuf, link_target, pdata, sizeof(link_target), -1, STR_TERMINATE);
/* !widelinks forces the target path to be within the share. */
/* This means we can interpret the target as a pathname. */
if (!lp_widelinks(SNUM(conn))) {
pstring rel_name;
char *last_dirp = NULL;
unix_format(link_target);
srvstr_get_path(inbuf, link_target, pdata, sizeof(link_target),
-1, STR_TERMINATE, &status);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
unix_convert(link_target,conn,0,&bad_path,&sbuf);
pstrcpy(rel_name, newname);
last_dirp = strrchr_m(rel_name, '/');
if (last_dirp) {
@ -3520,6 +3525,7 @@ size = %.0f, uid = %u, gid = %u, raw perms = 0%o\n",
pstrcpy(rel_name, "./");
}
pstrcat(rel_name, link_target);
if (ensure_link_is_safe(conn, rel_name) != 0) {
return(UNIXERROR(ERRDOS,ERRnoaccess));
}