1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to
5  * deal in the Software without restriction, including without limitation the
6  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7  * sell copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19  * IN THE SOFTWARE.
20  */
21 
22 #include "uv.h"
23 #include "internal.h"
24 
25 #include <assert.h>
26 #include <errno.h>
27 #include <string.h>
28 #include <sys/un.h>
29 #include <unistd.h>
30 #include <stdlib.h>
31 
32 
33 /* Does the file path contain embedded nul bytes? */
includes_nul(const char *s, size_t n)34 static int includes_nul(const char *s, size_t n) {
35   if (n == 0)
36     return 0;
37 #ifdef __linux__
38   /* Accept abstract socket namespace path ("\0/virtual/path"). */
39   s++;
40   n--;
41 #endif
42   return NULL != memchr(s, '\0', n);
43 }
44 
45 
uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc)46 int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) {
47   uv__stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE);
48   handle->shutdown_req = NULL;
49   handle->connect_req = NULL;
50   handle->pipe_fname = NULL;
51   handle->ipc = ipc;
52   return 0;
53 }
54 
55 
uv_pipe_bind(uv_pipe_t* handle, const char* name)56 int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
57   return uv_pipe_bind2(handle, name, strlen(name), 0);
58 }
59 
60 
uv_pipe_bind2(uv_pipe_t* handle, const char* name, size_t namelen, unsigned int flags)61 int uv_pipe_bind2(uv_pipe_t* handle,
62                   const char* name,
63                   size_t namelen,
64                   unsigned int flags) {
65   struct sockaddr_un saddr;
66   char* pipe_fname;
67   int sockfd;
68   int err;
69   socklen_t addrlen;
70 
71   pipe_fname = NULL;
72 
73   if (flags & ~UV_PIPE_NO_TRUNCATE)
74     return UV_EINVAL;
75 
76   if (name == NULL)
77     return UV_EINVAL;
78 
79   if (namelen == 0)
80     return UV_EINVAL;
81 
82   if (includes_nul(name, namelen))
83     return UV_EINVAL;
84 
85   if (flags & UV_PIPE_NO_TRUNCATE)
86     if (namelen > sizeof(saddr.sun_path))
87       return UV_EINVAL;
88 
89   /* Truncate long paths. Documented behavior. */
90   if (namelen > sizeof(saddr.sun_path))
91     namelen = sizeof(saddr.sun_path);
92 
93   /* Already bound? */
94   if (uv__stream_fd(handle) >= 0)
95     return UV_EINVAL;
96 
97   if (uv__is_closing(handle))
98     return UV_EINVAL;
99 
100   /* Make a copy of the file path unless it is an abstract socket.
101    * We unlink the file later but abstract sockets disappear
102    * automatically since they're not real file system entities.
103    */
104   if (*name == '\0') {
105     addrlen = offsetof(struct sockaddr_un, sun_path) + namelen;
106   } else {
107     pipe_fname = uv__malloc(namelen + 1);
108     if (pipe_fname == NULL)
109       return UV_ENOMEM;
110     memcpy(pipe_fname, name, namelen);
111     pipe_fname[namelen] = '\0';
112     addrlen = sizeof saddr;
113   }
114 
115   err = uv__socket(AF_UNIX, SOCK_STREAM, 0);
116   if (err < 0)
117     goto err_socket;
118   sockfd = err;
119 
120   memset(&saddr, 0, sizeof saddr);
121   memcpy(&saddr.sun_path, name, namelen);
122   saddr.sun_family = AF_UNIX;
123 
124   if (bind(sockfd, (struct sockaddr*)&saddr, addrlen)) {
125     err = UV__ERR(errno);
126     /* Convert ENOENT to EACCES for compatibility with Windows. */
127     if (err == UV_ENOENT)
128       err = UV_EACCES;
129 
130     uv__close(sockfd);
131     goto err_socket;
132   }
133 
134   /* Success. */
135   handle->flags |= UV_HANDLE_BOUND;
136   handle->pipe_fname = pipe_fname; /* NULL or a copy of |name| */
137   handle->io_watcher.fd = sockfd;
138   return 0;
139 
140 err_socket:
141   uv__free(pipe_fname);
142   return err;
143 }
144 
145 
uv__pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb)146 int uv__pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
147   if (uv__stream_fd(handle) == -1)
148     return UV_EINVAL;
149 
150   if (handle->ipc)
151     return UV_EINVAL;
152 
153 #if defined(__MVS__) || defined(__PASE__)
154   /* On zOS, backlog=0 has undefined behaviour */
155   /* On IBMi PASE, backlog=0 leads to "Connection refused" error */
156   if (backlog == 0)
157     backlog = 1;
158   else if (backlog < 0)
159     backlog = SOMAXCONN;
160 #endif
161 
162   if (listen(uv__stream_fd(handle), backlog))
163     return UV__ERR(errno);
164 
165   handle->connection_cb = cb;
166   handle->io_watcher.cb = uv__server_io;
167   uv__io_start(handle->loop, &handle->io_watcher, POLLIN);
168   return 0;
169 }
170 
171 
uv__pipe_close(uv_pipe_t* handle)172 void uv__pipe_close(uv_pipe_t* handle) {
173   if (handle->pipe_fname) {
174     /*
175      * Unlink the file system entity before closing the file descriptor.
176      * Doing it the other way around introduces a race where our process
177      * unlinks a socket with the same name that's just been created by
178      * another thread or process.
179      */
180     unlink(handle->pipe_fname);
181     uv__free((void*)handle->pipe_fname);
182     handle->pipe_fname = NULL;
183   }
184 
185   uv__stream_close((uv_stream_t*)handle);
186 }
187 
188 
uv_pipe_open(uv_pipe_t* handle, uv_file fd)189 int uv_pipe_open(uv_pipe_t* handle, uv_file fd) {
190   int flags;
191   int mode;
192   int err;
193   flags = 0;
194 
195   if (uv__fd_exists(handle->loop, fd))
196     return UV_EEXIST;
197 
198   do
199     mode = fcntl(fd, F_GETFL);
200   while (mode == -1 && errno == EINTR);
201 
202   if (mode == -1)
203     return UV__ERR(errno); /* according to docs, must be EBADF */
204 
205   err = uv__nonblock(fd, 1);
206   if (err)
207     return err;
208 
209 #if defined(__APPLE__)
210   err = uv__stream_try_select((uv_stream_t*) handle, &fd);
211   if (err)
212     return err;
213 #endif /* defined(__APPLE__) */
214 
215   mode &= O_ACCMODE;
216   if (mode != O_WRONLY)
217     flags |= UV_HANDLE_READABLE;
218   if (mode != O_RDONLY)
219     flags |= UV_HANDLE_WRITABLE;
220 
221   return uv__stream_open((uv_stream_t*)handle, fd, flags);
222 }
223 
224 
uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, const char* name, uv_connect_cb cb)225 void uv_pipe_connect(uv_connect_t* req,
226                     uv_pipe_t* handle,
227                     const char* name,
228                     uv_connect_cb cb) {
229   int err;
230 
231   err = uv_pipe_connect2(req, handle, name, strlen(name), 0, cb);
232 
233   if (err) {
234     handle->delayed_error = err;
235     handle->connect_req = req;
236 
237     uv__req_init(handle->loop, req, UV_CONNECT);
238     req->handle = (uv_stream_t*) handle;
239     req->cb = cb;
240     uv__queue_init(&req->queue);
241 
242     /* Force callback to run on next tick in case of error. */
243     uv__io_feed(handle->loop, &handle->io_watcher);
244   }
245 }
246 
247 
uv_pipe_connect2(uv_connect_t* req, uv_pipe_t* handle, const char* name, size_t namelen, unsigned int flags, uv_connect_cb cb)248 int uv_pipe_connect2(uv_connect_t* req,
249                      uv_pipe_t* handle,
250                      const char* name,
251                      size_t namelen,
252                      unsigned int flags,
253                      uv_connect_cb cb) {
254   struct sockaddr_un saddr;
255   int new_sock;
256   int err;
257   int r;
258   socklen_t addrlen;
259 
260   if (flags & ~UV_PIPE_NO_TRUNCATE)
261     return UV_EINVAL;
262 
263   if (name == NULL)
264     return UV_EINVAL;
265 
266   if (namelen == 0)
267     return UV_EINVAL;
268 
269   if (includes_nul(name, namelen))
270     return UV_EINVAL;
271 
272   if (flags & UV_PIPE_NO_TRUNCATE)
273     if (namelen > sizeof(saddr.sun_path))
274       return UV_EINVAL;
275 
276   /* Truncate long paths. Documented behavior. */
277   if (namelen > sizeof(saddr.sun_path))
278     namelen = sizeof(saddr.sun_path);
279 
280   new_sock = (uv__stream_fd(handle) == -1);
281 
282   if (new_sock) {
283     err = uv__socket(AF_UNIX, SOCK_STREAM, 0);
284     if (err < 0)
285       goto out;
286     handle->io_watcher.fd = err;
287   }
288 
289   memset(&saddr, 0, sizeof saddr);
290   memcpy(&saddr.sun_path, name, namelen);
291   saddr.sun_family = AF_UNIX;
292 
293   if (*name == '\0')
294     addrlen = offsetof(struct sockaddr_un, sun_path) + namelen;
295   else
296     addrlen = sizeof saddr;
297 
298   do {
299     r = connect(uv__stream_fd(handle), (struct sockaddr*)&saddr, addrlen);
300   }
301   while (r == -1 && errno == EINTR);
302 
303   if (r == -1 && errno != EINPROGRESS) {
304     err = UV__ERR(errno);
305 #if defined(__CYGWIN__) || defined(__MSYS__)
306     /* EBADF is supposed to mean that the socket fd is bad, but
307        Cygwin reports EBADF instead of ENOTSOCK when the file is
308        not a socket.  We do not expect to see a bad fd here
309        (e.g. due to new_sock), so translate the error.  */
310     if (err == UV_EBADF)
311       err = UV_ENOTSOCK;
312 #endif
313     goto out;
314   }
315 
316   err = 0;
317   if (new_sock) {
318     err = uv__stream_open((uv_stream_t*)handle,
319                           uv__stream_fd(handle),
320                           UV_HANDLE_READABLE | UV_HANDLE_WRITABLE);
321   }
322 
323   if (err == 0)
324     uv__io_start(handle->loop, &handle->io_watcher, POLLOUT);
325 
326 out:
327   handle->delayed_error = err;
328   handle->connect_req = req;
329 
330   uv__req_init(handle->loop, req, UV_CONNECT);
331   req->handle = (uv_stream_t*) handle;
332   req->cb = cb;
333   uv__queue_init(&req->queue);
334 
335   /* Force callback to run on next tick in case of error. */
336   if (err)
337     uv__io_feed(handle->loop, &handle->io_watcher);
338 
339   return 0;
340 }
341 
342 
uv__pipe_getsockpeername(const uv_pipe_t* handle, uv__peersockfunc func, char* buffer, size_t* size)343 static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
344                                     uv__peersockfunc func,
345                                     char* buffer,
346                                     size_t* size) {
347   struct sockaddr_un sa;
348   socklen_t addrlen;
349   int err;
350 
351   addrlen = sizeof(sa);
352   memset(&sa, 0, addrlen);
353   err = uv__getsockpeername((const uv_handle_t*) handle,
354                             func,
355                             (struct sockaddr*) &sa,
356                             (int*) &addrlen);
357   if (err < 0) {
358     *size = 0;
359     return err;
360   }
361 
362 #if defined(__linux__)
363   if (sa.sun_path[0] == 0)
364     /* Linux abstract namespace */
365     addrlen -= offsetof(struct sockaddr_un, sun_path);
366   else
367 #endif
368     addrlen = strlen(sa.sun_path);
369 
370 
371   if ((size_t)addrlen >= *size) {
372     *size = addrlen + 1;
373     return UV_ENOBUFS;
374   }
375 
376   memcpy(buffer, sa.sun_path, addrlen);
377   *size = addrlen;
378 
379   /* only null-terminate if it's not an abstract socket */
380   if (buffer[0] != '\0')
381     buffer[addrlen] = '\0';
382 
383   return 0;
384 }
385 
386 
uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size)387 int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) {
388   return uv__pipe_getsockpeername(handle, getsockname, buffer, size);
389 }
390 
391 
uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size)392 int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) {
393   return uv__pipe_getsockpeername(handle, getpeername, buffer, size);
394 }
395 
396 
uv_pipe_pending_instances(uv_pipe_t* handle, int count)397 void uv_pipe_pending_instances(uv_pipe_t* handle, int count) {
398 }
399 
400 
uv_pipe_pending_count(uv_pipe_t* handle)401 int uv_pipe_pending_count(uv_pipe_t* handle) {
402   uv__stream_queued_fds_t* queued_fds;
403 
404   if (!handle->ipc)
405     return 0;
406 
407   if (handle->accepted_fd == -1)
408     return 0;
409 
410   if (handle->queued_fds == NULL)
411     return 1;
412 
413   queued_fds = handle->queued_fds;
414   return queued_fds->offset + 1;
415 }
416 
417 
uv_pipe_pending_type(uv_pipe_t* handle)418 uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) {
419   if (!handle->ipc)
420     return UV_UNKNOWN_HANDLE;
421 
422   if (handle->accepted_fd == -1)
423     return UV_UNKNOWN_HANDLE;
424   else
425     return uv_guess_handle(handle->accepted_fd);
426 }
427 
428 
uv_pipe_chmod(uv_pipe_t* handle, int mode)429 int uv_pipe_chmod(uv_pipe_t* handle, int mode) {
430   unsigned desired_mode;
431   struct stat pipe_stat;
432   char* name_buffer;
433   size_t name_len;
434   int r;
435 
436   if (handle == NULL || uv__stream_fd(handle) == -1)
437     return UV_EBADF;
438 
439   if (mode != UV_READABLE &&
440       mode != UV_WRITABLE &&
441       mode != (UV_WRITABLE | UV_READABLE))
442     return UV_EINVAL;
443 
444   /* Unfortunately fchmod does not work on all platforms, we will use chmod. */
445   name_len = 0;
446   r = uv_pipe_getsockname(handle, NULL, &name_len);
447   if (r != UV_ENOBUFS)
448     return r;
449 
450   name_buffer = uv__malloc(name_len);
451   if (name_buffer == NULL)
452     return UV_ENOMEM;
453 
454   r = uv_pipe_getsockname(handle, name_buffer, &name_len);
455   if (r != 0) {
456     uv__free(name_buffer);
457     return r;
458   }
459 
460   /* stat must be used as fstat has a bug on Darwin */
461   if (uv__stat(name_buffer, &pipe_stat) == -1) {
462     uv__free(name_buffer);
463     return -errno;
464   }
465 
466   desired_mode = 0;
467   if (mode & UV_READABLE)
468     desired_mode |= S_IRUSR | S_IRGRP | S_IROTH;
469   if (mode & UV_WRITABLE)
470     desired_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
471 
472   /* Exit early if pipe already has desired mode. */
473   if ((pipe_stat.st_mode & desired_mode) == desired_mode) {
474     uv__free(name_buffer);
475     return 0;
476   }
477 
478   pipe_stat.st_mode |= desired_mode;
479 
480   r = chmod(name_buffer, pipe_stat.st_mode);
481   uv__free(name_buffer);
482 
483   return r != -1 ? 0 : UV__ERR(errno);
484 }
485 
486 
uv_pipe(uv_os_fd_t fds[2], int read_flags, int write_flags)487 int uv_pipe(uv_os_fd_t fds[2], int read_flags, int write_flags) {
488   uv_os_fd_t temp[2];
489   int err;
490 #if defined(__FreeBSD__) || defined(__linux__)
491   int flags = O_CLOEXEC;
492 
493   if ((read_flags & UV_NONBLOCK_PIPE) && (write_flags & UV_NONBLOCK_PIPE))
494     flags |= UV_FS_O_NONBLOCK;
495 
496   if (pipe2(temp, flags))
497     return UV__ERR(errno);
498 
499   if (flags & UV_FS_O_NONBLOCK) {
500     fds[0] = temp[0];
501     fds[1] = temp[1];
502     return 0;
503   }
504 #else
505   if (pipe(temp))
506     return UV__ERR(errno);
507 
508   if ((err = uv__cloexec(temp[0], 1)))
509     goto fail;
510 
511   if ((err = uv__cloexec(temp[1], 1)))
512     goto fail;
513 #endif
514 
515   if (read_flags & UV_NONBLOCK_PIPE)
516     if ((err = uv__nonblock(temp[0], 1)))
517       goto fail;
518 
519   if (write_flags & UV_NONBLOCK_PIPE)
520     if ((err = uv__nonblock(temp[1], 1)))
521       goto fail;
522 
523   fds[0] = temp[0];
524   fds[1] = temp[1];
525   return 0;
526 
527 fail:
528   uv__close(temp[0]);
529   uv__close(temp[1]);
530   return err;
531 }
532 
533 
uv__make_pipe(int fds[2], int flags)534 int uv__make_pipe(int fds[2], int flags) {
535   return uv_pipe(fds,
536                  flags & UV_NONBLOCK_PIPE,
537                  flags & UV_NONBLOCK_PIPE);
538 }
539