From: Gerhard Sittig Date: Sat, 12 May 2018 09:39:38 +0000 (+0200) Subject: input: pass larger buffer to auto format detection X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=0dabb880af49c5eb54e22668d3477435b370e763 input: pass larger buffer to auto format detection The previous implementation already was inconsistent (used to allocate 255 bytes and claimed that 128 bytes were sufficient). While existing formats already required more than a few bytes of input (regular VCD files' header sections exceed 255 bytes length). Increase the buffer size that gets passed to input modules' match method. Use 4MiB for consistency with other locations. Do not enforce a minimum size, as there are valid input files which are shorter than 128 bytes. Auto-detection failed on those. This addresses part of bug #1200. --- diff --git a/src/input/input.c b/src/input/input.c index 48660d37..ee19d661 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -29,6 +29,8 @@ #define LOG_PREFIX "input" /** @endcond */ +#define CHUNK_SIZE (4 * 1024 * 1024) + /** * @file * @@ -338,8 +340,10 @@ static gboolean check_required_metadata(const uint8_t *metadata, uint8_t *avail) * Try to find an input module that can parse the given buffer. * * The buffer must contain enough of the beginning of the file for - * the input modules to find a match. This is format-dependent, but - * 128 bytes is normally enough. + * the input modules to find a match. This is format-dependent. When + * magic strings get checked, 128 bytes normally could be enough. Note + * that some formats try to parse larger header sections, and benefit + * from seeing a larger scope. * * If an input module is found, an instance is created into *in. * Otherwise, *in contains NULL. When multiple input moduless claim @@ -462,11 +466,9 @@ SR_API int sr_input_scan_file(const char *filename, const struct sr_input **in) fclose(stream); return SR_ERR; } - /* This actually allocates 256 bytes to allow for NUL termination. */ - header = g_string_sized_new(255); + header = g_string_sized_new(CHUNK_SIZE); count = fread(header->str, 1, header->allocated_len - 1, stream); - - if (count != header->allocated_len - 1 && ferror(stream)) { + if (count < 1 || ferror(stream)) { sr_err("Failed to read %s: %s", filename, g_strerror(errno)); fclose(stream); g_string_free(header, TRUE);