diff options
author | Julien Danjou <julien@danjou.info> | 2009-04-07 13:37:40 +0200 |
---|---|---|
committer | Julien Danjou <julien@danjou.info> | 2009-04-10 09:59:49 +0200 |
commit | 8797e053b2b2ee989f47490c7687b9a2fbdb0021 (patch) | |
tree | 2077b8bff5d1c94174eba2f0ad27c78f42b29dd2 /src/xcb_util.c | |
parent | f0b29819749b769e5a8d313bf1bab80d6513208b (diff) |
util: open_abstract gets filelen as parameters
That saves us from a couple of strlen() calls.
Signed-off-by: Julien Danjou <julien@danjou.info>
Diffstat (limited to 'src/xcb_util.c')
-rw-r--r-- | src/xcb_util.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/xcb_util.c b/src/xcb_util.c index 4ae9097..008a38b 100644 --- a/src/xcb_util.c +++ b/src/xcb_util.c @@ -125,7 +125,7 @@ static int _xcb_open_unix(char *protocol, const char *file); static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port); #endif #ifdef HAVE_ABSTRACT_SOCKETS -static int _xcb_open_abstract(char *protocol, const char *file); +static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen); #endif static int _xcb_open(char *host, char *protocol, const int display) @@ -135,6 +135,7 @@ static int _xcb_open(char *host, char *protocol, const int display) #endif static const char base[] = "/tmp/.X11-unix/X"; char file[sizeof(base) + 20]; + int filelen; if(*host) { @@ -161,9 +162,13 @@ static int _xcb_open(char *host, char *protocol, const int display) } /* display specifies Unix socket */ - snprintf(file, sizeof(file), "%s%d", base, display); + filelen = snprintf(file, sizeof(file), "%s%d", base, display); + if(filelen < 0) + return -1; + /* snprintf may truncate the file */ + filelen = MIN(filelen, sizeof(file) - 1); #ifdef HAVE_ABSTRACT_SOCKETS - fd = _xcb_open_abstract(protocol, file); + fd = _xcb_open_abstract(protocol, file, filelen); if (fd >= 0 || (errno != ENOENT && errno != ECONNREFUSED)) return fd; @@ -284,7 +289,7 @@ static int _xcb_open_unix(char *protocol, const char *file) } #ifdef HAVE_ABSTRACT_SOCKETS -static int _xcb_open_abstract(char *protocol, const char *file) +static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen) { int fd; struct sockaddr_un addr = {0}; @@ -295,9 +300,9 @@ static int _xcb_open_abstract(char *protocol, const char *file) strcpy(addr.sun_path + 1, file); addr.sun_family = AF_UNIX; - namelen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(file); + namelen = offsetof(struct sockaddr_un, sun_path) + 1 + filelen; #ifdef HAVE_SOCKADDR_SUN_LEN - addr.sun_len = 1 + strlen(file); + addr.sun_len = 1 + filelen; #endif fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) |