[Xcb] [PATCH 3/5] util: open_abstract gets filelen as parameters

Julien Danjou julien at danjou.info
Tue Apr 7 05:45:07 PDT 2009


That saves us from a couple of strlen() calls.

Signed-off-by: Julien Danjou <julien at danjou.info>
---
 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)
-- 
1.6.2.2



More information about the Xcb mailing list