~ubuntu-branches/ubuntu/quantal/nss/quantal-updates

« back to all changes in this revision

Viewing changes to mozilla/dbm/src/mktemp.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2013-11-14 14:58:07 UTC
  • mfrom: (1.1.19)
  • Revision ID: package-import@ubuntu.com-20131114145807-vj6v4erz8xj6kwz3
Tags: 3.15.3-0ubuntu0.12.10.1
* SECURITY UPDATE: New upstream release to fix multiple security issues
  and add TLSv1.2 support.
  - CVE-2013-1739
  - CVE-2013-1741
  - CVE-2013-5605
  - CVE-2013-5606
* Adjusted packaging for 3.15.3:
  - debian/patches/*: refreshed.
  - debian/patches/lower-dhe-priority.patch: removed, no longer needed,
    was a workaround for an old version of firefox.
  - debian/libnss3.symbols: added new symbols.
  - debian/rules: updated for new source layout.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (c) 1987, 1993
3
 
 *      The Regents of the University of California.  All rights reserved.
4
 
 *
5
 
 * Redistribution and use in source and binary forms, with or without
6
 
 * modification, are permitted provided that the following conditions
7
 
 * are met:
8
 
 * 1. Redistributions of source code must retain the above copyright
9
 
 *    notice, this list of conditions and the following disclaimer.
10
 
 * 2. Redistributions in binary form must reproduce the above copyright
11
 
 *    notice, this list of conditions and the following disclaimer in the
12
 
 *    documentation and/or other materials provided with the distribution.
13
 
 * 3. ***REMOVED*** - see 
14
 
 *    ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
15
 
 * 4. Neither the name of the University nor the names of its contributors
16
 
 *    may be used to endorse or promote products derived from this software
17
 
 *    without specific prior written permission.
18
 
 *
19
 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
 
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 
 * SUCH DAMAGE.
30
 
 */
31
 
 
32
 
#if defined(LIBC_SCCS) && !defined(lint)
33
 
static char sccsid[] = "@(#)mktemp.c    8.1 (Berkeley) 6/4/93";
34
 
#endif /* LIBC_SCCS and not lint */
35
 
 
36
 
#ifdef macintosh
37
 
#include <unix.h>
38
 
#else
39
 
#include <sys/types.h>
40
 
#include <sys/stat.h>
41
 
#endif
42
 
#include <fcntl.h>
43
 
#include <errno.h>
44
 
#include <stdio.h>
45
 
#include <ctype.h>
46
 
#include "mcom_db.h"
47
 
 
48
 
#ifndef _WINDOWS
49
 
#include <unistd.h>
50
 
#endif
51
 
 
52
 
#ifdef _WINDOWS
53
 
#include <process.h>
54
 
#include "winfile.h"
55
 
#endif
56
 
 
57
 
static int _gettemp(char *path, register int *doopen, int extraFlags);
58
 
 
59
 
int
60
 
mkstemp(char *path)
61
 
{
62
 
#ifdef XP_OS2
63
 
        FILE *temp = tmpfile();
64
 
 
65
 
        return (temp ? fileno(temp) : -1);
66
 
#else
67
 
        int fd;
68
 
 
69
 
        return (_gettemp(path, &fd, 0) ? fd : -1);
70
 
#endif
71
 
}
72
 
 
73
 
int
74
 
mkstempflags(char *path, int extraFlags)
75
 
{
76
 
        int fd;
77
 
 
78
 
        return (_gettemp(path, &fd, extraFlags) ? fd : -1);
79
 
}
80
 
 
81
 
/* NB: This routine modifies its input string, and does not always restore it.
82
 
** returns 1 on success, 0 on failure.
83
 
*/
84
 
static int 
85
 
_gettemp(char *path, register int *doopen, int extraFlags)
86
 
{    
87
 
        register char *start, *trv;
88
 
        struct stat sbuf;
89
 
        unsigned int pid;
90
 
 
91
 
        pid = getpid();
92
 
        for (trv = path; *trv; ++trv);          /* extra X's get set to 0's */
93
 
        while (*--trv == 'X') {
94
 
                *trv = (pid % 10) + '0';
95
 
                pid /= 10;
96
 
        }
97
 
 
98
 
        /*
99
 
         * check the target directory; if you have six X's and it
100
 
         * doesn't exist this runs for a *very* long time.
101
 
         */
102
 
        for (start = trv + 1;; --trv) {
103
 
                char saved;
104
 
                if (trv <= path)
105
 
                        break;
106
 
                saved = *trv;
107
 
                if (saved == '/' || saved == '\\') {
108
 
                        int rv;
109
 
                        *trv = '\0';
110
 
                        rv = stat(path, &sbuf);
111
 
                        *trv = saved;
112
 
                        if (rv)
113
 
                                return(0);
114
 
                        if (!S_ISDIR(sbuf.st_mode)) {
115
 
                                errno = ENOTDIR;
116
 
                                return(0);
117
 
                        }
118
 
                        break;
119
 
                }
120
 
        }
121
 
 
122
 
        for (;;) {
123
 
                if (doopen) {
124
 
                        if ((*doopen =
125
 
                            open(path, O_CREAT|O_EXCL|O_RDWR|extraFlags, 0600)) >= 0)
126
 
                                return(1);
127
 
                        if (errno != EEXIST)
128
 
                                return(0);
129
 
                }
130
 
                else if (stat(path, &sbuf))
131
 
                        return(errno == ENOENT ? 1 : 0);
132
 
 
133
 
                /* tricky little algorithm for backward compatibility */
134
 
                for (trv = start;;) {
135
 
                        if (!*trv)
136
 
                                return(0);
137
 
                        if (*trv == 'z')
138
 
                                *trv++ = 'a';
139
 
                        else {
140
 
                                if (isdigit(*trv))
141
 
                                        *trv = 'a';
142
 
                                else
143
 
                                        ++*trv;
144
 
                                break;
145
 
                        }
146
 
                }
147
 
        }
148
 
        /*NOTREACHED*/
149
 
}