aboutsummaryrefslogtreecommitdiffstats
path: root/connection.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2010-08-27 22:16:50 -0400
committerKristian Høgsberg <krh@bitplanet.net>2010-08-27 22:16:50 -0400
commit3bbbd15c65c3ebded14f558be93e760c38c52e1b (patch)
treeba54be4a8f4a235dc27f7e5603d687e9418ed54a /connection.c
parentUpdate drag protocol to use fd passing for data transfer (diff)
downloadwayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar.gz
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar.bz2
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar.lz
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar.xz
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.tar.zst
wayland-3bbbd15c65c3ebded14f558be93e760c38c52e1b.zip
Marshall NULL strings without crashing
Diffstat (limited to 'connection.c')
-rw-r--r--connection.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/connection.c b/connection.c
index 71e39e6..cd9a45d 100644
--- a/connection.c
+++ b/connection.c
@@ -338,7 +338,7 @@ wl_connection_vmarshal(struct wl_connection *connection,
break;
case 's':
s = va_arg(ap, const char *);
- length = strlen(s);
+ length = s ? strlen(s) : 0;
*p++ = length;
memcpy(p, s, length);
p += DIV_ROUNDUP(length, sizeof(*p));
@@ -456,14 +456,18 @@ wl_connection_demarshal(struct wl_connection *connection,
goto out;
}
- values[i].string = malloc(length + 1);
- if (values[i].string == NULL) {
- errno = ENOMEM;
- ret = -1;
- goto out;
+ if (length == 0) {
+ values[i].string = NULL;
+ } else {
+ values[i].string = malloc(length + 1);
+ if (values[i].string == NULL) {
+ errno = ENOMEM;
+ ret = -1;
+ goto out;
+ }
+ memcpy(values[i].string, p, length);
+ values[i].string[length] = '\0';
}
- memcpy(values[i].string, p, length);
- values[i].string[length] = '\0';
p = next;
break;
case 'o':