Skip to content

Commit

Permalink
libceph: fix undefined behavior when using snprintf()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Cong Ding authored and Alex Elder committed Jan 25, 2013
1 parent c043064 commit 1ec3911
Showing 1 changed file with 10 additions and 18 deletions.
28 changes: 10 additions & 18 deletions net/ceph/osdmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,18 @@

char *ceph_osdmap_state_str(char *str, int len, int state)
{
int flag = 0;

if (!len)
goto done;

*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 {
return str;

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;
}

Expand Down

0 comments on commit 1ec3911

Please sign in to comment.