On 1/3/20 1:46 AM, Petr Štetiar wrote: > It was quite common to see following error during sysupgrade on serial > console: > > Failed to parse JSON: 4 > > This is happening due to the fact, that validate_firmware_image_call > fork()s then waits in blocking read() for the input from the child > process, but child finishes its tasks and exits, thus emitting SIGCHLD > signal which then leads to the interruption of the blocking read() in > the parent process with EINTR error. > > It seems like the recent fixes in the libubox library, particulary in > the jshn sub-component (which empowers json_dump used in the shell > script executed by the child process) made the execution somehow faster, > thus exposing this racy behaviour in the validate_firmware_image_call at > least on RPi-4 (Cortex-A72) target. > > So this patch fixes this issue by checking the read() return value and > retrying the read() if interrupted due to the EINTR error. > > Ref: > http://lists.infradead.org/pipermail/openwrt-devel/2020-January/020994.html > Fixes: e990e215e8a3 ("system: add "validate_firmware_image" ubus method") > Cc: Rafał Miłecki <[email protected]> > Reported-by: Petr Novák <[email protected]> > Signed-off-by: Petr Štetiar <[email protected]> > ---
Reviewed-by: Hauke Mehrtens <[email protected]> > system.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/system.c b/system.c > index 65d3f09b7fb6..5cd88e0d8227 100644 > --- a/system.c > +++ b/system.c > @@ -466,6 +466,9 @@ static int validate_firmware_image_call(const char *file) > > blob_buf_init(&b, 0); > while ((len = read(fds[0], buf, sizeof(buf)))) { > + if (len < 0 && errno == EINTR) > + continue; > + > jsobj = json_tokener_parse_ex(tok, buf, len); > > if (json_tokener_get_error(tok) == json_tokener_success) > > _______________________________________________ > openwrt-devel mailing list > [email protected] > https://lists.openwrt.org/mailman/listinfo/openwrt-devel >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
