[FFmpeg-devel] [PATCH v2 1/1] avformat: Add IPFS protocol support.
Tomas Härdin
tjoppen at acc.umu.se
Wed Feb 2 15:21:23 EET 2022
tis 2022-02-01 klockan 22:58 +0100 skrev Mark Gaiser:
>
> +typedef struct Context {
> + AVClass *class;
> + URLContext *inner;
> + char *gateway;
Is there not a maximum length that an HTTP URL can be? At least without
query parameters. That way you avoid dynamic allocations. You'd have to
separate the AVOption from such a buffer in that case, but I think you
have to anyway.
> + if (!ipfs_full_data_folder) {
> + av_log(h, AV_LOG_DEBUG, "$IPFS_PATH is empty.\n");
> +
> + // Try via the home folder.
> + home_folder = getenv("HOME");
> + ipfs_full_data_folder = av_asprintf("%s/.ipfs/",
> home_folder);
Memory leak. This applies to most if not all av_asprintf() calls.
> +
> + // Stat the folder. It should exist in a default IPFS setup
> when run as local user.
> +#ifndef _WIN32
> + stat_ret = stat(ipfs_full_data_folder, &st);
> +#else
> + stat_ret = win32_stat(ipfs_full_data_folder, &st);
> +#endif
Why bother with stat() when you can just check whether fopen()
succeeded?
> +// For now just makes sure that the gateway ends in url we expect.
> Like http://localhost:8080/.
> +// Explicitly with the traling slash.
> +static void ff_sanitize_ipfs_gateway(URLContext *h)
> +{
> + Context *c = h->priv_data;
> + const char last_gateway_char = c->gateway[strlen(c->gateway) -
> 1];
Can strlen(c->gateway) be zero here?
> +static int translate_ipfs_to_http(URLContext *h, const char *uri,
> int flags, AVDictionary **options)
> +{
> + const char *ipfs_cid;
> + const char *protocol_path_suffix = "ipfs/";
> + char *fulluri;
> + int ret;
> + Context *c = h->priv_data;
> + int is_ipfs = (av_strstart(uri, "ipfs://", &ipfs_cid) ||
> av_strstart(uri, "ipfs:", &ipfs_cid));
> + int is_ipns = (av_strstart(uri, "ipns://", &ipfs_cid) ||
> av_strstart(uri, "ipns:", &ipfs_cid));
https://docs.ipfs.io/concepts/ipfs-gateway/ claims ipfs:// is the
canonical form. No mentioned is made of any ipfs:{CID} form. Incorrect
URLs should be rejected, not silently patched.
Also what happens if c->gateway is "ipfs://[...]"? Infinite recursion?
/Tomas
More information about the ffmpeg-devel
mailing list