Unverified Commit bdcb5a18 authored by Mike Gabriel's avatar Mike Gabriel

Merge branch 'uli42-pr/work_on_xau' into 3.6.x

parents e721ba29 c590c647
/* /*
Copyright 1988, 1998 The Open Group Copyright 1988, 1998 The Open Group
...@@ -32,13 +31,12 @@ in this Software without prior written authorization from The Open Group. ...@@ -32,13 +31,12 @@ in this Software without prior written authorization from The Open Group.
#include <stdlib.h> #include <stdlib.h>
void void
XauDisposeAuth (auth) XauDisposeAuth (Xauth *auth)
Xauth *auth;
{ {
if (auth) { if (auth) {
if (auth->address) (void) free (auth->address); free (auth->address);
if (auth->number) (void) free (auth->number); free (auth->number);
if (auth->name) (void) free (auth->name); free (auth->name);
if (auth->data) { if (auth->data) {
(void) bzero (auth->data, auth->data_length); (void) bzero (auth->data, auth->data_length);
(void) free (auth->data); (void) free (auth->data);
......
/* /*
Copyright 1988, 1998 The Open Group Copyright 1988, 1998 The Open Group
...@@ -30,44 +29,61 @@ in this Software without prior written authorization from The Open Group. ...@@ -30,44 +29,61 @@ in this Software without prior written authorization from The Open Group.
#endif #endif
#include <nx-X11/Xauth.h> #include <nx-X11/Xauth.h>
#include <nx-X11/Xos.h> #include <nx-X11/Xos.h>
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
static char *buf = NULL;
static void
free_filename_buffer(void)
{
free(buf);
buf = NULL;
}
char * char *
XauFileName () XauFileName (void)
{ {
char *slashDotXauthority = "/.Xauthority"; const char *slashDotXauthority = "/.Xauthority";
char *name; char *name;
static char *buf; static size_t bsize;
static int bsize; static int atexit_registered = 0;
#ifdef WIN32 #ifdef WIN32
char dir[128]; char dir[128];
#endif #endif
int size; size_t size;
if ((name = getenv ("XAUTHORITY"))) if ((name = getenv ("XAUTHORITY")))
return name; return name;
name = getenv ("HOME"); name = getenv ("HOME");
if (!name) { if (!name) {
#ifdef WIN32 #ifdef WIN32
(void) strcpy (dir, "/users/");
if ((name = getenv("USERNAME"))) { if ((name = getenv("USERNAME"))) {
(void) strcat (dir, name); snprintf(dir, sizeof(dir), "/users/%s", name);
name = dir; name = dir;
} }
if (!name) if (!name)
#endif #endif
return 0; return NULL;
} }
size = strlen (name) + strlen(&slashDotXauthority[1]) + 2; size = strlen (name) + strlen(&slashDotXauthority[1]) + 2;
if (size > bsize) { if ((size > bsize) || (buf == NULL)) {
if (buf)
free (buf); free (buf);
buf = malloc ((unsigned) size); assert(size > 0);
if (!buf) buf = malloc (size);
return 0; if (!buf) {
bsize = 0;
return NULL;
}
if (!atexit_registered) {
atexit(free_filename_buffer);
atexit_registered = 1;
}
bsize = size; bsize = size;
} }
strcpy (buf, name); snprintf (buf, bsize, "%s%s", name,
strcat (buf, slashDotXauthority + (name[1] == '\0' ? 1 : 0)); slashDotXauthority + (name[0] == '/' && name[1] == '\0' ? 1 : 0));
return buf; return buf;
} }
/* /*
Copyright 1988, 1998 The Open Group Copyright 1988, 1998 The Open Group
...@@ -34,14 +33,7 @@ in this Software without prior written authorization from The Open Group. ...@@ -34,14 +33,7 @@ in this Software without prior written authorization from The Open Group.
#include <nx-X11/Xthreads.h> #include <nx-X11/Xthreads.h>
#endif #endif
static int #define binaryEqual(a, b, len) (memcmp(a, b, len) == 0)
binaryEqual (_Xconst char *a, _Xconst char *b, int len)
{
while (len--)
if (*a++ != *b++)
return 0;
return 1;
}
Xauth * Xauth *
XauGetBestAuthByAddr ( XauGetBestAuthByAddr (
...@@ -72,14 +64,14 @@ XauGetBestAuthByAddr ( ...@@ -72,14 +64,14 @@ XauGetBestAuthByAddr (
auth_name = XauFileName (); auth_name = XauFileName ();
if (!auth_name) if (!auth_name)
return 0; return NULL;
if (access (auth_name, R_OK) != 0) /* checks REAL id */ if (access (auth_name, R_OK) != 0) /* checks REAL id */
return 0; return NULL;
auth_file = fopen (auth_name, "rb"); auth_file = fopen (auth_name, "rb");
if (!auth_file) if (!auth_file)
return 0; return NULL;
best = 0; best = NULL;
best_type = types_length; best_type = types_length;
for (;;) { for (;;) {
entry = XauReadAuth (auth_file); entry = XauReadAuth (auth_file);
...@@ -101,11 +93,11 @@ XauGetBestAuthByAddr ( ...@@ -101,11 +93,11 @@ XauGetBestAuthByAddr (
if ((family == FamilyWild || entry->family == FamilyWild || if ((family == FamilyWild || entry->family == FamilyWild ||
(entry->family == family && (entry->family == family &&
((address_length == entry->address_length && ((address_length == entry->address_length &&
binaryEqual (entry->address, address, (int)address_length)) binaryEqual (entry->address, address, address_length))
))) && ))) &&
(number_length == 0 || entry->number_length == 0 || (number_length == 0 || entry->number_length == 0 ||
(number_length == entry->number_length && (number_length == entry->number_length &&
binaryEqual (entry->number, number, (int)number_length)))) binaryEqual (entry->number, number, number_length))))
{ {
if (best_type == 0) if (best_type == 0)
{ {
......
...@@ -30,20 +30,23 @@ in this Software without prior written authorization from The Open Group. ...@@ -30,20 +30,23 @@ in this Software without prior written authorization from The Open Group.
#endif #endif
#include <nx-X11/Xauth.h> #include <nx-X11/Xauth.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef NX_TRANS_SOCKET
#include <errno.h> #include <errno.h>
#endif
static int static int
read_short (unsigned short *shortp, FILE *file) read_short (unsigned short *shortp, FILE *file)
{ {
unsigned char file_short[2]; unsigned char file_short[2];
#ifdef NX_TRANS_SOCKET
/* /*
* Added a check on EINTR to prevent the fread() call to be * Added a check on EINTR to prevent the fread() call to be
* interrupted by any signal not blocked by OsBlockSignals(). * interrupted by any signal not blocked by OsBlockSignals().
*/ */
for (;;) { for (;;) {
if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1) { if (fread ((char *) file_short, sizeof (file_short), 1, file) != 1) {
if (errno == EINTR && ferror (file)) { if (errno == EINTR && ferror (file)) {
perror ("Reading from auth file"); perror ("Reading from auth file");
clearerr (file); clearerr (file);
...@@ -53,6 +56,10 @@ read_short (unsigned short *shortp, FILE *file) ...@@ -53,6 +56,10 @@ read_short (unsigned short *shortp, FILE *file)
} }
break; break;
} }
#else
if (fread ((char *) file_short, sizeof (file_short), 1, file) != 1)
return 0;
#endif
*shortp = file_short[0] * 256 + file_short[1]; *shortp = file_short[0] * 256 + file_short[1];
return 1; return 1;
} }
...@@ -66,14 +73,15 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file) ...@@ -66,14 +73,15 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file)
if (read_short (&len, file) == 0) if (read_short (&len, file) == 0)
return 0; return 0;
if (len == 0) { if (len == 0) {
data = 0; data = NULL;
} else { } else {
data = malloc ((unsigned) len); data = malloc ((unsigned) len);
if (!data) if (!data)
return 0; return 0;
#ifdef NX_TRANS_SOCKET
for (;;) for (;;)
{ {
if (fread (data, (int) sizeof (char), (int) len, file) != len) if (fread (data, sizeof (char), len, file) != len)
{ {
if (errno == EINTR && ferror (file)) if (errno == EINTR && ferror (file))
{ {
...@@ -87,6 +95,13 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file) ...@@ -87,6 +95,13 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file)
} }
break; break;
} }
#else
if (fread (data, sizeof (char), len, file) != len) {
bzero (data, len);
free (data);
return 0;
}
#endif
} }
*stringp = data; *stringp = data;
*countp = len; *countp = len;
...@@ -94,41 +109,40 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file) ...@@ -94,41 +109,40 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file)
} }
Xauth * Xauth *
XauReadAuth (auth_file) XauReadAuth (FILE *auth_file)
FILE *auth_file;
{ {
Xauth local; Xauth local;
Xauth *ret; Xauth *ret;
if (read_short (&local.family, auth_file) == 0) if (read_short (&local.family, auth_file) == 0)
return 0; return NULL;
if (read_counted_string (&local.address_length, &local.address, auth_file) == 0) if (read_counted_string (&local.address_length, &local.address, auth_file) == 0)
return 0; return NULL;
if (read_counted_string (&local.number_length, &local.number, auth_file) == 0) { if (read_counted_string (&local.number_length, &local.number, auth_file) == 0) {
if (local.address) free (local.address); free (local.address);
return 0; return NULL;
} }
if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) { if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) {
if (local.address) free (local.address); free (local.address);
if (local.number) free (local.number); free (local.number);
return 0; return NULL;
} }
if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) { if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) {
if (local.address) free (local.address); free (local.address);
if (local.number) free (local.number); free (local.number);
if (local.name) free (local.name); free (local.name);
return 0; return NULL;
} }
ret = (Xauth *) malloc (sizeof (Xauth)); ret = (Xauth *) malloc (sizeof (Xauth));
if (!ret) { if (!ret) {
if (local.address) free (local.address); free (local.address);
if (local.number) free (local.number); free (local.number);
if (local.name) free (local.name); free (local.name);
if (local.data) { if (local.data) {
bzero (local.data, local.data_length); bzero (local.data, local.data_length);
free (local.data); free (local.data);
} }
return 0; return NULL;
} }
*ret = local; *ret = local;
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment