IPC: Solaris doors backend: avoid using TLS where possible
Optimistically delay using thread-local storage for the door reply buffer until we actually need to allocate from the heap.
This commit is contained in:
@@ -1191,12 +1191,11 @@ door_complete(heim_sipc_call ctx, int returnvalue, heim_idata *reply)
|
|||||||
struct door_reply reply;
|
struct door_reply reply;
|
||||||
char buffer[offsetof(struct door_reply, data) + BUFSIZ];
|
char buffer[offsetof(struct door_reply, data) + BUFSIZ];
|
||||||
} replyBuf;
|
} replyBuf;
|
||||||
int ret;
|
|
||||||
|
|
||||||
heim_base_once_f(&once, &door_key, door_key_create);
|
heim_base_once_f(&once, &door_key, door_key_create);
|
||||||
|
|
||||||
/* free previously saved reply, if any */
|
/* door_return() doesn't return; don't leak cred */
|
||||||
free(HEIMDAL_getspecific(door_key));
|
heim_ipc_free_cred(cs->cred);
|
||||||
|
|
||||||
error_reply:
|
error_reply:
|
||||||
rlen = offsetof(struct door_reply, data);
|
rlen = offsetof(struct door_reply, data);
|
||||||
@@ -1205,11 +1204,16 @@ error_reply:
|
|||||||
|
|
||||||
/* long replies (> BUFSIZ) are allocated from the heap */
|
/* long replies (> BUFSIZ) are allocated from the heap */
|
||||||
if (rlen > BUFSIZ) {
|
if (rlen > BUFSIZ) {
|
||||||
r = malloc(rlen);
|
int ret;
|
||||||
|
|
||||||
|
/* door_return() doesn't return, so stash reply buffer in TLS */
|
||||||
|
r = realloc(HEIMDAL_getspecific(door_key), rlen);
|
||||||
if (r == NULL) {
|
if (r == NULL) {
|
||||||
returnvalue = EAGAIN; /* don't leak ENOMEM to caller */
|
returnvalue = EAGAIN; /* don't leak ENOMEM to caller */
|
||||||
goto error_reply;
|
goto error_reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HEIMDAL_setspecific(door_key, r, ret);
|
||||||
} else {
|
} else {
|
||||||
r = &replyBuf.reply;
|
r = &replyBuf.reply;
|
||||||
}
|
}
|
||||||
@@ -1222,10 +1226,6 @@ error_reply:
|
|||||||
r->length = 0;
|
r->length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* door_return() doesn't return; don't leak cred */
|
|
||||||
heim_ipc_free_cred(cs->cred);
|
|
||||||
HEIMDAL_setspecific(door_key, r == &replyBuf.reply ? NULL : r, ret);
|
|
||||||
|
|
||||||
door_return((char *)r, rlen, NULL, 0);
|
door_return((char *)r, rlen, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user