[OpenWrt-Devel] [PATCH 1/3] [rpcd][v2] file: add support for base64
Luka Perkov
luka at openwrt.org
Mon May 11 17:26:07 EDT 2015
Hi Felix,
On Mon, May 11, 2015 at 11:36:46AM +0200, Felix Fietkau wrote:
> On 2015-05-11 00:26, Luka Perkov wrote:
> > Signed-off-by: Luka Perkov <luka at openwrt.org>
> > ---
> > => changes in v2:
> >
> > Use new libubox base64 provided API.
> >
> > file.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
> > 1 file changed, 107 insertions(+), 11 deletions(-)
> >
> > diff --git a/file.c b/file.c
> > index 9c1b301..c3671bb 100644
> > --- a/file.c
> > +++ b/file.c
> > @@ -182,7 +206,17 @@ rpc_file_read(struct ubus_context *ctx, struct ubus_object *obj,
> >
> > blob_buf_init(&buf, 0);
> >
> > - wbuf = blobmsg_alloc_string_buffer(&buf, "data", s.st_size + 1);
> > + if (tb[RPC_F_RB_BASE64])
> > + base64 = blobmsg_get_bool(tb[RPC_F_RB_BASE64]);
> > +
> > + if (base64)
> > + {
> > + wbuf = blobmsg_alloc_string_buffer(&buf, "data", B64_ENCODE_LEN(s.st_size));
> > + }
> > + else
> > + {
> > + wbuf = blobmsg_alloc_string_buffer(&buf, "data", s.st_size + 1);
> > + }
> How about using the 'len' variable to avoid duplicating most of the code
> here.
Can you be more specific here please? I don't see how by using 'len' we
can reduce more code here.
> You can also get rid of unnecessary {} lines.
I have fixed this and all other comments below. New series will follow
shortly.
Luka
>
> > @@ -196,14 +230,35 @@ rpc_file_read(struct ubus_context *ctx, struct ubus_object *obj,
> > goto out;
> > }
> >
> > + if (base64)
> > + {
> > + uint8_t *data = calloc(B64_ENCODE_LEN(len), sizeof(uint8_t));
> > + if (!data)
> > + {
> > + rv = UBUS_STATUS_UNKNOWN_ERROR;
> > + goto out;
> > + }
> You can reduce allocation/copy size if you copy wbuf to a temporary
> buffer and then use it as output for b64_encode.
>
> > + len = b64_encode(wbuf, len, data, B64_ENCODE_LEN(len));
> > + if (len < 0)
> > + {
> > + free(data);
> > + rv = UBUS_STATUS_UNKNOWN_ERROR;
> > + goto out;
> > + }
> > +
> > + memcpy(wbuf, data, len);
> > + free(data);
> > + }
> > +
> > *(wbuf + len) = 0;
> > blobmsg_add_string_buffer(&buf);
> >
> > ubus_send_reply(ctx, req, buf.head);
> > - blob_buf_free(&buf);
> > rv = UBUS_STATUS_OK;
> >
> > out:
> > + blob_buf_free(&buf);
> > close(fd);
> > return rv;
> > }
> > @@ -222,18 +282,54 @@ rpc_file_write(struct ubus_context *ctx, struct ubus_object *obj,
> > if (!tb[RPC_F_RW_PATH] || !tb[RPC_F_RW_DATA])
> > return UBUS_STATUS_INVALID_ARGUMENT;
> >
> > + data = blobmsg_data(tb[RPC_F_RW_DATA]);
> > + data_len = blobmsg_data_len(tb[RPC_F_RW_DATA]) - 1;
> > +
> > if ((fd = open(blobmsg_data(tb[RPC_F_RW_PATH]), O_CREAT | O_TRUNC | O_WRONLY, 0666)) < 0)
> > return rpc_errno_status();
> >
> > - if (write(fd, blobmsg_data(tb[RPC_F_RW_DATA]), blobmsg_data_len(tb[RPC_F_RW_DATA])) < 0)
> > - return rpc_errno_status();
> > + if (tb[RPC_F_RW_BASE64])
> > + base64 = blobmsg_get_bool(tb[RPC_F_RW_BASE64]);
> > +
> > + if (base64)
> > + {
> > + rbuf_len = B64_DECODE_LEN(data_len);
> > + rbuf = calloc(rbuf_len, sizeof(uint8_t));
> > + if (!rbuf)
> > + {
> > + rv = UBUS_STATUS_UNKNOWN_ERROR;
> > + goto out;
> > + }
> > +
> > + rbuf_len = b64_decode(data, rbuf, rbuf_len);
> > + if (rbuf_len < 0)
> > + {
> > + rv = UBUS_STATUS_UNKNOWN_ERROR;
> > + goto out;
> > + }
> > + }
> > + else
> > + {
> > + rbuf = data;
> > + rbuf_len = data_len;
> > + }
> It is safe to overwrite the data area in this function, as long as you
> don't overstep attribute bounds. This means you can reuse the input
> buffer as output buffer for b64_decode and get rid of the temporary
> allocation.
>
> - Felix
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list