Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
David Barchiesi
OpenLDAP
Commits
0dae55ec
Commit
0dae55ec
authored
Dec 06, 2018
by
Howard Chu
Committed by
Quanah Gibson-Mount
Dec 13, 2018
Browse files
ITS#8752 more for accesslog deadlock
Restructure response/cleanup invocation to avoid cleanup happening before response
parent
09aea7d8
Changes
1
Hide whitespace changes
Inline
Side-by-side
servers/slapd/overlays/accesslog.c
View file @
0dae55ec
...
...
@@ -1290,10 +1290,8 @@ accesslog_ctrls(
}
static
Entry
*
accesslog_entry
(
Operation
*
op
,
SlapReply
*
rs
,
int
logop
,
Operation
*
op2
)
{
slap_overinst
*
on
=
(
slap_overinst
*
)
op
->
o_bd
->
bd_info
;
log_info
*
li
=
on
->
on_bi
.
bi_private
;
static
Entry
*
accesslog_entry
(
Operation
*
op
,
SlapReply
*
rs
,
log_info
*
li
,
int
logop
,
Operation
*
op2
)
{
char
rdnbuf
[
STRLENOF
(
RDNEQ
)
+
LDAP_LUTIL_GENTIME_BUFSIZE
+
8
];
char
nrdnbuf
[
STRLENOF
(
RDNEQ
)
+
LDAP_LUTIL_GENTIME_BUFSIZE
+
8
];
...
...
@@ -1451,9 +1449,11 @@ accesslog_op2logop( Operation *op )
return
LOG_EN_UNKNOWN
;
}
static
int
accesslog_mod_cleanup
(
Operation
*
op
,
SlapReply
*
rs
);
static
int
accesslog_response
(
Operation
*
op
,
SlapReply
*
rs
)
{
slap_overinst
*
on
=
(
slap_overinst
*
)
op
->
o_
bd
->
bd_info
;
log_info
*
li
=
on
->
on_bi
.
bi_private
;
slap_overinst
*
on
=
(
slap_overinst
*
)
op
->
o_
callback
->
sc_private
;
log_info
*
li
;
Attribute
*
a
,
*
last_attr
;
Modifications
*
m
;
struct
berval
*
b
,
uuid
=
BER_BVNULL
;
...
...
@@ -1468,6 +1468,10 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
Operation
op2
=
{
0
};
SlapReply
rs2
=
{
REP_RESULT
};
if
(
!
on
)
return
SLAP_CB_CONTINUE
;
li
=
on
->
on_bi
.
bi_private
;
if
(
rs
->
sr_type
!=
REP_RESULT
&&
rs
->
sr_type
!=
REP_EXTENDED
)
return
SLAP_CB_CONTINUE
;
...
...
@@ -1502,7 +1506,7 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
BER_BVZERO
(
&
li
->
li_uuid
);
/* Disarm mod_cleanup */
for
(
cb
=
op
->
o_callback
;
cb
;
cb
=
cb
->
sc_next
)
{
if
(
cb
->
sc_private
==
(
void
*
)
on
)
{
if
(
cb
->
sc_cleanup
==
accesslog_mod_cleanup
&&
cb
->
sc_private
==
(
void
*
)
on
)
{
cb
->
sc_private
=
NULL
;
break
;
}
...
...
@@ -1523,7 +1527,7 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
if
(
li
->
li_success
&&
rs
->
sr_err
!=
LDAP_SUCCESS
)
goto
done
;
e
=
accesslog_entry
(
op
,
rs
,
logop
,
&
op2
);
e
=
accesslog_entry
(
op
,
rs
,
li
,
logop
,
&
op2
);
attr_merge_one
(
e
,
ad_reqDN
,
&
op
->
o_req_dn
,
&
op
->
o_req_ndn
);
...
...
@@ -1886,36 +1890,13 @@ done:
return
SLAP_CB_CONTINUE
;
}
/* Since Bind success is sent by the frontend, it won't normally enter
* the overlay response callback. Add another callback to make sure it
* gets here.
*/
static
int
accesslog_bind_resp
(
Operation
*
op
,
SlapReply
*
rs
)
{
BackendDB
*
be
,
db
;
int
rc
;
slap_callback
*
sc
;
be
=
op
->
o_bd
;
db
=
*
be
;
op
->
o_bd
=
&
db
;
db
.
bd_info
=
op
->
o_callback
->
sc_private
;
rc
=
accesslog_response
(
op
,
rs
);
op
->
o_bd
=
be
;
sc
=
op
->
o_callback
;
op
->
o_callback
=
sc
->
sc_next
;
op
->
o_tmpfree
(
sc
,
op
->
o_tmpmemctx
);
return
rc
;
}
static
int
accesslog_op_
bind
(
Operation
*
op
,
SlapReply
*
rs
)
accesslog_op_
misc
(
Operation
*
op
,
SlapReply
*
rs
)
{
slap_callback
*
sc
;
sc
=
op
->
o_tmpcalloc
(
1
,
sizeof
(
slap_callback
),
op
->
o_tmpmemctx
);
sc
->
sc_response
=
accesslog_
bind_
resp
;
sc
->
sc_response
=
accesslog_resp
onse
;
sc
->
sc_private
=
op
->
o_bd
->
bd_info
;
if
(
op
->
o_callback
)
{
...
...
@@ -1932,16 +1913,13 @@ accesslog_mod_cleanup( Operation *op, SlapReply *rs )
{
slap_callback
*
sc
=
op
->
o_callback
;
slap_overinst
*
on
=
sc
->
sc_private
;
op
->
o_callback
=
sc
->
sc_next
;
op
->
o_tmpfree
(
sc
,
op
->
o_tmpmemctx
);
if
(
on
&&
rs
->
sr_err
!=
LDAP_SUCCESS
)
{
BackendInfo
*
bi
=
op
->
o_bd
->
bd_info
;
op
->
o_bd
->
bd_info
=
(
BackendInfo
*
)
on
;
accesslog_response
(
op
,
rs
);
op
->
o_bd
->
bd_info
=
bi
;
}
op
->
o_callback
=
sc
->
sc_next
;
op
->
o_tmpfree
(
sc
,
op
->
o_tmpmemctx
);
return
0
;
}
...
...
@@ -1973,11 +1951,12 @@ accesslog_op_mod( Operation *op, SlapReply *rs )
}
if
(
doit
)
{
slap_callback
*
cb
=
op
->
o_tmpcalloc
(
1
,
sizeof
(
slap_callback
),
op
->
o_tmpmemctx
)
,
*
cb2
;
slap_callback
*
cb
=
op
->
o_tmpcalloc
(
1
,
sizeof
(
slap_callback
),
op
->
o_tmpmemctx
);
cb
->
sc_cleanup
=
accesslog_mod_cleanup
;
cb
->
sc_response
=
accesslog_response
;
cb
->
sc_private
=
on
;
for
(
cb2
=
op
->
o_callback
;
cb2
->
sc_next
;
cb2
=
cb2
->
sc_next
);
cb2
->
sc_next
=
cb
;
cb
->
sc_next
=
op
->
o_callback
;
op
->
o_callback
=
cb
;
#ifdef RMUTEX_DEBUG
Debug
(
LDAP_DEBUG_SYNC
,
...
...
@@ -2052,7 +2031,7 @@ accesslog_unbind( Operation *op, SlapReply *rs )
return
SLAP_CB_CONTINUE
;
}
e
=
accesslog_entry
(
op
,
rs
,
LOG_EN_UNBIND
,
&
op2
);
e
=
accesslog_entry
(
op
,
rs
,
li
,
LOG_EN_UNBIND
,
&
op2
);
op2
.
o_hdr
=
op
->
o_hdr
;
op2
.
o_tag
=
LDAP_REQ_ADD
;
op2
.
o_bd
=
li
->
li_db
;
...
...
@@ -2100,7 +2079,7 @@ accesslog_abandon( Operation *op, SlapReply *rs )
return
SLAP_CB_CONTINUE
;
}
e
=
accesslog_entry
(
op
,
rs
,
LOG_EN_ABANDON
,
&
op2
);
e
=
accesslog_entry
(
op
,
rs
,
li
,
LOG_EN_ABANDON
,
&
op2
);
bv
.
bv_val
=
buf
;
bv
.
bv_len
=
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
op
->
orn_msgid
);
if
(
bv
.
bv_len
<
sizeof
(
buf
)
)
{
...
...
@@ -2343,14 +2322,16 @@ int accesslog_initialize()
accesslog
.
on_bi
.
bi_db_open
=
accesslog_db_open
;
accesslog
.
on_bi
.
bi_op_add
=
accesslog_op_mod
;
accesslog
.
on_bi
.
bi_op_bind
=
accesslog_op_bind
;
accesslog
.
on_bi
.
bi_op_bind
=
accesslog_op_misc
;
accesslog
.
on_bi
.
bi_op_compare
=
accesslog_op_misc
;
accesslog
.
on_bi
.
bi_op_delete
=
accesslog_op_mod
;
accesslog
.
on_bi
.
bi_op_modify
=
accesslog_op_mod
;
accesslog
.
on_bi
.
bi_op_modrdn
=
accesslog_op_mod
;
accesslog
.
on_bi
.
bi_op_search
=
accesslog_op_misc
;
accesslog
.
on_bi
.
bi_extended
=
accesslog_op_misc
;
accesslog
.
on_bi
.
bi_op_unbind
=
accesslog_unbind
;
accesslog
.
on_bi
.
bi_op_abandon
=
accesslog_abandon
;
accesslog
.
on_bi
.
bi_operational
=
accesslog_operational
;
accesslog
.
on_response
=
accesslog_response
;
accesslog
.
on_bi
.
bi_cf_ocs
=
log_cfocs
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment