(create_and_write_cookie): try to return better (and correct) errors.
Based on a patch from Love <lha@e.kth.se> git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6154 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -50,6 +50,12 @@ int xauthfile_size = sizeof(xauthfile);
|
||||
u_char cookie[16];
|
||||
size_t cookie_len = sizeof(cookie);
|
||||
|
||||
/*
|
||||
* Copy data from `fd1' to `fd2', {en,de}crypting with cfb64
|
||||
* with `mode' and state stored in `iv', `schedule', and `num'.
|
||||
* Return -1 if error, 0 if eof, else 1
|
||||
*/
|
||||
|
||||
static int
|
||||
do_enccopy (int fd1, int fd2, int mode, des_cblock *iv,
|
||||
des_key_schedule schedule, int *num)
|
||||
@@ -82,8 +88,8 @@ do_enccopy (int fd1, int fd2, int mode, des_cblock *iv,
|
||||
*/
|
||||
|
||||
int
|
||||
copy_encrypted (int fd1, int fd2, des_cblock *iv,
|
||||
des_key_schedule schedule)
|
||||
copy_encrypted (int fd1, int fd2,
|
||||
des_cblock *iv, des_key_schedule schedule)
|
||||
{
|
||||
des_cblock iv1, iv2;
|
||||
int num1 = 0, num2 = 0;
|
||||
@@ -223,6 +229,14 @@ try_pipe (struct x_socket *s, int dpy, const char *pattern)
|
||||
}
|
||||
#endif /* MAY_HAVE_X11_PIPES */
|
||||
|
||||
/*
|
||||
* Try to create a TCP socket in `s' corresponding to display `dpy'.
|
||||
*
|
||||
* 0 if all is OK
|
||||
* -1 if bind failed badly
|
||||
* 1 if dpy is already used
|
||||
*/
|
||||
|
||||
static int
|
||||
try_tcp (struct x_socket *s, int dpy)
|
||||
{
|
||||
@@ -279,6 +293,10 @@ NULL
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Create the directory corresponding to `path' or fail.
|
||||
*/
|
||||
|
||||
static void
|
||||
try_mkdir (const char *path)
|
||||
{
|
||||
@@ -298,6 +316,14 @@ try_mkdir (const char *path)
|
||||
free (dir);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a display, returning the number of sockets in `number' and
|
||||
* all the corresponding sockets in `sockets'. If `tcp_socket' is
|
||||
* true, also allcoaet a TCP socket.
|
||||
*
|
||||
* The return value is the display allocated or -1 if an error occurred.
|
||||
*/
|
||||
|
||||
int
|
||||
get_xsockets (int *number, struct x_socket **sockets, int tcp_socket)
|
||||
{
|
||||
@@ -382,7 +408,8 @@ get_xsockets (int *number, struct x_socket **sockets, int tcp_socket)
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Change owner on the `n' sockets in `sockets' to `uid', `gid'.
|
||||
* Return 0 is succesful or -1 if an error occurred.
|
||||
*/
|
||||
|
||||
int
|
||||
@@ -398,7 +425,8 @@ chown_xsockets (int n, struct x_socket *sockets, uid_t uid, gid_t gid)
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Connect to local display `dnr' with local transport.
|
||||
* Return a file descriptor.
|
||||
*/
|
||||
|
||||
int
|
||||
@@ -421,11 +449,18 @@ connect_local_xsocket (unsigned dnr)
|
||||
err (1, "connecting to local display %u", dnr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a cookie file with a random cookie for the localhost. The
|
||||
* file name will be stored in `xauthfile' (but not larger than
|
||||
* `xauthfile_size'), and the cookie returned in `cookie', `cookie_sz'.
|
||||
* Return 0 if succesful, or errno.
|
||||
*/
|
||||
|
||||
int
|
||||
create_and_write_cookie (char *xauthfile,
|
||||
size_t size,
|
||||
size_t xauthfile_size,
|
||||
u_char *cookie,
|
||||
size_t sz)
|
||||
size_t cookie_sz)
|
||||
{
|
||||
Xauth auth;
|
||||
char tmp[64];
|
||||
@@ -433,7 +468,7 @@ create_and_write_cookie (char *xauthfile,
|
||||
FILE *f;
|
||||
char hostname[MaxHostNameLen];
|
||||
struct in_addr loopback;
|
||||
struct hostent *h;
|
||||
int saved_errno;
|
||||
|
||||
gethostname (hostname, sizeof(hostname));
|
||||
loopback.s_addr = htonl(INADDR_LOOPBACK);
|
||||
@@ -446,30 +481,27 @@ create_and_write_cookie (char *xauthfile,
|
||||
auth.number = tmp;
|
||||
auth.name = COOKIE_TYPE;
|
||||
auth.name_length = strlen(auth.name);
|
||||
auth.data_length = sz;
|
||||
auth.data_length = cookie_sz;
|
||||
auth.data = (char*)cookie;
|
||||
des_rand_data (cookie, sz);
|
||||
des_rand_data (cookie, cookie_sz);
|
||||
|
||||
strcpy_truncate(xauthfile, "/tmp/AXXXXXX", size);
|
||||
strcpy_truncate(xauthfile, "/tmp/AXXXXXX", xauthfile_size);
|
||||
fd = mkstemp(xauthfile);
|
||||
if(fd < 0) {
|
||||
saved_errno = errno;
|
||||
syslog(LOG_ERR, "create_and_write_cookie: mkstemp: %m");
|
||||
return 1;
|
||||
return saved_errno;
|
||||
}
|
||||
f = fdopen(fd, "r+");
|
||||
if(f == NULL){
|
||||
saved_errno = errno;
|
||||
close(fd);
|
||||
return 1;
|
||||
return errno;
|
||||
}
|
||||
if(XauWriteAuth(f, &auth) == 0) {
|
||||
fclose(f);
|
||||
return 1;
|
||||
}
|
||||
|
||||
h = gethostbyname (hostname);
|
||||
if (h == NULL) {
|
||||
fclose (f);
|
||||
return 1;
|
||||
saved_errno = errno;
|
||||
fclose(f);
|
||||
return saved_errno;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -487,12 +519,13 @@ create_and_write_cookie (char *xauthfile,
|
||||
#endif
|
||||
|
||||
if (XauWriteAuth(f, &auth) == 0) {
|
||||
fclose (f);
|
||||
return 1;
|
||||
saved_errno = errno;
|
||||
fclose (f);
|
||||
return saved_errno;
|
||||
}
|
||||
|
||||
if(fclose(f))
|
||||
return 1;
|
||||
return errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user