aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-07-21 23:12:00 +0200
committerMattias Andrée <maandree@kth.se>2016-07-21 23:12:00 +0200
commitb14feb7ffbe390762c2bdb4e2e6cc200b2369835 (patch)
tree392bfe8b46aaa6dfbd5a478c82aeb5c918fd6f0d
parentAdd libcoopgamma_get_crtcs_recv.3 (diff)
downloadlibcoopgamma-b14feb7ffbe390762c2bdb4e2e6cc200b2369835.tar.gz
libcoopgamma-b14feb7ffbe390762c2bdb4e2e6cc200b2369835.tar.bz2
libcoopgamma-b14feb7ffbe390762c2bdb4e2e6cc200b2369835.tar.xz
Add missing part of check_error: copy description (and of course call next_payload)
Signed-off-by: Mattias Andrée <maandree@kth.se>
-rw-r--r--src/libcoopgamma.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/libcoopgamma.c b/src/libcoopgamma.c
index c6459f4..769b7b8 100644
--- a/src/libcoopgamma.c
+++ b/src/libcoopgamma.c
@@ -1736,6 +1736,8 @@ static int check_error(libcoopgamma_context_t* restrict ctx, libcoopgamma_async_
int have_in_response_to = 0;
int have_error = 0;
int bad = 0;
+ char* payload;
+ size_t n;
for (;;)
{
@@ -1789,14 +1791,27 @@ static int check_error(libcoopgamma_context_t* restrict ctx, libcoopgamma_async_
return 0;
}
- if (bad || (have_in_response_to != 1) || (have_error != 1))
+ payload = next_payload(ctx, &n);
+ if (payload != NULL)
{
- errno = EBADMSG;
- copy_errno(ctx);
- return -1;
+ if (memchr(ctx, '\0', n) || (payload[n - 1] != '\n'))
+ goto badmsg;
+ ctx->error.description = malloc(n);
+ if (ctx->error.description == NULL)
+ goto fail;
+ memcpy(ctx->error.description, payload, n - 1);
+ ctx->error.description[n - 1] = '\0';
}
+ if (bad || (have_in_response_to != 1) || (have_error != 1))
+ goto badmsg;
+
return 1;
+badmsg:
+ errno = EBADMSG;
+fail:
+ copy_errno(ctx);
+ return -1;
}