libceph: fix undefined behavior when using snprintf()
The variable "str" is used as both the source and destination in function snprintf(), which is undefined behavior based on C11. The original description in C11 is: "If copying takes place between objects that overlap, the behavior is undefined." And, the function of ceph_osdmap_state_str() is to return the osdmap state, so it should return "doesn't exist" when all the conditions are not satisfied. I fix it in this patch. [elder@inktank.com: shortened the commit message] Signed-off-by: Cong Ding <dinggnu@gmail.com> Reviewed-by: Alex Elder <elder@inktank.com>
This commit is contained in:
parent
c04306471a
commit
1ec3911dbd
1 changed files with 9 additions and 17 deletions
|
@ -13,26 +13,18 @@
|
|||
|
||||
char *ceph_osdmap_state_str(char *str, int len, int state)
|
||||
{
|
||||
int flag = 0;
|
||||
|
||||
if (!len)
|
||||
goto done;
|
||||
return str;
|
||||
|
||||
*str = '\0';
|
||||
if (state) {
|
||||
if (state & CEPH_OSD_EXISTS) {
|
||||
snprintf(str, len, "exists");
|
||||
flag = 1;
|
||||
}
|
||||
if (state & CEPH_OSD_UP) {
|
||||
snprintf(str, len, "%s%s%s", str, (flag ? ", " : ""),
|
||||
"up");
|
||||
flag = 1;
|
||||
}
|
||||
} else {
|
||||
if ((state & CEPH_OSD_EXISTS) && (state & CEPH_OSD_UP))
|
||||
snprintf(str, len, "exists, up");
|
||||
else if (state & CEPH_OSD_EXISTS)
|
||||
snprintf(str, len, "exists");
|
||||
else if (state & CEPH_OSD_UP)
|
||||
snprintf(str, len, "up");
|
||||
else
|
||||
snprintf(str, len, "doesn't exist");
|
||||
}
|
||||
done:
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue