X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Ftypes%2Fstring.c;h=682bd76d116b158e7b9577308040facaec1acd65;hp=6a478abfd202072f3a022b068ff49db40c607d61;hb=01c76b246be85b5d9c8e99813950fb194c9f714f;hpb=847bf71a4af4770390a59e8ef8e1fdfca33687b9 diff --git a/formats/ctf/types/string.c b/formats/ctf/types/string.c index 6a478abf..682bd76d 100644 --- a/formats/ctf/types/string.c +++ b/formats/ctf/types/string.c @@ -3,7 +3,9 @@ * * Strings read/write functions. * - * Copyright 2010 - Mathieu Desnoyers + * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation + * + * Author: Mathieu Desnoyers * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,7 +23,7 @@ #include /* C99 limits */ #include -void ctf_string_read(struct stream_pos *ppos, struct definition *definition) +int ctf_string_read(struct stream_pos *ppos, struct definition *definition) { struct definition_string *string_definition = container_of(definition, struct definition_string, p); @@ -29,11 +31,23 @@ void ctf_string_read(struct stream_pos *ppos, struct definition *definition) string_definition->declaration; struct ctf_stream_pos *pos = ctf_pos(ppos); size_t len; + ssize_t max_len; char *srcaddr; ctf_align_pos(pos, string_declaration->p.alignment); + srcaddr = ctf_get_pos_addr(pos); - len = strlen(srcaddr) + 1; + if (pos->offset == EOF) + return -EFAULT; + /* Not counting \0 */ + max_len = pos->packet_size - pos->offset - 1; + if (max_len < 0) + return -EFAULT; + len = strnlen(srcaddr, max_len) + 1; /* Add \0 */ + /* Truncated string, unexpected. Trace probably corrupted. */ + if (srcaddr[len - 1] != '\0') + return -EFAULT; + if (string_definition->alloc_len < len) { string_definition->value = g_realloc(string_definition->value, len); @@ -43,9 +57,10 @@ void ctf_string_read(struct stream_pos *ppos, struct definition *definition) memcpy(string_definition->value, srcaddr, len); string_definition->len = len; ctf_move_pos(pos, len * CHAR_BIT); + return 0; } -void ctf_string_write(struct stream_pos *ppos, +int ctf_string_write(struct stream_pos *ppos, struct definition *definition) { struct definition_string *string_definition = @@ -59,10 +74,15 @@ void ctf_string_write(struct stream_pos *ppos, ctf_align_pos(pos, string_declaration->p.alignment); assert(string_definition->value != NULL); len = string_definition->len; + + if (!ctf_pos_access_ok(pos, len)) + return -EFAULT; + if (pos->dummy) goto end; destaddr = ctf_get_pos_addr(pos); memcpy(destaddr, string_definition->value, len); end: ctf_move_pos(pos, len * CHAR_BIT); + return 0; }