On 29/10/2020 10:51, Leo Yan wrote: > Hi Andre, > > On Thu, Oct 29, 2020 at 10:23:39AM +0000, Andr� Przywara wrote: > > [...] > >>> +static int arm_spe_pkt_snprintf(int *err, char **buf_p, size_t *blen, >>> + const char *fmt, ...) >>> +{ >>> + va_list ap; >>> + int ret; >>> + >>> + va_start(ap, fmt); >>> + ret = vsnprintf(*buf_p, *blen, fmt, ap); >>> + va_end(ap); >>> + >>> + if (ret < 0) { >>> + if (err && !*err) >>> + *err = ret; >>> + } else { >>> + *buf_p += ret; >>> + *blen -= ret; >>> + } >>> + >>> + return ret; >>> +} >> >> So this now implements the old behaviour of ignoring previous errors, in >> all cases, since we don't check for errors and bail out in the callers. >> >> If you simply check for validity of err and for it being 0 before >> proceeding with the va_start() above, this should be fixed. > > I think you are suggesting below code, could you take a look for it > before I proceed to respin new patch?> > static int arm_spe_pkt_snprintf(int *err, char **buf_p, size_t *blen, > const char *fmt, ...) > { > va_list ap; > int ret; > > /* Bail out if any error occurred */ > if (err && *err) > return *err; > > va_start(ap, fmt); > ret = vsnprintf(*buf_p, *blen, fmt, ap); > va_end(ap); > > if (ret < 0) { > if (err && !*err) > *err = ret; > } else { > *buf_p += ret; > *blen -= ret; > } > > return ret; > }
Yes, this is what I had in mind. Cheers, Andre