fixed "double-close" of stroke fd resulting in "bad fd" errors if multiple threads are active
This commit is contained in:
@@ -370,7 +370,10 @@ static void stroke_config(private_stroke_socket_t *this, stroke_msg_t *msg, FILE
|
|||||||
*/
|
*/
|
||||||
static void stroke_job_context_destroy(stroke_job_context_t *this)
|
static void stroke_job_context_destroy(stroke_job_context_t *this)
|
||||||
{
|
{
|
||||||
close(this->fd);
|
if (this->fd)
|
||||||
|
{
|
||||||
|
close(this->fd);
|
||||||
|
}
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,17 +395,15 @@ static job_requeue_t process(stroke_job_context_t *ctx)
|
|||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "reading length of stroke message failed: %s",
|
DBG1(DBG_CFG, "reading length of stroke message failed: %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(strokefd);
|
|
||||||
return JOB_REQUEUE_NONE;
|
return JOB_REQUEUE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read message */
|
/* read message */
|
||||||
msg = malloc(msg_length);
|
msg = alloca(msg_length);
|
||||||
bytes_read = recv(strokefd, msg, msg_length, 0);
|
bytes_read = recv(strokefd, msg, msg_length, 0);
|
||||||
if (bytes_read != msg_length)
|
if (bytes_read != msg_length)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "reading stroke message failed: %s", strerror(errno));
|
DBG1(DBG_CFG, "reading stroke message failed: %s", strerror(errno));
|
||||||
close(strokefd);
|
|
||||||
return JOB_REQUEUE_NONE;
|
return JOB_REQUEUE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,18 +411,11 @@ static job_requeue_t process(stroke_job_context_t *ctx)
|
|||||||
if (out == NULL)
|
if (out == NULL)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "opening stroke output channel failed: %s", strerror(errno));
|
DBG1(DBG_CFG, "opening stroke output channel failed: %s", strerror(errno));
|
||||||
close(strokefd);
|
|
||||||
free(msg);
|
|
||||||
return JOB_REQUEUE_NONE;
|
return JOB_REQUEUE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG3(DBG_CFG, "stroke message %b", (void*)msg, msg_length);
|
DBG3(DBG_CFG, "stroke message %b", (void*)msg, msg_length);
|
||||||
|
|
||||||
/* the stroke_* functions are blocking, as they listen on the bus. Add
|
|
||||||
* cancellation handlers. */
|
|
||||||
pthread_cleanup_push((void*)fclose, out);
|
|
||||||
pthread_cleanup_push(free, msg);
|
|
||||||
|
|
||||||
switch (msg->type)
|
switch (msg->type)
|
||||||
{
|
{
|
||||||
case STR_INITIATE:
|
case STR_INITIATE:
|
||||||
@@ -471,11 +465,11 @@ static job_requeue_t process(stroke_job_context_t *ctx)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBG1(DBG_CFG, "received unknown stroke");
|
DBG1(DBG_CFG, "received unknown stroke");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
/* remove and execute cancellation handlers */
|
fclose(out);
|
||||||
pthread_cleanup_pop(1);
|
/* fclose() closes underlying FD */
|
||||||
pthread_cleanup_pop(1);
|
ctx->fd = 0;
|
||||||
|
|
||||||
return JOB_REQUEUE_NONE;
|
return JOB_REQUEUE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user