diff --git a/lib/webfuse/impl/operation/read.c b/lib/webfuse/impl/operation/read.c index ae69282..25754b8 100644 --- a/lib/webfuse/impl/operation/read.c +++ b/lib/webfuse/impl/operation/read.c @@ -14,32 +14,28 @@ // do not read chunks larger than 1 MByte #define WF_MAX_READ_LENGTH (1024 * 1024) -char * wf_impl_fill_buffer( - char const * data, +char * wf_impl_operation_read_transform( + char * data, size_t data_size, char const * format, size_t count, wf_status * status) { *status = WF_GOOD; - char * buffer = malloc(count); + char * buffer = data; if (0 < count) { if (0 == strcmp("identity", format)) { - if (count == data_size) - { - memcpy(buffer, data, count); - } - else + if (count != data_size) { *status = WF_BAD; } } else if (0 == strcmp("base64", format)) { - size_t result = wf_impl_base64_decode(data, data_size, (uint8_t *) buffer, count); + size_t result = wf_impl_base64_decode(data, data_size, (uint8_t *) data, count); if (result != count) { *status = WF_BAD; @@ -51,12 +47,6 @@ char * wf_impl_fill_buffer( } } - if (WF_GOOD != *status) - { - free(buffer); - buffer = NULL; - } - return buffer; } @@ -80,12 +70,12 @@ void wf_impl_operation_read_finished( (wf_impl_json_is_string(format_holder)) && (wf_impl_json_is_int(count_holder))) { - char const * const data = wf_impl_json_string_get(data_holder); + char * const data = (char*) wf_impl_json_string_get(data_holder); size_t const data_size = wf_impl_json_string_size(data_holder); char const * const format = wf_impl_json_string_get(format_holder); length = (size_t) wf_impl_json_int_get(count_holder); - buffer = wf_impl_fill_buffer(data, data_size, format, length, &status); + buffer = wf_impl_operation_read_transform(data, data_size, format, length, &status); } else { @@ -101,9 +91,6 @@ void wf_impl_operation_read_finished( { fuse_reply_err(request, ENOENT); } - - free(buffer); - } void wf_impl_operation_read( diff --git a/lib/webfuse/impl/operation/read.h b/lib/webfuse/impl/operation/read.h index ceadd09..20c4859 100644 --- a/lib/webfuse/impl/operation/read.h +++ b/lib/webfuse/impl/operation/read.h @@ -17,8 +17,8 @@ extern void wf_impl_operation_read( fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi); -extern char * wf_impl_fill_buffer( - char const * data, +extern char * wf_impl_operation_read_transform( + char * data, size_t data_size, char const * format, size_t count, diff --git a/test/webfuse/operation/test_read.cc b/test/webfuse/operation/test_read.cc index aaeb177..45f8573 100644 --- a/test/webfuse/operation/test_read.cc +++ b/test/webfuse/operation/test_read.cc @@ -84,53 +84,52 @@ TEST(wf_impl_operation_read, fail_rpc_null) TEST(wf_impl_operation_read, fill_buffer_identity) { wf_status status; - char * buffer = wf_impl_fill_buffer("brummni", 8, "identity", 8, &status); + char text[] = "brummni"; + char * buffer = wf_impl_operation_read_transform(text, 8, "identity", 8, &status); ASSERT_EQ(WF_GOOD, status); ASSERT_STREQ("brummni", buffer); - free(buffer); } TEST(wf_impl_operation_read, fill_buffer_identity_fail_inconsistent_size) { wf_status status; - char * buffer = wf_impl_fill_buffer("brummni", 8, "identity", 7, &status); + char text[] = "brummni"; + wf_impl_operation_read_transform(text, 8, "identity", 7, &status); ASSERT_NE(WF_GOOD, status); - ASSERT_EQ(nullptr, buffer); } TEST(wf_impl_operation_read, fill_buffer_base64) { wf_status status; - char * buffer = wf_impl_fill_buffer("YnJ1bW1uaQ==", 12, "base64", 7, &status); + char text[] = "YnJ1bW1uaQ=="; + char * buffer = wf_impl_operation_read_transform(text, 12, "base64", 7, &status); ASSERT_EQ(WF_GOOD, status); ASSERT_EQ(0, strncmp("brummni", buffer, 7)); - free(buffer); } TEST(wf_impl_operation_read, fill_buffer_base64_fail_invalid_data) { wf_status status; - char * buffer = wf_impl_fill_buffer("YnJ1bW1uaQ=A", 12, "base64", 8, &status); + char text[] = "YnJ1bW1uaQ=A"; + wf_impl_operation_read_transform(text, 12, "base64", 8, &status); ASSERT_NE(WF_GOOD, status); - ASSERT_EQ(nullptr, buffer); } TEST(wf_impl_operation_read, fill_buffer_empty) { wf_status status; - char * buffer = wf_impl_fill_buffer(nullptr, 0, "identity", 0, &status); + wf_impl_operation_read_transform(nullptr, 0, "identity", 0, &status); ASSERT_EQ(WF_GOOD, status); - free(buffer); } TEST(wf_impl_operation_read, fill_buffer_fail_invalid_format) { wf_status status; - char * buffer = wf_impl_fill_buffer("some data", 9, "unknown", 9, &status); + char text[] = "some data"; + wf_impl_operation_read_transform(text, 9, "unknown", 9, &status); ASSERT_NE(WF_GOOD, status); - ASSERT_EQ(nullptr, buffer); } TEST(wf_impl_operation_read, finished)