diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2019-11-01 16:21:13 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2019-11-01 16:21:13 +0100 |
commit | bdcb5a188db8f472809ca25077145516daf582d5 (patch) | |
tree | 90d2ee1bbbd5903ac7d6e9a2c908a7c410e1f09d | |
parent | e721ba296dc2a7180c2fd7aa81cd0bcd090dfd23 (diff) | |
parent | c590c64726db5c1a50640332c1383a471c24459d (diff) | |
download | nx-libs-bdcb5a188db8f472809ca25077145516daf582d5.tar.gz nx-libs-bdcb5a188db8f472809ca25077145516daf582d5.tar.bz2 nx-libs-bdcb5a188db8f472809ca25077145516daf582d5.zip |
Merge branch 'uli42-pr/work_on_xau' into 3.6.x
Attributes GH PR #851: https://github.com/ArcticaProject/nx-libs/pull/851
-rw-r--r-- | nx-X11/lib/src/AuDispose.c | 10 | ||||
-rw-r--r-- | nx-X11/lib/src/AuFileName.c | 50 | ||||
-rw-r--r-- | nx-X11/lib/src/AuGetBest.c | 22 | ||||
-rw-r--r-- | nx-X11/lib/src/AuRead.c | 80 |
4 files changed, 91 insertions, 71 deletions
diff --git a/nx-X11/lib/src/AuDispose.c b/nx-X11/lib/src/AuDispose.c index bb890201d..215401ae9 100644 --- a/nx-X11/lib/src/AuDispose.c +++ b/nx-X11/lib/src/AuDispose.c @@ -1,4 +1,3 @@ - /* Copyright 1988, 1998 The Open Group @@ -32,13 +31,12 @@ in this Software without prior written authorization from The Open Group. #include <stdlib.h> void -XauDisposeAuth (auth) -Xauth *auth; +XauDisposeAuth (Xauth *auth) { if (auth) { - if (auth->address) (void) free (auth->address); - if (auth->number) (void) free (auth->number); - if (auth->name) (void) free (auth->name); + free (auth->address); + free (auth->number); + free (auth->name); if (auth->data) { (void) bzero (auth->data, auth->data_length); (void) free (auth->data); diff --git a/nx-X11/lib/src/AuFileName.c b/nx-X11/lib/src/AuFileName.c index 6c4fb7dc3..3c6aa8bfd 100644 --- a/nx-X11/lib/src/AuFileName.c +++ b/nx-X11/lib/src/AuFileName.c @@ -1,4 +1,3 @@ - /* Copyright 1988, 1998 The Open Group @@ -30,44 +29,61 @@ in this Software without prior written authorization from The Open Group. #endif #include <nx-X11/Xauth.h> #include <nx-X11/Xos.h> +#include <assert.h> #include <stdlib.h> +static char *buf = NULL; + +static void +free_filename_buffer(void) +{ + free(buf); + buf = NULL; +} + char * -XauFileName () +XauFileName (void) { - char *slashDotXauthority = "/.Xauthority"; + const char *slashDotXauthority = "/.Xauthority"; char *name; - static char *buf; - static int bsize; + static size_t bsize; + static int atexit_registered = 0; #ifdef WIN32 char dir[128]; #endif - int size; + size_t size; if ((name = getenv ("XAUTHORITY"))) return name; name = getenv ("HOME"); if (!name) { #ifdef WIN32 - (void) strcpy (dir, "/users/"); if ((name = getenv("USERNAME"))) { - (void) strcat (dir, name); + snprintf(dir, sizeof(dir), "/users/%s", name); name = dir; } if (!name) #endif - return 0; + return NULL; } size = strlen (name) + strlen(&slashDotXauthority[1]) + 2; - if (size > bsize) { - if (buf) - free (buf); - buf = malloc ((unsigned) size); - if (!buf) - return 0; + if ((size > bsize) || (buf == NULL)) { + free (buf); + assert(size > 0); + buf = malloc (size); + if (!buf) { + bsize = 0; + return NULL; + } + + if (!atexit_registered) { + atexit(free_filename_buffer); + atexit_registered = 1; + } + bsize = size; } - strcpy (buf, name); - strcat (buf, slashDotXauthority + (name[1] == '\0' ? 1 : 0)); + snprintf (buf, bsize, "%s%s", name, + slashDotXauthority + (name[0] == '/' && name[1] == '\0' ? 1 : 0)); return buf; } diff --git a/nx-X11/lib/src/AuGetBest.c b/nx-X11/lib/src/AuGetBest.c index 2518805cc..3e0231b13 100644 --- a/nx-X11/lib/src/AuGetBest.c +++ b/nx-X11/lib/src/AuGetBest.c @@ -1,4 +1,3 @@ - /* Copyright 1988, 1998 The Open Group @@ -34,14 +33,7 @@ in this Software without prior written authorization from The Open Group. #include <nx-X11/Xthreads.h> #endif -static int -binaryEqual (_Xconst char *a, _Xconst char *b, int len) -{ - while (len--) - if (*a++ != *b++) - return 0; - return 1; -} +#define binaryEqual(a, b, len) (memcmp(a, b, len) == 0) Xauth * XauGetBestAuthByAddr ( @@ -72,14 +64,14 @@ XauGetBestAuthByAddr ( auth_name = XauFileName (); if (!auth_name) - return 0; + return NULL; if (access (auth_name, R_OK) != 0) /* checks REAL id */ - return 0; + return NULL; auth_file = fopen (auth_name, "rb"); if (!auth_file) - return 0; + return NULL; - best = 0; + best = NULL; best_type = types_length; for (;;) { entry = XauReadAuth (auth_file); @@ -101,11 +93,11 @@ XauGetBestAuthByAddr ( if ((family == FamilyWild || entry->family == FamilyWild || (entry->family == family && ((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 == entry->number_length && - binaryEqual (entry->number, number, (int)number_length)))) + binaryEqual (entry->number, number, number_length)))) { if (best_type == 0) { diff --git a/nx-X11/lib/src/AuRead.c b/nx-X11/lib/src/AuRead.c index 61814792d..2e21cf0a5 100644 --- a/nx-X11/lib/src/AuRead.c +++ b/nx-X11/lib/src/AuRead.c @@ -30,20 +30,23 @@ in this Software without prior written authorization from The Open Group. #endif #include <nx-X11/Xauth.h> #include <stdlib.h> +#ifdef NX_TRANS_SOCKET #include <errno.h> +#endif static int read_short (unsigned short *shortp, FILE *file) { unsigned char file_short[2]; +#ifdef NX_TRANS_SOCKET /* * Added a check on EINTR to prevent the fread() call to be * interrupted by any signal not blocked by OsBlockSignals(). */ 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)) { perror ("Reading from auth file"); clearerr (file); @@ -53,6 +56,10 @@ read_short (unsigned short *shortp, FILE *file) } break; } +#else + if (fread ((char *) file_short, sizeof (file_short), 1, file) != 1) + return 0; +#endif *shortp = file_short[0] * 256 + file_short[1]; return 1; } @@ -61,19 +68,20 @@ static int read_counted_string (unsigned short *countp, char **stringp, FILE *file) { unsigned short len; - char *data; + char *data; if (read_short (&len, file) == 0) - return 0; + return 0; if (len == 0) { - data = 0; + data = NULL; } else { - data = malloc ((unsigned) len); - if (!data) - return 0; + data = malloc ((unsigned) len); + if (!data) + return 0; +#ifdef NX_TRANS_SOCKET for (;;) { - if (fread (data, (int) sizeof (char), (int) len, file) != len) + if (fread (data, sizeof (char), len, file) != len) { if (errno == EINTR && ferror (file)) { @@ -81,12 +89,19 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file) clearerr (file); continue; } - bzero (data, len); - free (data); - return 0; - } + bzero (data, len); + free (data); + return 0; + } break; } +#else + if (fread (data, sizeof (char), len, file) != len) { + bzero (data, len); + free (data); + return 0; + } +#endif } *stringp = data; *countp = len; @@ -94,41 +109,40 @@ read_counted_string (unsigned short *countp, char **stringp, FILE *file) } Xauth * -XauReadAuth (auth_file) -FILE *auth_file; +XauReadAuth (FILE *auth_file) { Xauth local; Xauth *ret; if (read_short (&local.family, auth_file) == 0) - return 0; + return NULL; 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 (local.address) free (local.address); - return 0; + free (local.address); + return NULL; } if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) { - if (local.address) free (local.address); - if (local.number) free (local.number); - return 0; + free (local.address); + free (local.number); + return NULL; } if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) { - if (local.address) free (local.address); - if (local.number) free (local.number); - if (local.name) free (local.name); - return 0; + free (local.address); + free (local.number); + free (local.name); + return NULL; } ret = (Xauth *) malloc (sizeof (Xauth)); if (!ret) { - if (local.address) free (local.address); - if (local.number) free (local.number); - if (local.name) free (local.name); - if (local.data) { - bzero (local.data, local.data_length); - free (local.data); - } - return 0; + free (local.address); + free (local.number); + free (local.name); + if (local.data) { + bzero (local.data, local.data_length); + free (local.data); + } + return NULL; } *ret = local; return ret; |