/[pcre2]/code/trunk/src/sljit/sljitProtExecAllocator.c
ViewVC logotype

Diff of /code/trunk/src/sljit/sljitProtExecAllocator.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 651 by zherczeg, Mon Jan 2 13:01:42 2017 UTC revision 652 by zherczeg, Thu Jan 12 09:32:15 2017 UTC
# Line 84  struct chunk_header { Line 84  struct chunk_header {
84         as it only uses local variables         as it only uses local variables
85  */  */
86    
87  #ifndef _XOPEN_SOURCE  #include <fcntl.h>
88  #define _XOPEN_SOURCE 500 /* for mkstemp() and truncate() */  
89    #ifndef O_NOATIME
90    #define O_NOATIME 0
91  #endif  #endif
92    
93  static SLJIT_INLINE struct chunk_header* alloc_chunk(sljit_uw size)  #ifdef __O_TMPFILE
94    #ifndef O_TMPFILE
95    #define O_TMPFILE       (__O_TMPFILE | O_DIRECTORY)
96    #endif
97    #endif
98    
99    int mkostemp(char *template, int flags);
100    char *secure_getenv(const char *name);
101    
102    static SLJIT_INLINE int create_tempfile(void)
103  {  {
         struct chunk_header *retval;  
         char template[] = "/tmp/XXXXXX";  
104          int fd;          int fd;
105    
106          fd = mkstemp(template);          char tmp_name[256];
107          if (fd == -1) {          size_t tmp_name_len;
108                  return NULL;          char *dir;
109            size_t len;
110    
111    #ifdef P_tmpdir
112            len = (P_tmpdir != NULL) ? strlen(P_tmpdir) : 0;
113    
114            if (len > 0 && len < sizeof(tmp_name)) {
115                    strcpy(tmp_name, P_tmpdir);
116                    tmp_name_len = len;
117            }
118            else {
119                    strcpy(tmp_name, "/tmp");
120                    tmp_name_len = 4;
121            }
122    #else
123            strcpy(tmp_name, "/tmp");
124            tmp_name_len = 4;
125    #endif
126    
127            dir = secure_getenv("TMPDIR");
128            if (dir) {
129                    len = strlen(dir);
130                    if (len > 0 && len < sizeof(tmp_name)) {
131                            strcpy(tmp_name, dir);
132                            tmp_name_len = len;
133                    }
134            }
135    
136            SLJIT_ASSERT(tmp_name_len > 0 && tmp_name_len < sizeof(tmp_name));
137    
138            while (tmp_name_len > 0 && tmp_name[tmp_name_len - 1] == '/') {
139                    tmp_name_len--;
140                    tmp_name[tmp_name_len] = '\0';
141            }
142    
143    #ifdef O_TMPFILE
144            fd = open(tmp_name, O_TMPFILE | O_EXCL | O_RDWR | O_NOATIME | O_CLOEXEC, S_IRUSR | S_IWUSR);
145            if (fd != -1)
146                    return fd;
147    #endif
148    
149            if (tmp_name_len + 7 >= sizeof(tmp_name))
150            {
151                    return -1;
152          }          }
153    
154          if (unlink(template)) {          strcpy(tmp_name + tmp_name_len, "/XXXXXX");
155            fd = mkostemp(tmp_name, O_CLOEXEC | O_NOATIME);
156    
157            if (fd == -1)
158                    return fd;
159    
160            if (unlink(tmp_name)) {
161                  close(fd);                  close(fd);
162                  return NULL;                  return -1;
163          }          }
164    
165            return fd;
166    }
167    
168    static SLJIT_INLINE struct chunk_header* alloc_chunk(sljit_uw size)
169    {
170            struct chunk_header *retval;
171            int fd;
172    
173            fd = create_tempfile();
174            if (fd == -1)
175                    return NULL;
176    
177          if (ftruncate(fd, size)) {          if (ftruncate(fd, size)) {
178                  close(fd);                  close(fd);
179                  return NULL;                  return NULL;

Legend:
Removed from v.651  
changed lines
  Added in v.652

  ViewVC Help
Powered by ViewVC 1.1.5