Does the off-by-one matter? I don't think bind actually cares.
On Fri, Jul 18, 2014 at 4:13 AM, Marek Chalupa <mchqwe...@gmail.com> wrote: > > > > On 17 July 2014 19:54, Jasper St. Pierre <jstpie...@mecheye.net> wrote: > >> We'll use this to autodetect a good socket to open on. >> --- >> src/wayland-server.c | 41 ++++++++++++++++++++++++++--------------- >> 1 file changed, 26 insertions(+), 15 deletions(-) >> >> diff --git a/src/wayland-server.c b/src/wayland-server.c >> index d919eb2..3350751 100644 >> --- a/src/wayland-server.c >> +++ b/src/wayland-server.c >> @@ -1060,11 +1060,9 @@ get_socket_lock(struct wl_socket *socket) >> return fd_lock; >> } >> >> -WL_EXPORT int >> -wl_display_add_socket(struct wl_display *display, const char *name) >> +static int >> +wl_socket_init_for_display_name(struct wl_socket *s, const char *name) >> { >> - struct wl_socket *s; >> - socklen_t size; >> int name_size; >> const char *runtime_dir; >> >> @@ -1078,15 +1076,6 @@ wl_display_add_socket(struct wl_display *display, >> const char *name) >> return -1; >> } >> >> - s = malloc(sizeof *s); >> - if (s == NULL) >> - return -1; >> - >> - if (name == NULL) >> - name = getenv("WAYLAND_DISPLAY"); >> - if (name == NULL) >> - name = "wayland-0"; >> - >> memset(&s->addr, 0, sizeof s->addr); >> s->addr.sun_family = AF_LOCAL; >> name_size = snprintf(s->addr.sun_path, sizeof s->addr.sun_path, >> @@ -1096,13 +1085,35 @@ wl_display_add_socket(struct wl_display *display, >> const char *name) >> if (name_size > (int)sizeof s->addr.sun_path) { >> wl_log("error: socket path \"%s/%s\" plus null terminator" >> " exceeds 108 bytes\n", runtime_dir, name); >> - wl_socket_destroy(s); >> /* to prevent programs reporting >> * "failed to add socket: Success" */ >> errno = ENAMETOOLONG; >> return -1; >> }; >> >> + return 0; >> +} >> + >> +WL_EXPORT int >> +wl_display_add_socket(struct wl_display *display, const char *name) >> +{ >> + struct wl_socket *s; >> + socklen_t size; >> + >> + s = malloc(sizeof *s); >> + if (s == NULL) >> + return -1; >> + >> + if (name == NULL) >> + name = getenv("WAYLAND_DISPLAY"); >> + if (name == NULL) >> + name = "wayland-0"; >> + >> + if (wl_socket_init_for_display_name(s, name) < 0) { >> + wl_socket_destroy(s); >> + return -1; >> + } >> + >> s->fd_lock = get_socket_lock(s); >> if (s->fd_lock < 0) { >> wl_socket_destroy(s); >> @@ -1115,7 +1126,7 @@ wl_display_add_socket(struct wl_display *display, >> const char *name) >> return -1; >> } >> >> - size = offsetof (struct sockaddr_un, sun_path) + name_size; >> + size = offsetof (struct sockaddr_un, sun_path) + >> strlen(s->addr.sun_path); >> > > name_size in the original code is counting with the terminating zero, > strlen returns size of the string > excluding terminating zero, so here you are off by one. > > Maybe we could return name_size from the wl_socket_init_for_display_name, > it's returning int anyway > and we would reuse already counted value. However, I don't mind strlen. > > if (bind(s->fd, (struct sockaddr *) &s->addr, size) < 0) { >> wl_log("bind() failed with error: %m\n"); >> wl_socket_destroy(s); >> -- >> 2.0.1 >> >> _______________________________________________ >> wayland-devel mailing list >> wayland-devel@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/wayland-devel >> > > Regards, > Marek > -- Jasper
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel