cb3487157b
http://www.kde.org/info/security/advisory-20040811-1.txt http://www.kde.org/info/security/advisory-20040811-2.txt http://www.kde.org/info/security/advisory-20040811-3.txt ok naddy@
183 lines
4.5 KiB
Plaintext
183 lines
4.5 KiB
Plaintext
$OpenBSD: patch-dcop_dcopserver_cpp,v 1.1 2004/08/14 18:03:47 brad Exp $
|
|
--- dcop/dcopserver.cpp.orig Sun May 30 08:23:44 2004
|
|
+++ dcop/dcopserver.cpp Fri Aug 13 16:04:38 2004
|
|
@@ -443,35 +443,78 @@ write_iceauth (FILE *addfp, IceAuthDataE
|
|
fprintf (addfp, "\n");
|
|
}
|
|
|
|
+#ifndef HAVE_MKSTEMPS
|
|
+#include <string.h>
|
|
+#include <strings.h>
|
|
|
|
-#ifndef HAVE_MKSTEMP
|
|
-static char *unique_filename (const char *path, const char *prefix)
|
|
-#else
|
|
-static char *unique_filename (const char *path, const char *prefix, int *pFd)
|
|
-#endif
|
|
+/* this is based on code taken from the GNU libc, distributed under the LGPL license */
|
|
+
|
|
+/* Generate a unique temporary file name from TEMPLATE.
|
|
+
|
|
+ TEMPLATE has the form:
|
|
+
|
|
+ <path>/ccXXXXXX<suffix>
|
|
+
|
|
+ SUFFIX_LEN tells us how long <suffix> is (it can be zero length).
|
|
+
|
|
+ The last six characters of TEMPLATE before <suffix> must be "XXXXXX";
|
|
+ they are replaced with a string that makes the filename unique.
|
|
+
|
|
+ Returns a file descriptor open on the file for reading and writing. */
|
|
+
|
|
+int mkstemps (char* _template, int suffix_len)
|
|
{
|
|
-#ifndef HAVE_MKSTEMP
|
|
-#ifndef X_NOT_POSIX
|
|
- return ((char *) tempnam (path, prefix));
|
|
-#else
|
|
- char tempFile[PATH_MAX];
|
|
- char *tmp;
|
|
+ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
+ char *XXXXXX;
|
|
+ int len;
|
|
+ int count;
|
|
+ int value;
|
|
|
|
- snprintf (tempFile, PATH_MAX, "%s/%sXXXXXX", path, prefix);
|
|
- tmp = (char *) mktemp (tempFile);
|
|
- if (tmp)
|
|
- {
|
|
- char *ptr = (char *) malloc (strlen (tmp) + 1);
|
|
- if (ptr != NULL)
|
|
- {
|
|
- strcpy (ptr, tmp);
|
|
- }
|
|
- return (ptr);
|
|
- }
|
|
- else
|
|
- return (NULL);
|
|
+ len = strlen (_template);
|
|
+
|
|
+ if ((int) len < 6 + suffix_len || strncmp (&_template[len - 6 - suffix_len], "XXXXXX", 6))
|
|
+ return -1;
|
|
+
|
|
+ XXXXXX = &_template[len - 6 - suffix_len];
|
|
+
|
|
+ value = rand();
|
|
+ for (count = 0; count < 256; ++count)
|
|
+ {
|
|
+ int v = value;
|
|
+ int fd;
|
|
+
|
|
+ /* Fill in the random bits. */
|
|
+ XXXXXX[0] = letters[v % 62];
|
|
+ v /= 62;
|
|
+ XXXXXX[1] = letters[v % 62];
|
|
+ v /= 62;
|
|
+ XXXXXX[2] = letters[v % 62];
|
|
+ v /= 62;
|
|
+ XXXXXX[3] = letters[v % 62];
|
|
+ v /= 62;
|
|
+ XXXXXX[4] = letters[v % 62];
|
|
+ v /= 62;
|
|
+ XXXXXX[5] = letters[v % 62];
|
|
+
|
|
+ fd = open (_template, O_RDWR|O_CREAT|O_EXCL, 0600);
|
|
+ if (fd >= 0)
|
|
+ /* The file does not exist. */
|
|
+ return fd;
|
|
+
|
|
+ /* This is a random value. It is only necessary that the next
|
|
+ TMP_MAX values generated by adding 7777 to VALUE are different
|
|
+ with (module 2^32). */
|
|
+ value += 7777;
|
|
+ }
|
|
+ /* We return the null string if we can't find a unique file name. */
|
|
+ _template[0] = '\0';
|
|
+ return -1;
|
|
+}
|
|
+
|
|
#endif
|
|
-#else
|
|
+
|
|
+static char *unique_filename (const char *path, const char *prefix, int *pFd)
|
|
+{
|
|
char tempFile[PATH_MAX];
|
|
char *ptr;
|
|
|
|
@@ -480,44 +523,11 @@ static char *unique_filename (const char
|
|
if (ptr != NULL)
|
|
{
|
|
strcpy(ptr, tempFile);
|
|
- *pFd = mkstemp(ptr);
|
|
+ *pFd = mkstemps(ptr, 0);
|
|
}
|
|
return ptr;
|
|
-#endif
|
|
}
|
|
|
|
-#if 0
|
|
-Status SetAuthentication_local (int count, IceListenObj *listenObjs)
|
|
-{
|
|
- int i;
|
|
- for (i = 0; i < count; i ++) {
|
|
- char *prot = IceGetListenConnectionString(listenObjs[i]);
|
|
- if (!prot) continue;
|
|
- char *host = strchr(prot, '/');
|
|
- char *sock = 0;
|
|
- if (host) {
|
|
- *host=0;
|
|
- host++;
|
|
- sock = strchr(host, ':');
|
|
- if (sock) {
|
|
- *sock = 0;
|
|
- sock++;
|
|
- }
|
|
- }
|
|
-#ifndef NDEBUG
|
|
- qDebug("DCOPServer: SetAProc_loc: conn %d, prot=%s, file=%s",
|
|
- (unsigned)i, prot, sock);
|
|
-#endif
|
|
- if (sock && !strcmp(prot, "local")) {
|
|
- chmod(sock, 0700);
|
|
- }
|
|
- IceSetHostBasedAuthProc (listenObjs[i], HostBasedAuthProc);
|
|
- free(prot);
|
|
- }
|
|
- return 1;
|
|
-}
|
|
-#endif
|
|
-
|
|
#define MAGIC_COOKIE_LEN 16
|
|
|
|
Status
|
|
@@ -529,28 +539,19 @@ SetAuthentication (int count, IceListenO
|
|
int original_umask;
|
|
int i;
|
|
QCString command;
|
|
-#ifdef HAVE_MKSTEMP
|
|
int fd;
|
|
-#endif
|
|
|
|
original_umask = umask (0077); /* disallow non-owner access */
|
|
|
|
path = getenv ("DCOP_SAVE_DIR");
|
|
if (!path)
|
|
path = "/tmp";
|
|
-#ifndef HAVE_MKSTEMP
|
|
- if ((addAuthFile = unique_filename (path, "dcop")) == NULL)
|
|
- goto bad;
|
|
|
|
- if (!(addfp = fopen (addAuthFile, "w")))
|
|
- goto bad;
|
|
-#else
|
|
if ((addAuthFile = unique_filename (path, "dcop", &fd)) == NULL)
|
|
goto bad;
|
|
|
|
if (!(addfp = fdopen(fd, "wb")))
|
|
goto bad;
|
|
-#endif
|
|
|
|
if ((*_authDataEntries = static_cast<IceAuthDataEntry *>(malloc (count * 2 * sizeof (IceAuthDataEntry)))) == NULL)
|
|
goto bad;
|